本文内容参阅资料为《智能之门-神经网络与深度学习入门》和《解析卷积神经网络》两本书,以及部分网络资料,加以个人了解和内容提炼总结得到,文中一切直方图的图片来源于参阅资料3。

一,参数初始化概述

咱们知道神经网络模型一般是依托随机梯度下降优化算法进行神经网络参数更新的,而神经网络参数学习是非凸问题,利用梯度下降算法优化参数时,网络权重参数的初始值选取非常要害

首先得明确的是现代的网络参数初始化战略是简略的、启发式的。设定改善的初始化战略是一项困难的 任务,因为神经网络优化至今还未被很好地了解(即模型练习进程是一个黑盒)。

大多数初始化战略根据在神经网络初始化时实现一些很好的性质。可是,咱们并没有很好地了解这些性质中的哪些会在学习开端进行后的哪些情况下得以坚持。进一步的难点是,有些初始点从优化的观念看或许是有利的,可是从泛化的观念看是晦气的。咱们关于初始点怎么影响泛化的了解是适当原始的,几乎没有提供怎么挑选初始点的任何辅导。

1.1,进行网络参数初始化的原因

深度学习模型(神经网络模型)的练习算法通常是迭代的,因此模型练习者需求指定开端迭代的初始点,即择网络参数初始化战略。

1.2,网络参数初始化为什么重要

练习深度学习模型是一个满足困难的问题,以至于大多数算法都很大程度遭到网络初始化战略的影响。

模型迭代的初始点能够决议算法是否收敛,有些初始点非常不稳定,使得该算法会遭受数值困难,并可能完全失败。当学习收敛时,初始点能够决议学习收敛得多快,以及是否收敛到一个代价高或低的点。另外,即使是具有同一个损失代价的迭代点也会有不同极大的泛化差错,而迭代初始点也能够影响泛化(差错)。

二,权重初始化办法分类

在实践运用中,模型权重参数服从高斯散布Gaussian distribution)或均匀散布uniform distribution)都是较为有用的初始化办法。值得注意的是,这两种散布挑选的区别,现在还没有被翔实的研讨清楚,能够确定只有,初始散布的巨细确实对优化进程的结果和网络泛化才能都有很大的影响。

权重初始化随机值的初始化战略的散布都对模型性能有影响,可是影响的原理(神经网络优化原理)又没有被完全研讨清楚,所谓模型练习,还真不愧是炼丹,部分时分还真得靠炼丹人的经验。

另一种神经网络参数初始化战略总结如下:

  1. 加载预练习模型参数初始化:直接加载在大规模数据集上练习得到模型参数,必定程度上提升模型的泛化才能。
  2. 随机初始化:注意不能将参数值全部初始化为 0,因为如果神经网络第一遍前向传达一切隐层神经网络激活值相同,反向传达权重更新也相同,导致躲藏层的各个神经元没有区分性,导致“对称权重”现象。较好的办法是对每个参数进行随机初始化
  3. 固定参数值初始化:比如关于偏置(bias)通常用 0 初始化,LSTM 遗忘门偏置通常为 1或 2,使时序上的梯度变大,关于 ReLU 神经元,偏置设为 0.01,使得练习初期更容易激活。

虽然不同文章对参数初始化办法的分类有着不同的总结,因此,本文直接给出常用且有用的初始化办法名称,并以 Pytorch 结构为例,给出相应 API

2.1,全零初始化

虽然参数(权值)在抱负情况下应根本坚持正负参半的状态(期望为 0),可是,这不意味着能够将一切参数都初始化为 0W=0W=0)!零值初始化的权重矩阵值打印输出示例如下所示。

W1= [[-0.82452497 -0.82452497 -0.82452497]]
B1= [[-0.01143752 -0.01143752 -0.01143752]]
W2= [[-0.68583865]
     [-0.68583865]
     [-0.68583865]]
B2= [[0.68359678]] # 单个输出的的双层神经网络

能够看到 W1、B1、W2 内部 3 个单元的值都一样,这是因为初始值都是 0,所以梯度均匀回传,导致一切神经元的权重 W 的值都同步更新,没有任何不同,这样不管练习多少轮,结果也不会正确。

2.2,规范初始化

1,高斯散布初始化:运用高斯散布对每个参数随机初始化,即将权重 WW 按如下公式进行初始化:

W∼N[0,2]W \sim N[0, \sigma^2]

其间 NN 表明高斯散布(Gaussian Distribution,也叫做正态散布,Normal Distribution),上式是方位参数 =0\mu = 0期望值),尺度参数 2\sigma^2方差) 的高斯散布(也叫规范高斯散布)。有的地方也称为 Normal 初始化

Pytorch 结构中对应的 API 如下。

# 一般默认采用规范高斯散布初始化办法,即均值为 0,方差为 1,
torch.nn.init.normal_(tensor, mean=0, std=1)

