动手学深度学习v2
Day 6
0x00 数值稳定性
一个d层的神经网络,计算其梯度(复合函数求导)
∂
l
∂
w
t
=
∂
l
∂
h
d
∂
h
d
∂
h
d
−
1
.
.
.
∂
h
t
+
1
∂
h
t
∂
h
t
∂
w
t
\frac {\partial l} {\partial w^t} = \frac {\partial l} {\partial h^d} \frac {\partial h^d} {\partial h^{d-1}} ...\frac {\partial h^{t+1}} {\partial h^t}\frac {\partial h^t} {\partial w^t}
∂wt∂l=∂hd∂l∂hd−1∂hd...∂ht∂ht+1∂wt∂ht
那么中间有
d
−
t
d-t
d−t次的矩阵乘法,即:
∏
i
=
t
d
−
1
∂
h
i
+
1
∂
h
i
\prod_{i=t}^{d-1}\frac {\partial h^{i+1}} {\partial h^i}
i=t∏d−1∂hi∂hi+1
这导致了神经网络的两个问题如下:
- 梯度爆炸
如果每一次的导数为1.5 次数100次,那么连乘之后的结果有 4 ∗ 1 0 17 4*10^{17} 4∗1017
这个数值非常巨大,可能导致值超出值域(16位浮点数尤其严重)
对学习率敏感,学习率过大导致参数值更大导致梯度更大,学习率太小导致训练没什么进展(意思就是调学习率很困难) - 梯度消失
如果每一次的导数为0.8 次数100次,那么连乘之后的结果有 2 ∗ 1 0 − 10 2*10^{-10} 2∗10−10
这个梯度就基本可以忽略了,基本为0,训练不会有进展了(对16位浮点数尤为严重)
对于底部层尤为严重,神经网络无法变得更深,只有顶部可以正常训练
0x01 模型初始化
目标:让梯度值在合理的范围内
- 乘法变加法
- 梯度归一化
- 梯度裁剪(强制去掉范围外的数值,类似四舍五入)
- 合理的权重初始化和激活函数
1.让每一层的方差是一个常数
将每层的输出和梯度都看做是随机变量,并且让他们的均值和方差保持一致
2.权重初始化
- 在合理的区间内随机初始化参数
- 训练开始的时候更容易存在数值不稳定的问题
这里往后的内容完全看不懂,留到后续有时间再看
3.检查常用的激活函数
泰勒展开然后做线性调整