云镜收藏

稍后阅读

清单保存在当前浏览器,方便下次回来继续阅读。

清单还是空的

在笔记卡片或正文页点击“加入稍后阅读”即可收藏。

卷0 · 基础篇

0.1 数学基础:线性代数 · 概率 · 优化(深度学习视角三合一)

约 9 分钟阅读
全书目录

展开本章目录与同卷章节1. 为什么学这三样2. 线性代数2.1 向量与内积:相似度的度量2.2 矩阵乘法:三种视角2.3 范数与距离2.4 特征分解与 SVD:低秩的世界2.5 矩阵求导与链式法则3. 概率与信息论3.1 速通核心概念3.2 极大似然:训练到底在干嘛3.3 熵、交叉熵、KL 散度3.4 softmax 与温度4. 优化4.1 损失曲面的高维直觉4.2 从 SGD 到 AdamW4.3 学习率:最重要的单一超参4.4 Batch size 与梯度累积4.5 过拟合与正则化4.6 训练曲线诊断速查表(先背下来)5. 自测十题(答案提示在括号里)6. 动手作业图解 · 数学地图与一次手算7. 延伸资源同卷章节0.1 数学基础:线性代数 · 概率 · 优化(深度学习视角三合一)0.2 Python 与 PyTorch 实战:从装环境到手写训练循环0.3 神经网络与反向传播:从零实现(micrograd 路线)0.4 训练工程常识:混合精度、断点续训、调试与监控0.5 Git / Linux / 远程开发生存包

本章目标:不是把你变成数学系学生,而是把后续所有章节会用到的数学一次配齐,并且每个概念都告诉你它在模型里的哪个位置出现。学完标准:能看懂后续所有章节的公式,能自己推导 softmax+交叉熵 的梯度。

1. 为什么学这三样

深度学习里,数学只有三个角色:

数学分支角色一句话
线性代数数据的语言图像、文本、特征全都是矩阵/张量,模型就是一连串矩阵变换
概率与信息论学习的目标“训练”= 让模型输出的概率分布逼近真实分布
优化学习的发生机制沿着梯度下降,把目标变小

传统数学课按”定义→定理→证明”推进,我们反过来:先看它在模型里的用法,再回头看定义。


2. 线性代数

2.1 向量与内积:相似度的度量

向量是一列数。内积(点积)a⋅b=∑iaibi\mathbf{a} \cdot \mathbf{b} = \sum_i a_i b_i,几何意义是”对齐程度”:方向越一致,内积越大。

为什么这是最重要的概念:整个多模态大模型都在算内积。

  • CLIP 把图像和文本各编码成一个向量,用内积衡量”图文是否匹配”;
  • Attention 的核心就是 Query 和 Key 的内积(QK⊤QK^\top),内积大 = “这个位置值得注意”;
  • 向量数据库检索图片 = 查询向量与百万张图的特征向量算内积。

2.2 矩阵乘法:三种视角

C=ABC = AB(AA 是 m×nm\times n,BB 是 n×pn\times p)可以同时理解为:

  1. 变换的复合:AA 对空间做一次线性变换,BB 再做一次。神经网络的每一层就是一次变换,100 层网络 = 100 次复合。
  2. 批量内积:CC 的第 (i,j)(i,j) 元 = AA 的第 ii 行与 BB 的第 jj 列的内积。Attention 矩阵 QK⊤QK^\top 就是这个视角。
  3. 加权求和:CC 的每一列是 AA 的列的线性组合,组合权重来自 BB。全连接层 y=Wxy = Wx 就是”用 WW 的行作为权重,混合输入特征”。

三种视角在调试时各有用处。看到矩阵乘法报 shape 错误,先问自己用的是哪个视角。

2.3 范数与距离

  • L2L_2 范数 ∥x∥2=∑ixi2\|\mathbf{x}\|_2 = \sqrt{\sum_i x_i^2}:欧氏长度,默认选项。
  • L1L_1 范数 ∑i∣xi∣\sum_i |x_i|:对离群值不敏感,稀疏化时用。

常见用法:权重衰减(weight decay)约束的是权重的 L2L_2 范数;归一化(normalize)把向量除以自己的 L2L_2 范数后,内积就变成了余弦相似度——CLIP 检索、向量库检索都这么做。

2.4 特征分解与 SVD:低秩的世界

