神经网络的参数初始化和批量归一化
1 参数初始化
神经网络的参数学习是一个非凸优化问题,在使用梯度下降法进行网络参数优化时,参数初始值的选取十分关键,关系到网络的优化效率(梯度消失和梯度爆炸问题)和泛化能力(局部最优解问题)。参数初始化的方式通常有以下三种:
-
预训练初始化:不同的参数初始值会收敛到不同的局部最优解。虽然这些局部最优解在训练集上的损失比较接近,但是它们的泛化能力差异很大。一 个好的初始值会使得网络收敛到一个泛化能力高的局部最优解。通常情况下,一个已经在大规模数据上训练过的模型可以提供一个好的参数初始值,这种初始化方法称为预训练初始化(Pre-trained Initialization)。预训练任务可以为监督学习或无监督学习任务。由于无监督学习任务更容易获取大规模的训练数据,因此被广泛采用。
-
固定值初始化:对于一些特殊的参数,我们可以根据经验用一个特殊的固定值来进行初始化。比如偏置(Bias)通常用 0 来初始化。在 LSTM 网络的遗忘门中,偏置通常初始化为 1 或 2,使得时序上的梯度变大。对于使用 ReLU 的神经元,有时也可以将偏置设为 0.01,使得 ReLU 神经元在训练初期更容易激活,从而获得一定的梯度来进行误差反向传播。
-
随机初始化:在线性模型的训练(比如感知器和 Logistic 回归)中,一般将参数全部初始化为 0。但是这在神经网络的训练中会存在一些问题。因为如果参数都为 0,在第一遍前向计算时,所有的隐藏层神经元的激活值都相同;在反向传播时,所有权重的更新也都相同,这样会导致隐藏层神经元没有区分性。这种现象也称为对称权重现象。为了打破这个平衡,比较好的方式是对每个参数都随机初始化(Random Initialization),使得不同神经元之间的区分性更好。
虽然预训练初始化通常具有更好的收敛性和泛化性,但是灵活性不够,不能在目标任务上任意地调整网络结构。因此,好的随机初始化方法对训练神经网络模型来说依然十分重要。这里我们介绍三类常用的随机初始化方法:基于固定方差的参数初始化、基于方差缩放的参数初始化和正交初始化方法。
1.1 基于固定方差的参数初始化
一种简单的随机初始化方法是从一个固定均值(通常为 0)和方差 \(sigma^2\) 的分布中采样来生成参数的初始值。基于固定方差的参数初始化方法主要有以下两种:
(1)高斯分布初始化:使用一个高斯分布 \(N(0, \sigma^2)\) 对每个参数进行随机初始化。
(2)均匀分布初始化:在一个给定的区间 \([-r, r]\) 内采用均匀分布来初始化参数。假设随机变量 \(x\) 在区间 \([a, b]\) 内均匀分布,则其方差为
因此,若使用区间为 \([-r, r]\) 的均匀分布来采样,并满足 \(var(x) = \sigma^2\) 时,则 \(r\) 的取值为
在基于固定方差的随机初始化方法中,比较关键的是如何设置方差 \(\sigma^2\)。如果参数范围取的太小,一是会导致神经元的输出过小,经过多层之后信号就慢慢消失了;二是还会使得 Sigmoid 型激活函数丢失非线性的能力。以 Sigmoid 型函数为例,在 0 附近基本上是近似线性的。这样多层神经网络的优势也就不存在了。如果参数范围取得太大,会导致输入状态过大。对于 Sigmoid 型激活函数来说,激活值变得饱和,梯度接近 0,从而导致梯度消失问题。
为了降低固定方差对网络性能以及优化效率的影响,基于固定方差的随机初始化方法一般需要配合逐层归一化来使用。
1.2 基于方差缩放的参数初始化
要高效地训练神经网络,给参数选取一个合适的随机初始化区间是非常重 要的。一般而言,参数初始化的区间应该根据神经元的性质进行差异化的设置。如果一个神经元的输入连接很多,它的每个输入连接上的权重就应该小一些,以避免神经元的输出过大(当激活函数为 ReLU 时)或过饱和(当激活函数为 Sigmoid 函数时)。
初始化一个深度网络时,为了缓解梯度消失或爆炸问题,我们尽可能保持每个神经元的输入和输出的方差一致,即 \(var(a^{(l)}) = var(a^{(l-1)})\),当然也有 \(var(z^{(l)}) = var(z^{(l-1)})\),根据神经元的连接数量来自适应地调整初始化分布的方差,这类方法称为方差缩放(Variance Scaling)。
1.2.1 Xavier 初始化
假设在一个神经网络中,第 \(l\) 层的一个神经元 \(a_i^{(l)}\) ,其接收前一层的 \(M_{l-1}\) 个神经元的输出 \(a_j^{(l-1)}, 1 \leq j \leq M_{l-1}\),
其中 \(f(\cdot)\) 为激活函数,\(w_{ij}^{(l)}\) 为参数,\(M_{l-1}\) 是第 \(l-1\) 层神经元个数。
在初始化阶段,将每个权重及每个输出视为随机变量,可做如下假设和推断:
- 网络输入的每个元素 \(x_1, x_2, \cdots\) 独立同分布;
- 同层的权重 \(w_{ij}\) 独立同分布,且期望 \(E(w) = 0\);
- 每层的权重 \(w\) 和输入 \(a\) 随机初始化且相互独立,所以两者之积构成的随机变量 \(w_{i1}a_1, w_{i2}a_2, \cdots\) 亦相互独立同分布;
- 根据上面的计算,同层的 \(a_1, a_2, \cdots\) 也独立同分布。
需要注意的是,上面独立同分布的假设仅在初始化阶段成立,当网络开始训练,根据反向传播公式,权重更新后不再相互独立。
由于 \(w_{ij}\) 已经承载了大多数的权重,这里设 \(b^{(l)} = 0\):
即:
(1)当激活函数 \(f(\cdot)\) 为恒等函数时,即 \(f(x) = x\),假设 \(E(a^{(l-1)}) = 0\),则上面公式为:
也就是说,输入信号的方差在经过该神经元后被放大或缩小了 \(M_{l-1}var(w^{(l)})\) 倍。为了使得在经过多层网络后,信号不被过分放大或过分减弱,我们尽可能保持每个神经元的输入和输出的方差一致。这样 \(M_{l-1}var(w^{(l)})\) 设为 1 比较合理,即
同理,为了使得在反向传播中,误差信号也不被放大或缩小,需要将 \(w^{(l)}\) 的方差保持为
作为折中,同时考虑信号在前向和反向传播中都不被放大或缩小,可以设置
在计算出参数的理想方差后,可以通过高斯分布或均匀分布来随机初始化参数。若采用高斯分布来随机初始化参数,连接权重 \(w^{(l)}\) 可以按 \(N(0, \frac{2}{M_{l-1} + M_{l}})\) 的高斯分布进行初始化。若采用区间为 \([−r, r]\) 的均分分布来初始化 \(w^{(l)}\),则 \(r\) 的取值为 \(\sqrt{\frac{6}{M_{l-1} + M_{l}}}\)。这种根据每层的神经元数量来自动计算初始化参数方差的方法称为Xavier 初始化。
(2)当激活函数 \(f(\cdot)\) 为 Tanh 函数时,Xavier 初始化也适用。这是因为神经元的参数和输入的绝对值通常比较小,处于激活函数的线性区间,且线性区间斜率为 1,这时候 tanh 函数可以视为线性函数。参数初始化采用高斯分布或者均匀分布与恒等函数情况下相同。
(3)当激活函数 \(f(\cdot)\) 为 Logistic 函数时,在线性区间斜率为 0.25,即 \(f(x) = 0.25x\),因此
因此初始化参数方差为 \(16 \times \frac{2}{M_{l-1} + M_l}\),遵循的高斯分布为 \(N(0, 16 \times \frac{2}{M_{l-1} + M_{l}})\),均匀分布的 \(r\) 取值为 \(4 \times \sqrt{\frac{6}{M_{l-1} + M_{l}}}\)。
1.2.2 He 初始化
当第 \(l\) 层神经元使用 ReLU 激活函数时,通常有一半的神经元输出为 0,
如果假定 \(w^{(l)}\) 来自某个关于原点对称的分布,因为 \(E(w^{(l-1)}) = 0\),且 \(b^{(l-1)} = 0\),则可以认为 \(z^{(l-1)}\) 分布的期望为 0,且关于原点 0 对称。
对于一个关于原点 0 对称的分布,经过 ReLU 后,仅保留大于 0 的部分,则有
上式进一步可得
类似的,需要放缩系数为 1, 即
因此当使用 ReLU 激活函数时,若使用高斯分布来初始化参数 \(w^{(l)}\),其方差我 \(\frac{2}{M_{l-1}}\);若采用区间为 \([-r, r]\) 的均匀分布来初始化参数,则 \(r = \sqrt{\frac{6}{M_{l-1}}}\)。
下表给出了 Xavier 初始化和 He 初始化的具体设置情况
1.3 正交初始化
暂略
2 批量归一化(Batch Normalization)
逐层归一化(Layer-wise Normalization)是将传统机器学习中的数据归一化方法应用到深度神经网络中,对神经网络中隐藏层的输入进行归一化,从而使得网络更容易训练。
这里的逐层归一化方法是指可以应用在深度神经网络中的任何一个中间层。实际上并不需要对所有层进行归一化。
常用的逐层归一化方法有:批量归一化、层归一化、权重归一化和局部响应归一化。下面着重介绍批量归一化。
2.1 批量归一化
对于一个深度神经网络,令第 \(l\) 层的净输入为 \(z^{(l)}\),神经元的输出为 \(a^{(l)}\) ,即
其中,\(f(\cdot)\) 是激活函数,\(W\) 和 \(b\) 是可学习的参数。
为了提高优化效率,就要使得净输入 \(z^{(l)}\) 的分布一致,比如都归一化到标准正态分布。虽然归一化操作也可以应用在输入 \(a^{(l-1)}\) 上,但归一化 \(z^{(l)}\) 更加有利 于优化(吴恩达的讲解中说归一化 \(a^{(l-1)}\) 还是 \(z^{(l)}\) 有一定的争论,但是在实践中一般归一化 \(z^{(l)}\) )。因此,在实践中归一化操作一般应用在仿射变换(Affine Transforma- tion)\(Wa^{(l-1)} + b\) 之后、激活函数之前,即
其中 \(E[z^{(l)}]\) 和 \(var(z^{(l)})\) 是指当前参数下,\(z^{(l)}\) 的每一维在整个训练集上的期望和方差。因为目前主要的优化算法是基于小批量的随机梯度下降法, Batch 归一化通常和训练集的 Mini-Batch 一起使用,所以准确的计算 \(z^{(l)}\) 的期望和方差是不可行的。因此,\(z^{(l)}\) 的期望和方差通常用当前小批量样本集的均值和方差近似估计。
给定一个包含 \(K\) 个样本的小批量样本集合,第 \(l\) 层神经元的净输入 \(z^{(1, l)}, z^{(2, l)}, \cdots, z^{(K, l)}\) 的均值和方差为
对净输入 \(z^{(l)}\) 的标准归一化会使得其取值集中到 0 附近,如果使用 Sigmoid 型激活函数时,这个取值区间刚好是接近线性变换的区间,减弱了神经网络的非线性性质。因此,为了使得归一化不对网络的表示能力造成负面影响,可以通过一个附加的缩放和平移变换改变取值区间。
其中 \(\gamma\) 和 \(\beta\) 分别代表缩放和平移的参数向量。从最保守的角度考虑,可以通过标准归一化的逆变换来使得归一化后的变量可以被还原为原来的值。当 \(\gamma = \sqrt{\sigma_B^2}, \beta = \mu_B\) 时,\(\hat{z}^{(l)} = z^{(l)}\)。
批量归一化操作可以看作一个特殊的神经层,加在每一层非线性激活函数之前,即
其中因为批量归一化本身具有平移变量,所以仿射变换 \(Wa^{(l-1)}\) 不再需要偏置参数。
参考
1.《神经网络和深度学习》邱锡鹏
2. 网络权重初始化方法总结(下):Lecun、Xavier与He Kaiming
3.《改善深度神经网络》吴恩达