直觉理解

深度学习里几乎所有数据都是数字组成的数组:一个词是一个向量,一句话是一个矩阵,一批句子是一个三维张量。神经网络的一层,本质上就是「把输入向量乘上一个矩阵,再加一个偏置」。所以学线性代数,重点不是解方程组,而是理解向量表示事物、矩阵变换向量这两件事,以及它们在代码里的形状。

定义与公式

向量与矩阵

  • 向量 是 个实数排成的一列,可以看作 维空间中的一个点或一个方向。
  • 矩阵 有 行 列。
  • 张量是更高维的数组,例如形状为 (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 中的作用

参考资料

相关