RNN训练难题——梯度爆炸与梯度弥散
梯度弥散是接近于0
梯度爆炸式接近于无穷大
RNN的梯度求导公式
梯度信息中有个w^k,所以
梯度爆炸的解决
比如在这个点,可能再往左下走一点点,就会error值(loss值)迅速升高,就产生了梯度爆炸
就你的训练过程可能是0.25,0.24,0.23,然后突然,变成了1.1这样
梯度爆炸的解决其实是很简单的
每次计算的时候,检查一下gradient的值,如果大于了设定的阈值,就用当前梯度的当前梯度的模,让它长度变成1,方向保持不变,然后再乘上阈值threshold,这样就把梯度的最大值限定在了阈值之内
就是削减了它的步长,比如原来是
现在是
因为一步跨的很小,所以在那个点的梯度方向一般和正确的方向接近,而如果是前一张图那样一下跨到顶了,那么他的梯度更新方向就可能与正确的方向大相径庭了
虽然这种方式没有从根本上解决梯度爆炸, 但是是一种很有效的办法
注意,这是对梯度进行了clipping,不是对weight进行clipping,是对w.gradient做clipping
代码
只要backward了之后
w.grad就被更新了,保存了当前点的梯度值
grad都在parameters里
梯度消失
人们到后来发现,CNN等到了一定层数,在堆叠更多的层数,结果反而会不好
这是因为在反向传播的时候,梯度逐步往前传播更新,δk每次都累计一个误差
当到最后的时候δk已经非常小了,接近于0了,因此
会接近于0
这样到后面,第0层,第1层的W就会接近于0
这样就会出现长时间得不到更新的现象
因此网络即使堆叠得再深,也有可能train不好
上图是一个全连接层网络的层数的梯度信息,所以不只是在RNN中,在全连接和CNN中也有某种程度上的反映,只是没有RNN明显
ResNet的解决办法是加一个shortcut,就是让他最差退化成原始的网络
深度学习与神经网络(九)—— RNN梯度爆炸与梯度消失(梯度弥散)
于 2020-05-21 22:43:08 首次发布