直觉理解
深度学习里几乎所有数据都是数字组成的数组:一个词是一个向量,一句话是一个矩阵,一批句子是一个三维张量。神经网络的一层,本质上就是「把输入向量乘上一个矩阵,再加一个偏置」。所以学线性代数,重点不是解方程组,而是理解向量表示事物、矩阵变换向量这两件事,以及它们在代码里的形状。
定义与公式
向量与矩阵
- 向量 是 个实数排成的一列,可以看作 维空间中的一个点或一个方向。
- 矩阵 有 行 列。
- 张量是更高维的数组,例如形状为
(batch, seq_len, d_model)的三维张量。
矩阵乘法
与 相乘,得到 :
记住形状规则:前一个矩阵的列数必须等于后一个矩阵的行数,结果是 (m, k) @ (k, n) → (m, n)。写模型代码时,大部分报错都是形状对不上。
线性层就是一次矩阵乘法:,把 维输入映射到 维输出。
转置
转置把行和列互换:,形状从 变成 。常用性质 。
点积与相似度
两个同维向量的点积:
在向量长度固定时,方向越一致,点积越大;长度变化也会影响点积。对于两个非零向量,把点积除以它们的长度,就得到余弦相似度 ,取值在 ,只看方向、不看长度。注意力机制里的 ,就是一次性算出所有查询与所有键之间的点积。
范数
范数衡量向量的「长度」:
- L2 范数:,即欧氏距离意义下的长度。
- L1 范数:。
范数用于归一化向量、正则化权重(见过拟合与正则化)和梯度裁剪。
批量计算与广播
GPU 擅长一次算很多个矩阵乘法。把一批输入堆成矩阵 ,一次 就算完整批数据。形状兼容的张量相加时,框架会把长度为 1 或缺失的维度按广播规则逻辑扩展,例如给每一行都加上同一个偏置向量;这通常不需要先实际复制一份扩展后的输入。
特征值、SVD 与低秩
- 若非零向量 满足 ,则 是方阵 的特征向量, 是特征值:对实特征向量, 在这个方向上只做伸缩,负特征值还会反转方向。
- 奇异值分解(SVD)适用于任意矩阵:,其中 、 是正交矩阵, 的对角线上是从大到小排列的奇异值。
- 只保留最大的 个奇异值,得到的是在 Frobenius 范数或谱范数下最佳的秩不超过 的近似。一个 的矩阵 若秩不超过 ,就可以写成 ,其中 、。只有当 时,这种参数化才减少参数量。
低秩的思想是 LoRA 与低秩分解压缩的数学基础:假设微调时权重的变化量 是低秩的,只训练两个小矩阵即可。
代码示例
import torch
x = torch.randn(4, 8) # 一批 4 个样本,每个 8 维
W = torch.randn(16, 8) # 线性层权重:8 维 → 16 维
b = torch.randn(16)
y = x @ W.T + b # (4, 8) @ (8, 16) + (16,) 广播 → (4, 16)
print(y.shape) # torch.Size([4, 16])
a, c = torch.randn(8), torch.randn(8)
cos = (a @ c) / (a.norm() * c.norm())
print(torch.allclose(cos, torch.nn.functional.cosine_similarity(a, c, dim=0))) # True
# 用 SVD 做秩 2 近似
M = torch.randn(6, 2) @ torch.randn(2, 5) # 构造一个秩为 2 的矩阵
U, S, Vh = torch.linalg.svd(M)
M2 = U[:, :2] @ torch.diag(S[:2]) @ Vh[:2]
print(torch.allclose(M, M2, atol=1e-5)) # True:两个奇异值就能完整还原在 AI 中的作用
- 神经网络的每一层都是矩阵乘法加非线性,见神经网络与反向传播。
- 词向量与检索依赖点积和余弦相似度,见词嵌入和嵌入与检索模型。
- 注意力的核心是 与加权求和,见注意力机制。
- 低秩近似支撑了 LoRA(见指令微调与偏好优化)和剪枝与低秩分解。
- 大矩阵乘法怎样拆到多张 GPU 上,是张量并行的核心,见分布式训练。
参考资料
相关
- 微积分与梯度:对矩阵运算求导,是反向传播的基础。
- PyTorch张量与自动求导:张量的形状、广播与运算在代码中的写法。
- Python与NumPy