模块六 · 深度学习进阶:损失、优化、正则化
模块四只说了"反向传播+梯度下降"。但真实训练里,用什么损失、用哪个优化器、怎么防止过拟合、怎么初始化、怎么调学习率,每一步都是坑。这一模块把这些"炼丹手册"讲透。
上一模块补完经典 ML,这一模块回答一个实战问题:神经网络为什么训得动、又怎么训得稳。为什么需要?你会发现 loss 选不对、学习率太大、不初始化、不做正则化,模型根本出不来。学完你手里就有一本"炼丹手册"。下一模块深入 Transformer 和大模型细节。
6.1 损失函数详解
Loss Functions · 模型每次犯错要罚多少分想常用损失全家桶
① MSE 均方误差(回归):L = (1/n)∑(yi − ŷi)²。误差大时罚得狠(平方),适合回归,但对异常点敏感。
② 交叉熵(分类):多分类 L = −∑c yc log ŷc;二分类 L = −[y log ŷ + (1−y) log(1−ŷ)]。为什么分类不用 MSE?因为 Sigmoid 后用 MSE 会导致梯度 = (ŷ−y)σ'(z),σ'(z) 在饱和区接近 0,梯度消失;交叉熵的梯度正好是 (ŷ−y),干净直接。
③ Triplet Loss(度量学习):L = max(0, d(a,p) − d(a,n) + margin)。学"同一个人的两张照片近,不同人远"。人脸识别、签名验证的主力。
④ Contrastive Loss:L = y·d² + (1−y)·max(0, margin−d)²。y=1 是正样本对(拉近),y=0 是负样本对(推远到 margin 外)。
① 回归用 MSE,分类用交叉熵。② 为什么?梯度干净不消失。③ Triplet/Contrastive 学相似度,人脸识别必备。
6.2 优化器详解:SGD → Momentum → Adam
Optimizers · 梯度下降的"自动挡"进化史想一代比一代聪明
① SGD:θ ← θ − η·g。g = ∂L/∂θ。最朴素,但在峡谷地形会来回震荡、收敛慢。
② Momentum(动量):像小球从山坡滚下,积累历史速度。
v ← βv + g; θ ← θ − ηv。β 通常 0.9。震荡方向互相抵消,一致方向加速。
③ AdaGrad:对每个参数累加历史梯度平方,频繁更新的参数步长自动变小。
s ← s + g²; θ ← θ − η·g/(√s+ε)。问题:s 单调涨,后期步长归零。
④ RMSProp:用指数滑动平均替代累加,解决 AdaGrad 早衰。
s ← ρs + (1−ρ)g²; θ ← θ − η·g/(√s+ε)。
⑤ Adam = Momentum + RMSProp + 偏差校正:
m ← β₁m + (1−β₁)g
v ← β₂v + (1−β₂)g²
m̂ = m/(1−β₁ᵗ), v̂ = v/(1−β₂ᵗ)
θ ← θ − η·m̂/(√v̂ + ε)
默认 β₁=0.9, β₂=0.999, ε=1e−8。Adam 是大多数任务的默认选择,因为它自适应步长+动量,对超参不敏感。
| 优化器 | 特点 | 何时用 |
|---|---|---|
| SGD | 无动量,慢但泛化好 | CV 任务精调、追求 SOTA |
| SGD+Momentum | 加速收敛 | CNN/ResNet 训练 |
| Adam | 自适应步长,快 | NLP/Transformer 默认 |
| AdamW | Adam+解耦权重衰减 | 大模型微调(推荐) |
① SGD 是祖宗,Momentum 加惯性,RMSProp 自适应步长,Adam 合体。② AdamW 是大模型标配。③ 初始用 Adam,精调可换 SGD。
6.3 正则化:L1 / L2 / Dropout / Batch Norm / Layer Norm
Regularization · 怎么防止模型背答案想正则化全家桶
① L2 正则(权重衰减):损失加一项 (λ/2)∑w²。梯度多一项 λw,更新变成 w ← (1−λη)w − ηg。让权重整体变小,模型更平滑,不容易拟合噪声。
② L1 正则:损失加 λ∑|w|。梯度是 λ·sign(w),会把不重要的权重直接压到 0,产生稀疏模型(可做特征选择)。
③ Dropout:训练时随机"关掉"一部分神经元(概率 p,通常 0.5)。相当于每次训练一个子网络,最后所有子网络集成。测试时不关,但权重乘 (1−p) 补偿。逼网络不能依赖任何单个神经元。
④ Batch Normalization:对每个 batch 的激活值做标准化:
μB = (1/m)∑xi,σ²B = (1/m)∑(xi−μB)²
x̂ = (x−μB)/√(σ²B+ε), y = γx̂ + β
让每一层输入分布稳定(缓解内部协变量偏移),可以用更大学习率、不那么依赖初始化。
⑤ Layer Normalization:不按 batch 标准化,按单个样本的特征维标准化。BN 在 NLP 里因为序列长度变化、batch 小而失效,Transformer 全部用 LayerNorm。
| Batch Norm | Layer Norm | |
|---|---|---|
| 标准化方向 | 跨 batch(同特征) | 跨特征(同样本) |
| 依赖 batch 大小 | 是,小 batch 不稳 | 否 |
| 典型场景 | CNN/图像 | Transformer/RNN/NLP |
① L2 让权重小,L1 让权重稀。② Dropout 随机关神经元防过拟合。③ BN 管 batch,LN 管特征;Transformer 用 LN。
6.4 初始化策略:Xavier 与 He
Initialization · 起点决定能不能训起来想为什么不能全零初始化
全零初始化:同一层所有 w=0,那所有神经元算出一样的 z、一样的梯度,永远对称,学不出不同特征。所以要随机初始化。但随机到什么程度?
Xavier 初始化(tanh/sigmoid):让前向传播时每层输出方差不变。
W ~ U(−√(6/(nin+nout)), √(6/(nin+nout)))
He 初始化(ReLU):ReLU 会杀死一半激活,方差要翻倍补偿。
W ~ N(0, √(2/nin))
直觉:前向方差不爆炸,反向梯度不消失,训练才稳。He 是 ReLU 时代的标配。
① 不能全零(对称失效)。② Xavier 适配 tanh,He 适配 ReLU。③ 初始化错了,可能训到死都不收敛。
6.5 学习率调度:Warmup / Cosine / Step Decay
LR Scheduling · 学习率不能一条道走到黑想为什么要调学习率
学习率太大:损失震荡甚至发散。太小:收敛慢。实战策略:
① Warmup(预热):刚开始用很小学习率,线性升到目标值。为什么?大模型刚开始训练时梯度噪声极大,一步冲太猛会把权重带飞。前几百步 Warmup 是大模型标配。
② Cosine Decay(余弦衰减):ηt = ηmin + ½(ηmax−ηmin)(1+cos(tπ/T))。像余弦曲线一样平滑下降,后期稳稳收敛。
③ Step Decay(阶梯衰减):每跑多少 epoch 学习率乘 0.1(如 0.01→0.001→0.0001)。简单粗暴,经典 CNN 常用。
① Warmup 防初期爆炸。② Cosine 平滑收尾。③ Step 简单直接。三者常组合:Warmup + Cosine。
6.6 梯度消失与爆炸
Vanishing / Exploding Gradients · 深层网络的经典病想为什么会消失/爆炸
反向传播是连乘:∂L/∂w₁ = ∂L/∂aL · ∏(∂ai/∂zi · ∂zi/∂ai−1)。链式法则一长串相乘。
梯度消失:如果每一步导数 < 1(如 Sigmoid 最大导数才 0.25),乘 100 层就趋近 0,前面层学不到东西。
梯度爆炸:如果每一步导数 > 1,乘 100 层就飞上天,Loss 变 NaN。
对策:① 用 ReLU(导数 0 或 1,不压小)替代 Sigmoid;② BatchNorm/LayerNorm 稳住分布;③ 合理初始化(He/Xavier);④ 梯度裁剪(gradient clipping):若梯度范数超过阈值,就缩放到阈值内,防爆炸;⑤ 残差连接(ResNet):加了"高速公路"让梯度直接传回去。
① 连乘导致消失/爆炸。② ReLU+BN+好初始化+残差是四大解药。③ 梯度裁剪专治爆炸。
6.7 激活函数全家桶:Sigmoid / Tanh / ReLU / GELU / SiLU
Activation Functions · 给网络注入非线性的那一下想引子与大白话
引子:4.6 说过"没有非线性激活,叠 100 层等于 1 层"。那到底用哪个非线性?从 Sigmoid 到 SiLU,每一代都在治上一代的病。
① Sigmoid:σ(z)=1/(1+e−z),压到 (0,1)。病:两端饱和梯度近 0(消失)、输出非零中心、计算贵。现在只在二分类输出层用。
② Tanh:压到 (−1,1),零中心,比 Sigmoid 好。但两端饱和病还在。RNN 时代主力。
③ ReLU:f(x)=max(0,x)。正区间导数恒 1(不消失)、计算极快。病:负区间导数 0,神经元可能"死亡"(永远输出 0 不再更新)。深度网络主力。
④ Leaky ReLU / PReLU:负区间给个小斜率 αx(如 0.01x),救活"死神经元"。
⑤ GELU:f(x)=x·Φ(x),Φ 是标准正态 CDF。直觉上"按输入自己随机地通过"。BERT、GPT 全用它,平滑、可微、效果比 ReLU 好。
⑥ SiLU / Swish:f(x)=x·σ(x),Google 提出。和 GELU 很像,计算更便宜。LLaMA 等现代 LLM 主力。
| 激活 | 公式 | 优点 | 缺点/现状 |
|---|---|---|---|
| Sigmoid | 1/(1+e⁻ᶻ) | 输出概率 | 饱和消失,仅输出层 |
| Tanh | (eᶻ−e⁻ᶻ)/(eᶻ+e⁻ᶻ) | 零中心 | 仍饱和,RNN 用 |
| ReLU | max(0,x) | 快、不消失 | 神经元死亡 |
| GELU | x·Φ(x) | 平滑效果好 | 计算稍贵,BERT/GPT |
| SiLU | x·σ(x) | 近似 GELU 便宜 | LLaMA 等现代 LLM |
坑:负区间学习率太大导致 ReLU 神经元批量死亡。一旦某神经元权重更新后,对所有训练样本都输出负,它就永远卡 0、不再学。PReLU/LeakyReLU 或用较小学习率缓解。现代 LLM 直接上 GELU/SiLU,把这些坑都绕过去了。
① Sigmoid/Tanh 饱和消失,只留输出层。② ReLU 快且不消失,但可能死神经元。③ 现代大模型统一 GELU/SiLU——平滑、不死、效果好。
① 用自己的话解释:用"下山"的比喻讲清学习率太大、太小各会怎样。
② 举个反例 / 生活例子:反例——为什么 10 层网络每层乘 0.25,传到第一层梯度就没了?ReLU 凭什么救场?
③ 哪里还说不清:Adam 比 SGD 多了哪两个"自适应",你能说清吗?