SVD(奇异值分解)说:任何矩阵 AA 都可以拆成 A=UΣV⊤A = U\Sigma V^\top,其中 Σ\Sigma 是对角阵,对角元(奇异值)从大到小排。保留前 rr 个最大奇异值,就能用低秩矩阵近似 AA。

这在多模态大模型里的出现位置:

  • LoRA:微调大模型时不直接更新权重矩阵 WW,而是学一个低秩增量 ΔW=BA\Delta W = BA(BB 是 d×rd\times r,AA 是 r×kr\times k,r≪d,kr \ll d,k)。理论基础就是”微调带来的权重变化近似低秩”。你在路线阶段2就会用它。
  • 图像压缩、PCA 降维、推荐系统,本质都是”砍掉小的奇异值”。

2.5 矩阵求导与链式法则

深度学习的”学习”= 对数百万个参数求梯度,然后沿梯度反方向走。你需要的矩阵求导其实只有一条规则:

链式法则:y=f(g(x))y = f(g(x)),则 dydx=dydg⋅dgdx\frac{dy}{dx} = \frac{dy}{dg}\cdot\frac{dg}{dx}。多变量的情况就是把雅可比矩阵相乘——这就是”反向传播”的全部数学。

必会推导:softmax + 交叉熵的梯度 = 预测 − 标签

softmax 把任意分数向量 z\mathbf{z} 变成概率分布:softmax(z)i=ezi∑jezj\text{softmax}(\mathbf{z})_i = \frac{e^{z_i}}{\sum_j e^{z_j}}。 交叉熵损失:L=−∑itilog⁡piL = -\sum_i t_i \log p_i,其中 p=softmax(z)\mathbf{p} = \text{softmax}(\mathbf{z}),t\mathbf{t} 是 one-hot 标签。

直接对 ziz_i 求导(过程略,建议自己推一遍,用到的只有链式法则和 dlog⁡xdx=1/x\frac{d\log x}{dx} = 1/x),结论:

∂L∂z=p−t\frac{\partial L}{\partial \mathbf{z}} = \mathbf{p} - \mathbf{t}

为什么这个结论是深度学习里最重要的一行公式:梯度恰好是”预测概率分布减去真实分布”。模型错得越离谱,梯度越大——学习的方向自动就是”把概率从错误的类挪到正确的类”。语言模型预测下一个 token、VLM 回答问题,输出的都是这个形式。你以后看到 loss = cross_entropy(logits, labels),脑子里应该浮现 p − t。


3. 概率与信息论

3.1 速通核心概念

  • 随机变量与分布:图像分类模型输出 P(猫),P(狗),...P(\text{猫}), P(\text{狗}), ...,就是一个分类分布(categorical distribution)。
  • 条件概率 P(y∣x)P(y|x):给定输入图像 xx,输出标签 yy 的概率。监督学习学到的就是这个——所以分类模型叫”判别式”,生成模型学 P(x)P(x) 或 P(x∣文本)P(x|\text{文本}),叫”生成式”。扩散模型和 GPT 都是生成式。
  • 期望与方差:随机初始化下 loss 的波动、batch 之间的梯度噪声,都用它们来描述。

3.2 极大似然:训练到底在干嘛

给定数据 {x1,...,xN}\{x_1,...,x_N\} 和带参数 θ\theta 的模型 Pθ(x)P_\theta(x),极大似然估计(MLE)就是选 θ\theta 让数据出现的概率最大:

θ∗=arg⁡max⁡θ∏iPθ(xi)⟺arg⁡min⁡θ∑i−log⁡Pθ(xi)\theta^* = \arg\max_\theta \prod_i P_\theta(x_i) \quad\Longleftrightarrow\quad \arg\min_\theta \sum_i -\log P_\theta(x_i)

右边就是”最小化负对数似然(NLL)“——你训练过的每一个模型的损失函数,几乎都是它换个名字:

  • 分类任务的交叉熵 = NLL;
  • 语言模型”预测下一个 token”= 对下一个 token 的 NLL;
  • 扩散模型预测噪声的 MSE = 高斯假设下 NLL 的简化版。

建立这个等式感:以后看到任何奇怪的 loss,第一反应问”它是谁的负对数似然”。

