神经网络的梯度
考虑有如下 d 层的神经网络
ht=ft(ht−1) and y=ℓ∘fd∘…∘f1(x)
计算损失 ℓ 关于参数 Wt 的梯度
∂Wt∂ℓ=∂hd∂ℓ∂hd−1∂hd…∂ht∂ht+1∂Wt∂ht
进行了 d−t 次矩阵乘法
数值稳定性的两个常见问题
梯度爆炸
1.5100≈4×1017
- 值超出值域(infinity)
- 对于 16 位浮点数尤为严重(数值区间 [6×10−5,6×104])
- 对学习率敏感
- 如果学习率太大 → 大参数值 → 更大的梯度
- 如果学习率太小 → 训练无进展
- 可能需要在训练过程中不断调整学习率
梯度消失
0.8100≈2×10−10
以 MLP 为例
加入如下 MLP(为了简单省略了偏移)
ft(ht−1)=σ(Wtht−1)σ 是激活函数
∂ht−1∂ht=diag(σ′(Wtht−1))(W^t)Tσ′ 是 σ 的导数函数
i=t∏d−1∂hi∂hi+1=i=t∏d−1diag(σ′(Wihi−1))(Wi)T
梯度爆炸
使用 ReLU 作为激活函数
σ(x)=max(0,x) and σ′(x)={10 if x>0 otherwise
∏i=td−1∂hi∂hi+1=∏i=td−1diag(σ′(Wihi−1))(Wi)T 的一些元素会来自 ∏i=td−1(Wi)T
如果 d−t 很大(层数很深),值可能会很大
梯度消失
使用 sigmoid 作为激活函数
σ(x)=1+e−x1σ′(x)=σ(x)(1−σ(x))
∏i=td−1∂hi∂hi+1=∏i=td−1diag(σ′(Wihi−1))(Wi)T 可能是 d−t 个小数值的乘积
总结
- 当数值过大或者过小时会导致数值问题
- 常发生在深度模型中,因为其会对 n 个数累乘