目录
博客:blog.shinelee.me | 博客园 | CSDN
神经网络的训练过程可以简化成以下步骤,
一个简单的前向传播和反向传播的示意图如下,线性组合和非线性激活交替进行,线性组合层可以为全连接层或卷积层等,图片来自链接,
仔细观察上式,偏导为一串因子的乘积,因子中的每一项对乘积结果都有影响,有几点需要注意,回传时,
梯度为偏导数构成的向量。
损失函数收敛至极小值时,梯度为0(接近0),损失函数不再下降。我们不希望在抵达极小值前,梯度就为0了,也不希望下降过程过于震荡,甚至不收敛。梯度消失与梯度爆炸分别对应这2种现象,
梯度消失(vanishing gradients):指的是在训练过程中,梯度(偏导)过早接近于0的现象,导致(部分)参数一直不再更新,整体上表现得像损失函数收敛了,实际上网络尚未得到充分的训练。
梯度爆炸(exploding gradients):指的是在训练过程中,梯度(偏导)过大甚至为NAN(not a number)的现象,导致损失剧烈震荡,甚至发散(divergence)。
由上一节的分析可知,在梯度(偏导)计算中,主要的影响因素来自激活函数的偏导、当前层的输入(前一层的输出)、以及权重的数值等,这些因子连续相乘,带来的影响是指数级的。训练阶段,权重在不断调整,每一层的输入输出也在不断变化,梯度消失和梯度爆炸可能发生在训练的一开始、也可能发生在训练的过程中。
因子项中当前层的输入仅出现一次,下面着重看一下激活函数和权重的影响。
以Sigmoid和Tanh为例,其函数与导数如下(来自链接),
两者的导数均在原点处取得最大值,前者为0.25后者为1,在远离原点的正负方向上,两者导数均趋近于0,即存在饱和区。
所以,一个改善方向是选择更好的非线性激活函数,比如ReLU,相关激活函数如下图所示,
ReLU只在负方向上存在饱和区,正方向上的导数均为1,因此相对更少地遭遇梯度消失,但梯度爆炸现象仍然存在。
假设激活函数为线性,就像ReLU的正向部分,导数全为1。则一个简化版本的全连接神经网络如下图所示,
至此,一些权重不良初始化导致的问题就不难解释了,
这几种权重初始化方法对网络训练过程的影响,可在Initializing neural networks进行可视化实验,可观察权重、梯度和损失的变化,美中不足的是隐藏层的激活函数只有ReLU,不能更换为Sigmoid、Tanh等,如下所示,
话说回来,所以我们需要好的网络初始化方法,以对反向传播过程中的梯度有所控制。对反向传播中梯度加以控制的方法,不止这里提到的激活函数和权重初始化,还有梯度截断(gradient clipping)、网络模型设计方面等方法,因为本文的重点在于权重初始化,对此按下不表。
那么,合适的网络初始化方法是什么呢?我们下回分解。