目录
数值稳定性
神经网络的梯度
考虑如下有d层的神经网络
计算损失l关于参数Wt的梯度
数值稳定性的常见两个问题
梯度消失 和 梯度爆炸
例子: MLP
加入如下MLP(为了简单省略了偏移)
梯度爆炸
使用ReLU作为激活函数。
梯度爆炸的问题
- 值超出值域(infinity)
对于16位浮点数尤为严重(数值区间6e-5 - 6e4)。
- 对学习率敏感
如果学习率太大 -> 大参数值 -> 更大的梯度。
如果学习率太小 -> 训练无进展。
我们可能需要在训练过程不断调整学习率。
梯度消失
使用sigmoid作为激活函数
的元素值是d-t个小数值的乘积。
梯度消失的问题
- 梯度值变成0。
对16位浮点数尤为严重。
- 训练没有进展。
不管如何选择学习率。
- 对于底部层尤为严重。
仅仅顶部层训练的较好。
无法让神经网络更深。
总结
- 当数值过大或者过小时会导致数值问题。
- 常发生在深度模型中,因为其会对n个数累乘。
让训练更加稳定
- 目标:让梯度值在合理的范围内。
例如:[1e-6,1e3]
- 将乘法变成加法
例如:ResNet,LSTM。
- 归一化。
例如:梯度归一化,梯度裁剪。
- 合理的权重初始和激活函数。
让每层的方差是一个常数
- 将每层的输出和梯度都看作随机变量。
- 让他们的均值和方差都保持一致。
,a,b都是常数。
权重初始化
- 在合理值区间里随机初始参数。
- 训练开始的时候更容易有数值不稳定。
远离最优解的地方损失函数表面可能很复杂。
最优解附近表面会比较平。
- 使用N(0,0.01)来初始可能对小网络没问题,但不能保证深度神经网络。
例子:MLP
,i,i.d代表独立同分布。
正向方差
反向均值和方差
Xavier初始
假设线性的激活函数
反向
检查常用激活函数
- 使用泰勒展开
- 调整sigmoid:
总结
合理的权重初始值和激活函数的选取可以提升数值稳定性。