3.3 熵、交叉熵、KL 散度

  • 熵 H(p)=−∑ipilog⁡piH(p) = -\sum_i p_i \log p_i:分布的不确定性。均匀分布熵最大。
  • 交叉熵 H(p,q)=−∑ipilog⁡qiH(p, q) = -\sum_i p_i \log q_i:用 qq 编码真实分布 pp 的代价。训练时 pp 是数据/标签,qq 是模型输出。
  • KL 散度 DKL(p∥q)=H(p,q)−H(p)D_{KL}(p\|q) = H(p,q) - H(p):两个分布的差异。pp 固定时,最小化交叉熵 = 最小化 KL。

出现位置:

  • 知识蒸馏:让学生的输出分布逼近老师的(KL);
  • DPO / RLHF:约束微调后的模型别偏离原模型太远(KL 惩罚);
  • VAE:后验分布逼近标准正态(KL)。

一句话:交叉熵管”学什么”,KL 管”别学歪”。

3.4 softmax 与温度

softmax(z/T)\text{softmax}(z/T) 里的 TT 是温度:T→0T \to 0 逼近取最大值(独断),TT 大则分布平坦(犹豫)。出现位置:LLM 采样时的 top-p/top-k 温度参数;蒸馏时高温让老师的”暗知识”(次优选项的相对概率)显现。


4. 优化

4.1 损失曲面的高维直觉

参数量上亿的模型,损失曲面在高维空间里。高维空间的重要事实:真正的”局部极小值”很少,绝大多数驻点是鞍点——某些方向向上、某些方向向下,总能找到出路。所以不用担心”卡在局部最优”,实际问题是”下降太慢”和”震荡”。

4.2 从 SGD 到 AdamW

  • SGD:沿当前 batch 的梯度走一小步。问题:不同参数的梯度尺度差异大,一个学习率伺候不了一堆参数。
  • Momentum:积累历史梯度方向,冲过小沟坎。
  • Adam:为每个参数自适应缩放步长(除以梯度的一阶/二阶动量)。现代默认。
  • AdamW:修复了 Adam 中 weight decay 与自适应步长耦合的 bug,把权重衰减解耦出来。现在所有 LLM/VLM 训练默认都是 AdamW,你只需要记住这个名字和”decay 系数一般 0.01~0.1”。

4.3 学习率:最重要的单一超参

现代默认配方:warmup + cosine decay。前 1~5% 步数从 0 线性升到峰值(大模型早期梯度方向不可信,直接大步会崩),然后余弦缓降到接近 0。

经验参考值:从零训小模型峰值 1e-3 量级;微调 7B 用 LoRA 峰值 1e-4 ~ 2e-4;全参数微调大模型 1e-5 量级。微调的学习率几乎总比预训练小 10~100 倍——别把人家学好的东西一脚踢翻。

4.4 Batch size 与梯度累积

大 batch 梯度更稳但单步更贵,且一般认为大 batch 要配大学习率(线性缩放法则,够用即可不必深究)。显存不够时用梯度累积:小 batch 算多次梯度,攒够了再更新一步,等效于大 batch。LoRA 微调 7B 时你几乎一定会用到它。

4.5 过拟合与正则化

  • 现象:训练 loss 降、验证 loss 升。数据少 + 模型大 + 训练久 = 必然。
  • 手段按优先级:更多/更好的数据 > 数据增强 > weight decay/dropout > 早停。
  • 微调场景的特殊性:数据只有几千条时,与其调正则,不如减 epoch、降学习率、用 LoRA。

4.6 训练曲线诊断速查表(先背下来)

症状最可能原因处置
loss 一开始就 NaN学习率过大 / 数据有坏样本 / fp16 溢出降 lr,跳数数据,换 bf16
loss 降到 0.69 附近卡住(二分类)模型输出对称、学了个寂寞:标签错了或数据无信号查标签对齐
训练 loss 降、验证 loss 升过拟合减 epoch、加数据、加正则
loss 剧烈锯齿batch 太小或 lr 太大梯度累积、降 lr
loss 平台期很久lr 太小 / warmup 太长 / 模型容量不够升 lr、查瓶颈

