展示了梯度消失和梯度爆炸的原因,阐述其与初始化的联系,并给出一种初始化的方法。
2.1 梯度消失与梯度爆炸
-
梯度消失的根本原因
梯度消失的根本原因并不是因为层层传递造成的,而是使用的函数求导之后数值太小的问题。
比如,以前曾经使用的
sigmoid函数,其求导之后的图像只在中间有突起,左右两边非常平缓且接近于零。这导致在训练时,只要有一层的反向传播出现了一个很大的数值,在求导后数值将被覆盖,即梯度将被切断。这会导致无法学习。
选用
ReLU函数虽然没有sigmoid函数(在统计学上)看起来“优雅”,但是其很稳定,导数是稳定的0与1,能很好的解决梯度消失的问题。因此可以预料到的是,参数的初始化至关重要。反向传播时,连接层求导得到的表达式会包含参数本身(连接的方法是线性加权相加),因此参数不能初始化为0,也需要警惕初始化的大小
-
梯度爆炸的根本原因
造成梯度爆炸的,不止有一个拟合函数梯度太大。
如果我们初始化生成的参数矩阵,是一个尺度过大的值的话(尺度与方差相对应),可以预料到反向传播时,梯度被不断乘上很大的值,最后模型没有办法收敛。
梯度爆炸还有一个危险:当网络中出现一个梯度暴增或跌至0的函数时,很有可能计算机的变量没办法承载如此大的数值导致出现非法值,致使程序没法运行。
2.2 对称性
对称性的概念作用于两个隐藏单元中。
其问题的出现在于,如果初始化的时候设置所有参数为一个相同的常量时
- 前向传播中,隐藏单元采用相同输入与相同参数,产生相同激活。
- 反向传播中,所有值相同,得到的更新值也相同。
- 更新一遍后,两个单元的参数是一模一样的。
根据前面暂退法的描述,以及ResNET论文的叙述,每增加一个单元都会增大网络退化的概率。
因此,对称性的存在相当于空添了一个层但是什么作用都没发挥出来。
看得出来,想要破坏对称性是很容易的:一方面是初始化设定不同值,另一方面是使用暂退法通过随即屏蔽打破对称性。
2.3 Xavier初始化
从上文的叙述可以看出来,初始化是一个很重要的事。
在最开始,我们使用正态分布初始化权值,这个方法很简单因此不论。
初始化方法是深度学习基础研究的热点领域,有各种算法来避免运算中可能出现的问题。本次学习只学习到一个皮毛。作为入门,我们来学习Xavier初始化。
这里有一篇很好的展示这个初始化的效果的文章。
2.3.1 Xavier初始化的条件
梯度爆炸和尺度,即方差有着密切的关联。
因此,Glorot认为:优秀的初始化应该使得各层的激活值和状态梯度在传播过程中的方差保持一致。也就是说我们要保证前向传播各层参数的方差和反向传播时各层参数的方差一致。
方差取决于激活函数,输入特征与初始化值。为了关注怎么初始化能最接近我们的方差一致目标,我们对前两个要素提出如下假设:
- 输入的每个特征方差一样:Var(x);
- 激活函数对称:这样就可以假设每层的输入均值都是0;
- 激活函数的f′(0)=1
- 初始时,状态值落在激活函数的线性区域:f′(Si(k))≈1
2.3.2 Xavier初始化公式
详细推导不展示,这里展示思路。
我们先来观察一个均匀分布的特征:
- 均匀分布的方差是定值,是。这是我们最后套用到初始化的关键。
前向传播时,方差要一致,反向传播时,方差也要一致。要怎么达到这个效果?
我们已经假设输入和分布全部具有零均值和统一的方差。因此,首先算出每一层输入产生的反差和均值。假设分布的方差是,输入的方差是。
\begin{split}\begin{aligned} E[o_i] & = \sum_{j=1}^{n_\mathrm{in}} E[w_{ij} x_j] \\&= \sum_{j=1}^{n_\mathrm{in}} E[w_{ij}] E[x_j] \\&= 0, \\ \mathrm{Var}[o_i] & = E[o_i^2] - (E[o_i])^2 \\ & = \sum_{j=1}^{n_\mathrm{in}} E[w^2_{ij} x^2_j] - 0 \\ & = \sum_{j=1}^{n_\mathrm{in}} E[w^2_{ij}] E[x^2_j] \\ & = n_\mathrm{in} \sigma^2 \gamma^2. \end{aligned}\end{split}
- 反向传播公式也是一样的。
要怎么样保证前向传播时,方差要一致,反向传播时,方差也要一致?
我们可以让和。问题在于,这个条件是难以同时满足的。
我们为了使得这个条件尽可能满足,我们松弛了条件,只要让
我们把得到的和均匀分布的方差联系起来,最后就得到了初始化的分布。
推导中有很多假设和松弛的地方,但是,经过实证,这种初始化方法非常有效。