关于梯度消失/爆炸产生原因和缓解办法
AI摘要: 本文探讨了神经网络中梯度消失/爆炸产生的原因及其缓解方法。首先,文章指出梯度下降法在处理复杂网络时会遇到梯度消失或爆炸的问题,这主要是由于链式求导和梯度爆炸/消失导致的。接着,文章列举了几种常见的改进方法:预训练加微调、梯度裁剪和正则化、使用批规范化(batchnorm)、残差结构以及LSTM等。这些方法旨在优化神经网络的训练过程,减少梯度消失或爆炸的风险,提高模型的性能。
产生原因
众所周知,神经网络是多种不同的线性层/非线性层堆叠而成的巨型网络,其函数表达式非常复杂,很难优化;但是可以使用链式求导和运用梯度下降法来解决这一问题。链式求导带来解决办法的同时也带来的一些问题,那就是梯度消失/爆炸。
梯度爆炸
一般来说,梯度爆炸出现在深层网络当中,或者网络的权重初始值设置太大,那么在进行梯度下降的时候就容易出现梯度爆炸。从数学的角度上来看,神经网络的层数越大,那么链式求到的次数也就越多,那么最终的梯度会指数级变化,很容易让处在[0,1]之间的数值变得趋近于0。
梯度消失
同样是在深层网络当中,也可能出现梯度趋近于0,接近消失的情况;或者是由于损失函数本身的缺陷,比如常见的sigmod函数,在原离原地的位置梯度非常小。同上,在数学上,由于指数级的放大效应,那么容易让大于1的数值趋近于无穷大,从而梯度爆炸。
总结
梯度下降的先天不足会导致神经网络不同层的参数更新速度不同,
目前已有的改进方法
-
预训练加微调:Hinton提出的capsule(彻底抛弃了反向传播),每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是“逐层预训练”;在预训练完成后,再对整个网络进行微调(fine-tune)
-
梯度裁剪和正则;为梯度设置一个阈值,强制控制梯度在一个合理的范围之内;权重正则化,比较常见的是L1正则和L2正则;如果发生梯度爆炸,那么最后求出的优化目标也会非常大,这时的惩罚项也会很大,从而达到抑制爆炸的效果
-
batchnorm:即“批规范化”,
-
使用残差结构;残差网络可以很轻松构建几百层也不用单行梯度消失过快的问题,原因就在于shortcut部分
式子的第一个因子 表示的损失函数到达 L 的梯度,小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。
-
LSTM : LSTM中有“门”的结构,可以“记住”前几次训练留下来的“残留记忆”,也就是修改网络结构
-
使用某些参数初始化方法,比如初始化为单位矩阵之类的,都有助于避免梯度消失