5. 自测十题(答案提示在括号里)

  1. 两个单位向量的内积最大是多少?此时几何关系是什么?(1;同向)
  2. 为什么归一化后内积 = 余弦相似度?(∥a∥=∥b∥=1\|\mathbf{a}\|=\|\mathbf{b}\|=1 时 a⋅b=cos⁡θ\mathbf{a}\cdot\mathbf{b}=\cos\theta)
  3. 一个 4096×40964096\times 4096 的权重矩阵,LoRA 取 r=16r=16,参数量从多少降到多少?(16.8M → 131K,两个矩阵 4096×16+16×40964096\times16 + 16\times4096)
  4. QK⊤QK^\top 里,QQ 的一行和 KK 的一行分别是什么?(一个 query 向量、一个 key 向量;结果是注意力分数)
  5. 为什么交叉熵可以写成”负对数似然”?(对 one-hot 标签,−∑tilog⁡pi=−log⁡py-\sum t_i\log p_i = -\log p_y,即真实类的对数概率取负)
  6. 熵为 0 的分布是什么?(one-hot,完全确定)
  7. KL(p‖q) 和 KL(q‖p) 一样吗?不对称会带来什么行为差异?(不一样;前者在 q 概率低处惩罚重——“宁可信其有”,后者在 p 概率低处惩罚重——“宁可漏掉”。蒸馏里两种选择行为不同,是活跃的研究细节)
  8. AdamW 和 Adam 的区别一句话?(weight decay 从梯度自适应缩放里解耦出来)
  9. 微调时学习率应该比预训练大还是小?为什么?(小;预训练权重是好解,只做局部修整)
  10. 梯度累积解决什么问题?代价是什么?(显存不够模拟大 batch;代价是单位样本耗时几乎不变但每步更慢、BN/LN 统计与真大 batch 有细微差异)

6. 动手作业

  1. 用 NumPy 手写 softmax 和交叉熵,并用第 2.5 节结论 ∇zL=p−t\nabla_z L = p - t 写出梯度函数,再数值验证(随机小扰动下 (L(z+ϵ)−L(z−ϵ))/2ϵ≈∇zL(L(z+\epsilon)-L(z-\epsilon))/2\epsilon \approx \nabla_z L)。
  2. 用 NumPy 对一个随机 100×100100\times 100 矩阵做 SVD,分别保留前 5/20/50 个奇异值重构,算重构误差随秩的下降曲线。这就是”LoRA 为什么可行”的直观感受。

图解 · 数学地图与一次手算

flowchart LR
  A["线性代数:数据的语言"] --> A1["内积 → CLIP 相似度 / 检索"]
  A --> A2["QKᵀ → Attention 打分"]
  A --> A3["SVD / 低秩 → LoRA"]
  B["概率与信息论:学习的目标"] --> B1["交叉熵 = 负对数似然<br>一切训练目标"]
  B --> B2["KL 散度 → DPO / 蒸馏的缰绳"]
  B --> B3["softmax 温度 → 采样与蒸馏"]
  C["优化:学习的发生机制"] --> C1["AdamW + warmup/cosine<br>所有现代训练"]
  C --> C2["6ND → 任何实验的算力预算"]

案例:手算一次 softmax + 交叉熵

设三类 logits z=[2.0, 0.0, −1.0]z = [2.0,\ 0.0,\ -1.0],真实类为第 0 类(t=[1,0,0]t=[1,0,0])。

第一步 softmax:e2=7.389, e0=1, e−1=0.368e^2=7.389,\ e^0=1,\ e^{-1}=0.368,总和 8.757, 故 p=[0.844, 0.114, 0.042]p = [0.844,\ 0.114,\ 0.042]。

第二步 loss:L=−ln⁡0.844=0.170L = -\ln 0.844 = 0.170。

第三步梯度:∇zL=p−t=[−0.156, +0.114, +0.042]\nabla_z L = p - t = [-0.156,\ +0.114,\ +0.042]。

读出三件事:① 正确类的梯度为负——下一步要抬高它的 logit;② 两个错误类按”谁错得离谱谁多分”,分摊了挪走概率的任务;③ 所有分量之和为 0(概率守恒)。以后你在任何训练日志里看到交叉熵,背后都是这三个数字在动。

7. 延伸资源

  • 3Blue1Brown《线性代数的本质》《微积分的本质》(B 站官方翻译版)——直觉构建第一名
  • 《Mathematics for Machine Learning》(Deisenroth 等,免费电子版)——按需查阅,不必通读
  • Karpathy《The spelled-out intro to neural networks》——把本章数学第一次和代码接起来