楼层: 首页/ 算法与AI/ 模块六 · 深度学习进阶:损失、优化、正则化
损

模块六 · 深度学习进阶:损失、优化、正则化

DL Advanced · 神经网络为什么训得动、训得稳

模块四只说了"反向传播+梯度下降"。但真实训练里,用什么损失、用哪个优化器、怎么防止过拟合、怎么初始化、怎么调学习率,每一步都是坑。这一模块把这些"炼丹手册"讲透。

上一模块补完经典 ML,这一模块回答一个实战问题:神经网络为什么训得动、又怎么训得稳。为什么需要?你会发现 loss 选不对、学习率太大、不初始化、不做正则化,模型根本出不来。学完你手里就有一本"炼丹手册"。下一模块深入 Transformer 和大模型细节。

本模块要学什么(按这个顺序学)
损失函数(MSE/交叉熵) → 优化器(SGD/动量/Adam) → 初始化/BN → 正则化(Dropout/权重衰减) → 学习率调度 → 梯度消失/爆炸

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?
ŷ=0.99, y=1(预测很自信但错了一个小标签)。
解:交叉熵 L = −log(0.99) ≈ 0.01,梯度 ŷ−y = −0.01,很小——因为本来就预测对了。但若 ŷ=0.01, y=1(自信地错),交叉熵 L = −log(0.01) ≈ 4.6,梯度 0.99,极大。错得越离谱罚得越狠,梯度越猛。MSE 在同样情况下梯度被 σ'(z) 压平,学不动。
记
小结

① 回归用 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 是大多数任务的默认选择,因为它自适应步长+动量,对超参不敏感。

例:为什么需要偏差校正 m̂?
m 和 v 初始化为 0,β₁=0.9,第一步 g=1。
解:第一步 m = 0.9×0 + 0.1×1 = 0.1,但真实梯度是 1。不校正的话第一步只走了 0.1η,比应有的小 10 倍。m̂ = 0.1/(1−0.9¹) = 1,恢复真实值。训练初期 t 小,1−βᵗ 小,校正后放大;t 大时校正几乎不影响。
表 6-1 优化器选型
优化器特点何时用
SGD无动量,慢但泛化好CV 任务精调、追求 SOTA
SGD+Momentum加速收敛CNN/ResNet 训练
Adam自适应步长,快NLP/Transformer 默认
AdamWAdam+解耦权重衰减大模型微调(推荐)
记
小结

① 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。

表 6-2 BN vs LN
Batch NormLayer 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):加了"高速公路"让梯度直接传回去。

例:为什么 Sigmoid 导致梯度消失?
Sigmoid 导数 σ'(z) = σ(z)(1−σ(z)),最大 0.25(在 z=0 处)。
解:10 层连乘,每层最多 0.25,0.25¹⁰ ≈ 1e−6。传到第一层梯度已经小到看不见。ReLU 在 z>0 时导数=1,连乘不衰减,这就是 ReLU 革命的原因。
记
小结

① 连乘导致消失/爆炸。② 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 主力。

表 6-3 激活函数对比
激活公式优点缺点/现状
Sigmoid1/(1+e⁻ᶻ)输出概率饱和消失,仅输出层
Tanh(eᶻ−e⁻ᶻ)/(eᶻ+e⁻ᶻ)零中心仍饱和,RNN 用
ReLUmax(0,x)快、不消失神经元死亡
GELUx·Φ(x)平滑效果好计算稍贵,BERT/GPT
SiLUx·σ(x)近似 GELU 便宜LLaMA 等现代 LLM
例:为什么 ReLU 能缓解梯度消失而 Sigmoid 不能?
看导数。
解:Sigmoid 导数最大才 0.25,连乘 100 层趋近 0。ReLU 在 x>0 时导数恒 1,连乘 100 层还是 1,梯度原样传回去。这就是 AlexNet 用 ReLU 后突然能训深网络的数学原因。
防坑

坑:负区间学习率太大导致 ReLU 神经元批量死亡。一旦某神经元权重更新后,对所有训练样本都输出负,它就永远卡 0、不再学。PReLU/LeakyReLU 或用较小学习率缓解。现代 LLM 直接上 GELU/SiLU,把这些坑都绕过去了。

记
小结

① Sigmoid/Tanh 饱和消失,只留输出层。② ReLU 快且不消失,但可能死神经元。③ 现代大模型统一 GELU/SiLU——平滑、不死、效果好。

费曼学习法:讲给别人听

① 用自己的话解释:用"下山"的比喻讲清学习率太大、太小各会怎样。

② 举个反例 / 生活例子:反例——为什么 10 层网络每层乘 0.25,传到第一层梯度就没了?ReLU 凭什么救场?

③ 哪里还说不清:Adam 比 SGD 多了哪两个"自适应",你能说清吗?