文章目录
神经翻译笔记3扩展c. 神经网络的初始化
深度学习中,在具体网络结构之上,有三种应用广泛而且比较微妙的技术,分别是
- 初始化,即如何恰当地初始化网络参数。不恰当的初始化方法甚至会使网络无法被训练,而好的初始化方法可以缩短网络训练的时间
- 优化,即如何让参数更新,最后达到最优解。这部分内容实际上并非深度学习所特有,各个优化器可以应用在其它基于梯度的机器学习模型上,例如线性回归、逻辑回归等等。因此这部分放在了深度学习部分之前介绍:优化方法
- 泛化(generalization),或者说正则化(regularization),即如何防止模型过拟合。一些泛化方法也在其它机器学习模型上得到了应用,如L1正则化、L2正则化以及衍生出来的弹性网等。但是针对深度学习,有一些比较专门的泛化方法
本文将对初始化方法做一些介绍,下一篇文章介绍泛化(正则化)方法
基本初始化方法
比较常用和基本的初始化方法有两种,分别是均匀分布初始化和正态分布初始化法。核心思想就是根据给定的某个概率分布随机生成参数。例如,
tf.initializers.random_uniform(-0.1, 0.1)
会在区间[-0.1, 0.1]内根据均匀分布产生一个随机数tf.initializers.truncated_normal(0, 1)
会根据均值为0,方差为1的正态分布产生一个随机数。如果生成的随机数超出了均值+/-2倍标准差的临界值,那么该值会被丢弃,重新产生一个随机数。TF官方文档推荐使用这个方法来初始化神经网络的权重,而不是普通的正态分布生成器tf.initializaers.random_normal
然而,普通的随机初始化方法有缺陷,不适合复杂网络。主要原因是对于非线性激活函数,其导数通常都有一大部分非常平坦的区域。如果初始化得到的权重落在了这个区域里,神经元会饱和,权重很难得到更新。例如,对于常见的激活函数 tanh \tanh tanh,如果输入 x x x的绝对值大于2,就会落入到饱和区域。对于最简单的前馈神经网络,假设隐藏层每个节点都与输入的每个节点全连接,那么对某个节点,有
h j = x 1 w 1 j + x 2 w 2 j + x 3 w 3 j + … h_j = x_1w_{1j} + x_2w_{2j} + x_3w_{3j} + \ldots hj=x1w1j+x2w2j+x3w3j+…
对求和项的每一项,其方差根据独立变量的乘积定理,有
V a r ( x i w i j ) = [ E ( x i ) ] 2 V a r ( w i j ) + [ E ( w i j ) ] 2 V a r ( x i ) + V a r ( x i ) V a r ( w i j ) {\rm Var}(x_iw_{ij}) = [{\rm E}(x_i)]^2{\rm Var}(w_{ij}) + [{\rm E}(w_{ij})]^2{\rm Var}(x_i) + {\rm Var}(x_i){\rm Var}(w_{ij}) Var(xiwij)=[E(xi)]2Var(wij)+[E(wij)]2Var(xi)+Var(xi)Var(wij)
假设输入的均值为0,方差为1,而且初始化权重时,也是从一个均值为0,方差为1的分布初始化,代入上式,有
V a r ( x i w i j ) = 0 × 1 + 0 × 1 + 1 × 1 = 1 {\rm Var}(x_iw_{ij}) = 0 \times 1 + 0 \times 1 + 1 \times 1 = 1 Var(xiwij)=0×1+0×1+1×1=1
该节点的方差使用不相关独立变量加和定理,有
V a r ( h j ) = ∑ i = 0 n V a r ( x i w i j ) = n × 1 = n {\rm Var}(h_j) = \sum_{i=0}^n {\rm Var}(x_iw_{ij}) = n \times 1 = n Var(hj)=i=0∑nVar(xiwij)=n×1=n
其中 n n n是输入节点的个数。假设输入节点数为784,那么方差就是784,标准差为 V a r ( h j ) = 784 = 28 \sqrt{ {\rm Var}(h_j)} = \sqrt{784} = 28 Var(hj)=784=28,因此大多数权重都会有 ∣ w ∣ > 2 |w| > 2 ∣w∣>2,进入饱和区域。因此需要其它初始化方法
LeCun初始化
Yann LeCun在1998年的一篇文章[LeCun1998]上率先提出了一种初始化方法。首先,要求节点的输出所属的分布必须标准差接近1,因此首先需要输出的方差为1,这可以通过一个归一化操作来解决。然后,假设某个神经元的输入 y i y_i yi不相关且方差为1,那么该单元的所有权重之和的标准差为
σ y i = ( ∑ j w i j 2 ) \sigma_{y_i} = \sqrt{\left(\sum_j w_{ij}^2\right)} σyi=(j∑wij2)
为了使该值接近1,权重必须来自于均值为0,标准差 σ w = m − 1 / 2 \sigma_w = m^{-1/2} σw=m−1/2的分布,其中 m m m是该单元的输入数。文章没有点名必须用什么样的分布,只是说可以是均匀分布
在TensorFlow的实现里,有两种实现:
- 对
tf.initializers.lecun_uniform
,权重来源的分布是 [ − l i m i t , l i m i t ] \rm [-limit, limit] [−limit,limit]的均匀分布,其中 l i m i t = 3 / m {\rm limit} = \sqrt{3/m} limit=3/m - 对
tf.initializers.lecun_normal
,权重来源的分布是均值为0,标准差为 1 / m \sqrt{1/m} 1/m的正态分布
Xavier初始化(Glorot初始化)
对神经网络的每一层,记其输入是 z i {\boldsymbol{z}^i} zi,输出(也就是下一层的输入)为 z i + 1 \boldsymbol{z}^{i+1} zi+1,有
s i = z i W i + b i z i + 1 = f ( s i ) \begin{aligned} \boldsymbol{s}^i &= \boldsymbol{z}^i\boldsymbol{W}^i + \boldsymbol{b}^i \\ \boldsymbol{z}^{i+1} &= f(\boldsymbol{s}^i) \end{aligned} sizi+1=ziWi+bi=f(si)
其中 f f f是非线性激活函数,且在0点处导数为1( f ′ ( 0 ) = 1 f'(0) = 1 f′(0)=1)。根据反向传播的定义,有
∂ c o s t ∂ s k i = ∂ z k i + 1 ∂ s k i ⋅ ∂ s i + 1 ∂ z k i + 1 ⋅ ∂ c o s t ∂ s i + 1 = f ′ ( s k i ) W k ⋅ i ∂ c o s t ∂ s i + 1 ∂ c o s t ∂ W k l i = z l i ∂ c o s t ∂ s k i \begin{aligned} \frac{\partial {\rm cost}}{\partial s_k^i} &= \frac{\partial z_k^{i+1}}{\partial s_k^i} \cdot \frac{\partial \boldsymbol{s}^{i+1}}{\partial z_k^{i+1}} \cdot \frac{\partial {\rm cost}}{\partial \boldsymbol{s}^{i+1}} \\ &= f'(s_k^i)\boldsymbol{W}_{k\cdot}^i\frac{\partial {\rm cost}}{\partial \boldsymbol{s}^{i+1}} \\ \frac{\partial {\rm cost}}{\partial W_{kl}^i} &= z_l^i\frac{\partial {\rm cost}}{\partial s_k^i} \end{aligned} ∂ski∂cost∂Wkli∂cost=∂ski∂zki+1⋅∂zki+1∂si+1⋅∂si+1∂cost=f′(ski)Wk⋅i∂si+1∂cost=zli∂ski∂cost
假设权重矩阵中的每一项都是独立初始化,而且输入的每一项方差都相同,记为 V a r [ x ] {\rm Var}[x] Var[x],则对于网络的第