2,与高斯散布初始化办法类似的是均匀散布初始化,其参数规模区是 [−r,r][-r, r]

Pytorch 结构中对应的 API 如下。

torch.nn.init.uniform_(tensor, a=0, b=1)

高斯散布和均匀散布都是固定方差参数的初始化办法,它们的要害是:怎么设置方差!

  • 如果太小,会导致神经元输出过小,经过多层则梯度信号消失了。
  • 如果太大,sigmoid 激活梯度挨近 0,导致梯度消失。一般需求合作 BN 层一同运用。

当方针问题较为简略、网络深度不大时,一般用规范初始化就能够了。可是当运用深度神经网络时,规范初始化在 Sigmoid 激活函数上的体现会遇到如下图 1 所示的问题。

神经网络基础部件-参数初始化详解

上图是一个 6层的深度网络,运用 全衔接层 + Sigmoid 激活函数的配置,图中表明的是各层激活函数的直方图。能够看到各层的激活值严峻向两侧 [0,1][0,1] 接近,从 Sigmoid 的函数曲线能够知道这些值的导数趋近于 0(激活函数值趋近于零,导数也趋近于零),反向传达时的梯度逐渐消失。处于中心地段的值比较少,对参数学习非常晦气。

传统的固定方差的高斯散布初始化办法,在网络变深的时分会使得模型很难收敛。

2.3,Xavier 初始化

根据上述调查(规范初始化在 Sigmoid 激活函数上的体现),Xavier Glorot 等人于 2010 年研讨出了下面的Xavier 初始化办法。

Xavier 初始化办法比直接用高斯散布进行初始化 WW 的优势在于:一般的神经网络在前向传达时神经元输出值的方差会不断增大,而运用 Xavier 等办法理论上能够确保每层神经元输入输出数据散布方差一致(和 BN 层作用类似,详细原理参阅Xavier 论文)。

条件:正向传达时,激活值的方差坚持不变;反向传达时,关于状态值的梯度的方差坚持不变。

运用 Sigmoid 激活函数时,Xavier 高斯散布初始化的公式如下所示:

W∼N(0,2nin+nout)W \sim N \begin{pmatrix} 0, \sqrt{\frac{2}{n_{in} + n_{out}}} \end{pmatrix}

Pytorch 结构中对应的 API 如下。

torch.nn.init.xavier_normal_(tensor, gain=1)

另外,还有 Xavier 均匀散布的公式如下所示(个人感觉运用频率不多)。

W∼U(−6nin+nout,6nin+nout)W \sim U \begin{pmatrix} -\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}} \end{pmatrix}

下图2展现了 Xavier 初始化在 Sigmoid 激活函数上的体现,其和图1都根据同一个深度为 6 层的网络。能够看到,后边几层的激活函数输出值的散布仍然根本符合正态散布,这有利于神经网络的学习。

神经网络基础部件-参数初始化详解

2.4,He 初始化

跟着深度学习的开展,人们觉得 Sigmoid 激活在反向传达算法中作用有限且会导致梯度消失问题,所以又提出了 ReLU 激活函数。

但 Xavier 初始化在 ReLU 激活函数上的体现并不好。跟着网络层的加深,运用 ReLU 时激活值逐渐向 0 偏向,这同样会导致梯度消失问题。

下图3展现了 Xavier 初始化在 ReLU 激活函数上的体现。

神经网络基础部件-参数初始化详解

所以 He Kaiming 等人于 2015 年提出了 He 初始化法(也叫做MSRA初始化法)。

He 初始化法最主要是想处理运用 ReLU 激活函数后,方差会发生变化的问题。

只考虑输入个数时,He 初始化是一个均值为 0,方差为 2/n2/n 的高斯散布,适合于 ReLU 激活函数:

W∼N(0,2n)W \sim N \begin{pmatrix} 0, \sqrt{\frac{2}{n}} \end{pmatrix}

其间 nn 为网络层输入神经元数量个数。

Pytorch 结构中对应的 API 如下。

torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

下图4 为 He 初始化在 ReLU 激活函数上的体现,所用网络和前面一样。

神经网络基础部件-参数初始化详解

2.5,总结

  • Xavier 初始化和 He 初始化意图都是想能够根据神经元衔接数量自适应调整初始化散布的方差,也称为“方差缩放”
  • 网络参数初始化办法的挑选对坚持数值稳定性至关重要,其与非线性激活函数的挑选得结合一同考虑。
  • 网络参数初始化的挑选能够决议优化算法收敛的速度有多快。糟糕挑选可能会导致咱们在练习神经网络模型时遇到梯度爆炸或梯度消失。

参阅资料

  • 《深度学习-8.4 参数初始化战略》
  • 《解析卷积神经网络-章 7 网络参数初始化》
  • AIEDU-15.1 权重矩阵初始化
  • 神经网络之权重初始化
  • 神经网络参数初始化小结