➤导语
在机器学习模型训练的常见问题中,除了会遇到过拟合、欠拟合问题,还有一类问题也经常出现,那便是梯度问题。梯度问题具体是什么?又有哪些应对之法?
>>>>
梯度问题
梯度问题出现在深度神经网络的残差反向传播过程当中,原因是神经网络通过链式法则求解不同层的梯度,中间的连乘有可能导致残差计算的不稳定性,使得模型训练失效。梯度问题具体有两种表现形式:梯度消失和梯度爆炸。
梯度消失 又叫 梯度弥散。根据链式法则,如果每一层神经元的权重与上一层传递过来的残差之积都小于1,这样经过足够多层传递之后,残差值将趋近于0。
梯度消失示例:y1 = w1x1, x2 = f(y1), y2 = w2x2, x3 = f(y2), y3 = w3x3, …, xn = f(yn-1)。
其中x1是输入层的输入,x2、x3分别是中间两个隐层的输出,xn是输出层的输出。w1的梯度求解:σw1 = L' * f'(y1) * f'(y2) * … * f'(yn-1) * w2 * … * wn-1 * x1。
上述示例可以看出,造成梯度消失的具体原因,要么是权重w偏小,要么就是x偏小。w偏小一般是参数初始化的问题,x偏小则是激活函数的问题。
比如常见的sigmoid激活函数,其导数f'(x) = f(x) * (1 - f(x))的最大值为0.25,连乘比较容易造成梯度消失。
同上述示例,梯度爆炸 的具体原因则是初始化权重w过大所致。例如,各层激活函数如果是sigmoid,那么造成梯度爆炸的必要条件是w的初始值至少大于4。
解决梯度问题主要有以下六种方法:
pre-training&fine-tunning该方法由Hinton在2006年提出,采取先局部后整体的思想,pre-training先逐层训练每一个隐层的神经元,fine-tunning再通过BP对整个网络进行训练微调。
梯度剪切顾名思义,在向前传递残差的时候,根据设定阈值进行残差截断。该手段主要用于防止梯度爆炸。
损失函数加入正则项通过加入正则项,限制权重大小,具体正则项的讲解可参考正则项:把控拟合方向的马车夫。该手段主要也是防止梯度爆炸。
使用线性组合的激活函数如前文所述,sigmoid激活函数导数最大值为0.25,且越靠近边界导数值下降越明显,可替换成ReLU等线性组合的激活函数,这些函数既简单、导数值又是常数,能有效防止梯度消失。
Batch Normalization这是G公司在ICML2015的论文中提出来的一种“批量规范化”的方案,简单而言就是通过对每一层的输出先进行规范化(减均值除方差),再进行激活传递至下一层。
加入残差网络传统的BP网络都是残差逐层串行传递,而该网络支持残差跨层传递,直接避免了连乘带来的计算不稳定性。
以上便是梯度问题的讲解,敬请期待下节内容。
结语
感谢各位的耐心阅读,后续文章于每周日奉上,欢迎大家关注小斗公众号对半独白!
每周一言
时间,是成长的必要代价。
领取专属 10元无门槛券
私享最新 技术干货