梯度消失
链式法则反复乘上小于一的局部增益时,前层收到的学习信号会变弱。默认十层实验中,sigmoid 只保留输出相对梯度的 2.785e-7;权重为一的激活 ReLU 路径保留 1。每一步看似普通,乘积却可能很小。
局部增益的乘积
每层只有一个标量激活,使用相同正权重 w,偏置为零:
z_ℓ = w · a_(ℓ−1)
a_ℓ = φ(z_ℓ)
前向计算激活,反向计算最终激活对较早激活的敏感度。定义:
g_ℓ = |∂a_D / ∂a_ℓ|,g_D = 1
g_(ℓ−1) = g_ℓ · |w · φ′(z_ℓ)|
其中 |w · φ′(z_ℓ)| 是局部增益。经过 D 层:
g_0 = Π[ℓ=1…D] |w · φ′(z_ℓ)|
sigmoid 导数为 a(1 − a),最大 0.25,接近 0 或 1 时更小。w = 1 时,每层增益至多四分之一,多层乘积迅速缩小。
激活的 ReLU 导数为一,局部增益为 |w|。w = 1 保持梯度;w = 0.5 按 0.5ᴰ 衰减;w = 1.5 按 1.5ᴰ 放大。ReLU 去掉了激活路径上的 sigmoid 饱和因子,没有去掉链式法则中的乘法。
两条轨道和所有预设共用固定对数轴 1e-15 到 1e3。等高距离代表相同数量级变化;从 1 到 1e-5 是损失五个十进制数量级,坐标轴不会自动缩放。
逐步演示
默认 a₀ = 1、深度 D = 10、w = 1、偏置全零。输入和归一化输出梯度相同,只改变激活函数。
- 第一层前向:sigmoid 的
z₁ = 1,a₁ = 0.7311,导数0.1966,只能保留穿过它的约 19.7% 梯度。ReLU 的激活、导数和局部增益均为一。 - 第二层前向:sigmoid 输出
a₂ = 0.6750,局部增益0.2194。ReLU 仍为一。第十层 sigmoid 激活接近0.6590,对应导数约0.2247。前向值稳定,不代表反向信号充足。 - 反向起点:两条轨道置
g₁₀ = 1,暂时排除损失导数的影响。真实损失还会乘上各自的输出导数,这里比较的是隐藏链的相对保留比例。 - 第一步反向:sigmoid 得到
g₉ = 0.2247,ReLU 为一。 - 继续向左:sigmoid 的相对梯度如下。每个因子非零,这里没有数值下溢,衰减来自普通因子的连乘。
| 位置 | sigmoid 相对梯度 |
|---|---|
g₈ | 0.05049 |
g₇ | 0.01135 |
g₆ | 0.002549 |
g₅ | 0.0005728 |
g₄ | 0.0001287 |
g₃ | 2.888e-5 |
g₂ | 6.457e-6 |
g₁ | 1.416e-6 |
g₀ | 2.785e-7 |
ReLU 到输入仍为 g₀ = 1,在这组条件下约保留 sigmoid 的 359 万倍相对梯度。真实参数更新还涉及各层输入和其他路径,但这个实验展示了早层难以获得纠错信号的机制。
权重与深度的影响
“Both fade”把权重改为 0.5。ReLU 导数仍为一,但十个权重相乘只有 0.5¹⁰ = 0.0009766;sigmoid 约为 7.261e-10。
“ReLU explodes”使用 w = 1.5,ReLU 得到 1.5¹⁰ = 57.665。信号向前层放大可能使更新不稳定。sigmoid 仍缩小,因为激活导数的衰减压过了权重放大。
“Sixteen deep”恢复 w = 1,深度改为 16。ReLU 仍为一,sigmoid 降到约 3.585e-11。增加六层又损失约四个数量级。
从训练症状定位原因
在相同训练步骤记录每个块的 ||∇W_ℓ L||,比较前层与后层。向量网络中的局部增益变成雅可比矩阵,奇异值和可用路径决定哪些方向收缩或放大。
| 症状 | 先检查 | 可能的处理 |
|---|---|---|
| 前层梯度比后层小多个数量级 | 激活饱和、权重尺度、路径上的雅可比尺度 | 匹配激活的初始化、归一化、合适的非饱和激活,或缩短乘积的残差路径 |
| 向输入方向梯度增大、尖峰或非有限值 | 局部雅可比是否反复放大信号 | 修正初始化或归一化,检查不稳定块;裁剪能限幅,不能修复来源 |
| ReLU 后方梯度精确为零 | 非正预激活比例和持续不激活的单元 | 调整初始化、偏置;若确实是死亡单元,可考虑 leaky 变体 |
循环门控和注意力会改变依赖路径,不会废除链式法则。梯度裁剪只能限制过大梯度,不能恢复已经衰减的信号。
边界情况
- ReLU 输入非正:允许的配置始终为正,所以轨道标为激活路径。若某层
z_ℓ < 0,导数为零;零点不可微,实现通常也取零。一项零会切断该路径此前的梯度。 - 单个增益大于一或小于一:不能凭一层判断全链。其他层可能抵消它,最终要看完整乘积;重复收缩才会随深度形成指数衰减。
- 负权重:本课限制正权重以便比较。负权重可翻转梯度符号,也可能改变 ReLU 的激活状态;消失和爆炸取决于实际路径乘积的幅度。
- 精确零与无效小值:有限输入下 sigmoid 的数学导数为正,但
2.785e-7仍可能被数值精度、噪声、正则化或其他更大梯度掩盖。浮点饱和还可能产生精确零。 - 损失导数:
g_D = 1只是归一化,真实损失会再贡献一个因子。
常见错误
- 用稳定的前向激活证明反向正常。
0.659附近的激活仍可对应2.785e-7的输入相对梯度。 - 归咎于一个极小导数。本例局部增益约
0.20–0.22,问题在连乘。 - 断言 ReLU 解决了所有梯度消失。权重仍会缩小或放大信号,不激活的单元会切断路径。
- 比较自动缩放坐标轴上的柱高。本课固定两条轨道的对数范围。
- 用梯度裁剪治疗消失,或以为每个参数都遵循这个标量乘积。
模型范围
这是机制讲解,不是训练系统:每层一个标量、相同权重、零偏置,输出梯度归一化。真实反向传播会乘雅可比矩阵,累加分支和样本贡献,再由优化器更新参数。奇异值、分支、残差和批统计量会改变数值与路径,但局部增益的长乘积仍决定信号的衰减、保留和放大。