4.8 数值稳定性和模型初始化

发布时间 2023-07-22 09:41:03作者: Ann-

1. 数值稳定性

当神经网络的层数变得越来越深时,容易出现梯度消失梯度爆炸的问题。这是因为,输出对于某一层的一组参数的梯度是多个矩阵的乘积,并且越底部(浅层)的层,相乘的矩阵的数量就越多。梯度消失会导致参数更新过小,甚至梯度为0,网络无法训练。sigmoid函数容易导致梯度消失: 

 

可以看到,当输入大于5或小于-5的时候,sigmoid函数的梯度几乎为0.

而梯度爆炸会使得参数更新过大,破坏模型的收敛,不易、很难或不能找到一组参数使得模型收敛。

 

2. 参数初始化

面对梯度消失和梯度爆炸问题,我们要我们的训练是稳定的,可以有以下几种方法:

(1) 让乘法变加法:ResNet,LSTM

(2)归一化:梯度归一化,梯度裁剪。梯度归一化是说无论梯度为多少,都把梯度拉回一个比如均值为0,方差为1的分布内;梯度裁剪是说,梯度如果大于某一个值,就给梯度赋成这个值。

(3)合理的参数初始化和激活函数。

本节主要讨论(3)。

Xavier初始化

 

Xavier初始化是一种常用的参数初始化方法。我们假设神经网络某一层具有均值为0,方差为γ2的输入,以及该层的权重均值为0,方差为σ2。那么,在没有激活函数时可以计算出该层的输出

 具有均值

 以及方差

 于是,我们有,保持输出的方差与输入的方差相等,即ninσ2γ2 = γ2 的方法是:让ninσ2 = 1. 同样地,在反向传播过程中,面临着类似的问题,要让每一层的梯度的方差不变,应该保证noutσ2 = 1.这里,nin和nout是该层输入神经元的数量和输出神经元的数量。显然我们难以同时满足这两个条件,因为网络不可能按照满足这个条件来设计,网络的设计必会有一些层,其输入神经元的数量与输出神经元的数量是不相等的。那么怎么办呢?可以做一个权衡,让ninσ2  + noutσ2 = 2,即:

    或    

 也就是说,当某一层有nin个输入神经元,并且有nout个输出神经元时,Xavier参数初始化方法是让我们将这一层的参数初始化为均值为0,方差为2 / nin + nout 的高斯分布。或者初始化为均匀分布,值域为:

激活函数

 上面的Xavier初始化的讨论是不使用激活函数下的讨论。在使用激活函数时,那么,如果要满足(1)每一层输出的方差和输入相等,(2)反向传播时所有层的梯度的方差相等这两点,要求是(可以经过数学推导得出):激活函数f(x) = x.即没有激活函数,不去进行激活操作。那么,我们检查一下常用的激活函数:

 可以通过调整sigmoid函数,来将sigmoid函数近似到x。