4、线性代数基础:标量、向量、矩阵与张量,矩阵运算与性质,特征值与特征向量,SVD分解简介
说实话,很多搞深度学习的朋友一看到线性代数就头疼。我当年也一样,觉得这东西离实际工程太远了。直到我第一次调模型调不动,才发现——嗯,不懂线性代数,你连梯度怎么传的都搞不清楚。
这一章,咱们就把这些基础概念捋一遍。你放心,我不会堆公式,我会告诉你每个东西在深度学习里到底干嘛用的。
4.1 标量、向量、矩阵与张量
先说说这几个东西的区别。说白了,就是数据的“维度”不一样。
- 标量:就是一个数。比如学习率 0.001,这就是个标量。
- 向量:一列数。比如一个样本的特征,[身高, 体重, 年龄],这就是个三维向量。
- 矩阵:二维表格。比如 100 个样本,每个样本 3 个特征,那就是 100×3 的矩阵。
- 张量:三维及以上。比如一批彩色图片,32 张、每张 64×64 像素、RGB 三个通道,那就是 32×64×64×3 的张量。
重点来了:在 PyTorch 或 TensorFlow 里,所有数据都是张量。标量是 0 维张量,向量是 1 维,矩阵是 2 维。你记住这个就行。
我个人习惯把张量想象成一个“多维盒子”。你往里面塞数据,维度越高,盒子越复杂。但本质上,操作都是一样的。
4.2 矩阵运算与性质
矩阵运算里,最常用的就几个:加法、乘法、转置。我重点说说矩阵乘法,因为这是神经网络的核心。
矩阵乘法有个硬性要求:左矩阵的列数必须等于右矩阵的行数。比如 A 是 3×4,B 是 4×5,那结果就是 3×5。这个规则,你写代码的时候经常会被它坑到。
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵乘法
C = np.dot(A, B)
print(C)
# 输出:
# [[19 22]
# [43 50]]
我的小技巧:调试的时候,先用小矩阵手动算一遍,再跟代码结果对比。我遇到过太多次维度不匹配的错误了,都是这么排查出来的。
矩阵还有几个重要性质:
- 结合律:(AB)C = A(BC)。这个在计算图里很有用。
- 分配律:A(B+C) = AB + AC。
- 不满足交换律:AB 一般不等于 BA。这个要特别注意,我见过有人写代码时把顺序搞反了,结果模型怎么训都不收敛。
4.3 特征值与特征向量
特征值和特征向量,听起来很抽象。但你想想看,一个矩阵乘以一个向量,本质上是对这个向量做“拉伸”或“旋转”。
特征向量就是那些“只被拉伸、不被旋转”的特殊向量。特征值就是拉伸的倍数。
为什么深度学习里用得到? 比如主成分分析(PCA)做降维,就是找数据协方差矩阵的特征向量。我做过一个图像压缩的项目,就是用 PCA 把 256 维的特征降到 64 维,效果还不错。
import numpy as np
A = np.array([[4, 2], [1, 3]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)
输出结果里,特征值告诉你每个方向上的“重要性”。特征值越大,那个方向上的信息越关键。
避坑指南:我曾经在计算协方差矩阵的特征值时,忘了先对数据做标准化。结果特征值相差好几个数量级,导致降维效果很差。记住,先标准化,再算特征值。
4.4 SVD分解简介
SVD(奇异值分解)是线性代数里的大杀器。它能把任意一个矩阵分解成三个矩阵的乘积:
A = U Σ VT
其中 U 和 V 是正交矩阵,Σ 是对角矩阵,对角线上的值就是奇异值。
你想想看,这个分解有什么用?
- 数据压缩:只保留最大的几个奇异值,就能近似还原原矩阵。
- 降维:跟 PCA 本质上是等价的。
- 推荐系统:Netflix 的推荐算法早期就用 SVD 做矩阵分解。
import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
U, S, Vt = np.linalg.svd(A)
print("U 矩阵:\n", U)
print("奇异值:", S)
print("V 转置:\n", Vt)
# 用前两个奇异值近似还原
k = 2
A_approx = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
print("近似矩阵:\n", A_approx)
我的经验:SVD 在图像压缩里特别好用。我曾经把一张 1024×1024 的灰度图做 SVD,只保留前 50 个奇异值,图片质量几乎没变,但存储空间从 1MB 降到了 200KB。你试试看,效果很惊艳。
好了,这一章的内容就这些。线性代数看起来公式多,但你在深度学习里真正高频用到的,就是矩阵乘法、特征分解和 SVD。把这些搞明白,后面看论文、调模型都会轻松很多。
下一章,咱们聊聊概率论基础。那个东西在模型评估和损失函数设计里特别重要,到时候见。