邱锡鹏《神经网络与深度学习》学习笔记。
神经网络模型应用到机器学习的难点主要分为两个大类:
1. 优化问题
深度神经网络优化十分困难,主要表现为:
- 神经网络的损失函数是非凸函数,找到全局最优解比较困难。(简单粗暴的结论辅助理解:凸函数的局部最优解必然是全局最优解)
- 深度神经网络的参数非常多,训练数据也比较多,因此无法使用计算代价很高的二阶优化方法,而一阶优化方法的训练效率通常比较低。
- 深度神经网络存在梯度消失或爆炸问题。
2. 泛化问题
深度神经网络拟合能力很强,容易在训练集上过拟合。因此在训练时需要通过一定的正则化方法来改进网络的泛化能力。
1. 网络优化
介绍一些常用的优化算法、参数初始化方法、数据预处理方法、逐层归一化方法、超参数优化方法。
网络优化是指寻找神经网络模型来使得经验风最小化过程,包括模型选择以及参数学习等。
网络结构的多样性使得我们很难找到一种通用的优化方法。
深度神经网络的参数非常多,其参数学习是一个高维空间的非凸优化问题,这个问题的难点在于如何逃离鞍点(Saddle Point)。鞍点的梯度是 0,但是在一些维度上是最高点,在另一些维度上是最低点。
在高维空间中大部分驻点都是鞍点(梯度为 0 的点)。
基于梯度下降的优化方法会在鞍点附近接近于停滞,很难从这些鞍点中逃离。因此要采用随机梯度下降方法,通过在梯度方向上引入随机性、可以有效的逃离鞍点。
深度神经网络的参数非常多,并且具有一定的冗余性、这使得每个参数对最终损失的影响都比较小、因此会导致损失函数在局部最小解附近通常是一个平坦的区域,称为平坦最小值(Flat Minima),与之相对的一个概念是尖锐最小值(sharp minima)。
当一个模型收敛到一个平坦的局部最小值附近时,其鲁棒性会更好,即微小的参数变动不会剧烈的影响模型能力。因此理想的局部最小值应该是平坦的。
在非常大的神经网络中,大部分局部最小解是等价的,它们在测试集上的性能都计较相似。此外局部最小解对应的训练损失都可能非常接近于全局最小解对应的训练损失。因此在训练神经网络时,我们通常没必要找全局最小值,这反而可能导致过拟合。
1.1 优化算法
目前深度神经网络的参数学习主要通过梯度下降法来寻找一组可以最小化结构风险的参数。
梯度下降法可以分为:批量梯度下降、随机梯度下降和小批量梯度下降三种形式。根据不同的数据量和参数量可以选择一种具体的实现形式。
在训练深度神经网络时,通常训练数据集的规模都比很大,数据非常冗余。如果在梯度下降时,每次迭代都有计算整个数据集的梯度,即浪费计算资源又没有必要。因此,经常使用小批量梯度下降法(Mini-Batch Gradient Descent)。
令
f
(
x
;
θ
)
f(\boldsymbol{x};\theta)
f(x;θ)表示一个深度神经网络,
θ
\theta
θ为网络参数,在使用小批量梯度下降进行优化时,每次取
K
K
K个训练样本
S
t
=
{
(
x
(
k
)
,
y
(
k
)
)
}
k
=
1
K
\mathcal{S}_{t}=\left\{\left(\boldsymbol{x}^{(k)}, \boldsymbol{y}^{(k)}\right)\right\}_{k=1}^{K}
St={(x(k),y(k))}k=1K,第
t
t
t次迭代时损失函数关于参数
θ
\theta
θ的偏导数为
g
t
(
θ
)
=
1
K
∑
(
x
,
y
)
∈
S
t
∂
L
(
y
,
f
(
x
;
θ
)
)
∂
θ
\mathfrak{g}_{t}(\theta)=\frac{1}{K} \sum_{(\boldsymbol{x}, \boldsymbol{y}) \in \mathcal{S}_{t}} \frac{\partial \mathcal{L}(\boldsymbol{y}, f(\boldsymbol{x} ; \theta))}{\partial \theta}
gt(θ)=K1(x,y)∈St∑∂θ∂L(y,f(x;θ))
其中
L
(
⋅
)
\mathcal{L}(·)
L(⋅)为可微分的损失函数,
K
K
K为批量大小(Batch Size)。
使用梯度下降来更新参数
θ
t
←
θ
t
−
1
−
α
g
t
(
θ
t
−
1
)
\theta_{t} \leftarrow \theta_{t-1}-\alpha \mathfrak{g}_{t}(\theta_{t-1})
θt←θt−1−αgt(θt−1)
其中
α
>
0
\alpha>0
α>0 为学习率。
从上面的公式可以看出,影响小批量梯度下降算法的主要因素有:1. 批量大小 K K K, 2. 学习率 α \alpha α, 3. 梯度估计。下面分别从这三个方面来改进方法,以加快优化速度。
1.1.1 批量大小的选择
Batch Size 对网络优化的影响是非常大的。
一般而言,Batch Size越大,随机梯度的方差越小、训练越稳定,因此可以设置较大的学习率,而 Batch Size 较小时、需要设置较小的学习率,否则模型会不收敛。当Batch size较小时,简单有效的方法是学习率随 Batch Size 线性缩放(Linear Scaling),当Batch Size 较大时,线性缩放会使训练不稳定。
下图给出了从回合(Epoch)和迭代(Iteration)的角度,批量大小对损失下降的影响。每一次小批量更新为一次迭代,所有训练集的样本更新一次为一个回合,两者的关系为 :
1
回合 (Epoch)
=
(
训练样本的数量N
批量大小
K
)
×
迭代(Iteration)
1 \text { 回合 (Epoch) }=\left(\frac{\text { 训练样本的数量N }}{\text { 批量大小 } K}\right) \times \text { 迭代(Iteration) }
1 回合 (Epoch) =( 批量大小 K 训练样本的数量N )× 迭代(Iteration)
从图7.3a可以看出,批量大小越大,下降效果越明显,并且下降曲线越平滑。 但从图7.3b可以看出,如果按整个数据集上的回合(Epoch)数来看,则是批量样本数越小,适当小的批量大小会导致更快的收敛。
此外,批量大小和模型的泛化能力也有一定的关系。实验发现,批量越小,越有可能收敛到平坦最小值。
1.1.2 学习率调整
梯度下降法中,学习率是非常关键的超参数,学习率过大就不会收敛,过小则收敛速度太慢。
常用的学习率调整方法包括学习率衰减、学习率预热、周期性学习率调整、自适应学习率调整方法。
1.1.2.1 学习率衰减
根据经验,训练初期应采用大一些的学习率,以保证收敛速度,收敛到最优点附近时要采用小一点的学习率,以避免来回振荡。
学习率衰衰减也称为学习率退火(Learning rate annealing)。
假设初始化学习率为 α 0 \alpha_0 α0,在第 t t t次迭代的学习率为 α t \alpha_t αt.常见的学习率衰减方法有以下几种:
分段常数衰减(Piecewise constant Decay):也称为阶梯衰减(step decay),即每经过 T 1 , T 2 , . . . , T m T_1,T_2,...,T_m T1,T2,...,Tm次迭代,将学习率衰减为原来的 β 1 , β 2 , . . . , β m \beta_1,\beta_2,...,\beta_m β1,β2,...,βm倍,其中 T m , β m T_m,\beta_m Tm,βm为根据经验设置的超参数。
逆时衰减(inverse time decay): α t = α 0 1 1 + β × t \alpha_{t}=\alpha_{0} \frac{1}{1+\beta \times t} αt=α01+β×t1,其中 β \beta β为衰减率。
指数衰减(Exponential decay): α t = α 0 β t \alpha_{t}=\alpha_{0} \beta^t αt=α0βt。
自然指数衰减: α t = α 0 exp ( − β × t ) \alpha_{t}=\alpha_{0} \exp (-\beta \times t) αt=α0exp(−β×t)。
余弦衰减: α t = 1 2 α 0 ( 1 + cos ( t π T ) ) \alpha_{t}=\frac{1}{2} \alpha_{0}\left(1+\cos \left(\frac{t \pi}{T}\right)\right) αt=21α0(1+cos(Ttπ)),其中 T T T为总的迭代次数。
下图给出了不同衰减方法的实例(
α
0
=
1
\alpha_0=1
α0=1).
1.1.2.2 学习率预热 Gradual Warmup
在小批量梯度下降法中,当批量大小设置的比较大时,通常需要较大的学习率,但刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,这样会使得训练不稳定。
学习率预热:为了提高训练的稳定性,可以在最初的几轮迭代时采用较小的学习率,等到梯度下降到一定程度后在恢复到初始的学习率。
一个常用的方法是逐渐预热。假设预热的迭代次数为
T
′
T^{\prime}
T′在预热过程中每次更新的学习率为
α
t
′
=
t
T
′
α
0
,
1
≤
t
≤
T
′
\alpha_{t}^{\prime}=\frac{t}{T^{\prime}} \alpha_{0}, \quad 1 \leq t \leq T^{\prime}
αt′=T′tα0,1≤t≤T′
1.1.2.3 周期性学习率调整
为了使得梯度下降法能够逃离鞍点或尖锐最小值,一种经验性的方法是在训练过程中周期性的增大学习率。
两种常用的周期性调整学习率的方法:
循环学习率 cyclic learning rate。让学习率在一个区间内周期性的增大和缩小。通常采用线性缩放来调整学习率,称为三角循环学习率(triangular cyclic learning rate)。假设每个循环的周期长度为 2 T 2T 2T,在前 T T T步学习率线性增大,后 T T T步学习率线性缩小。
带热重启的随机梯度下降(Stochastic gradient descent with warm restarts,SGDR)。学习率逐渐衰减(如余弦衰减),然后每间隔一定周期后重新初始化为某个预设值。
1.1.2.4 自适应学习率调整
在标准的梯度下降法中,每个参数在每次迭代时都使用相同的学习率。由于每个参数的维度上收敛速度都不同,因此可以根据不同参数的收敛情况为每个参数分别设置学习率。
AdaGrad 算法(Adaptive Gradient Algorithm)。在 AdaGrad 算法中,如果某个参数的偏导数累积比较大,其学习率相对较 小;相反,如果其偏导数累积较小,其学习率相对较大。但整体是随着迭代次数的增加,学习率逐渐缩小。
AdaGrad 算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由 于这时的学习率已经非常小,很难再继续找到最优点。
RMSprop 算法,RMSProp 算法和 AdaGrad 算法的区别是在迭代过程中,每个参数的学习率既可以变小也可以变大。可以在有些情况下避免 AdaGrad 算法中学习率不断单调下降以至于过早衰减的缺点。
AdaDelta 算法 也是 AdaGrad 算法的一个改进。在一定程度上平抑了学习率的波动。
1.1.3 梯度估计修正
在随机(小批量)梯度下降法中,如果每次选取样本数量比较小,损失会呈振荡下降。也就是说,随机梯度下降方法中每次迭代的梯度估计和整个训练集上的最优梯度并不一致,具有一定的随机性。一种有效的缓解梯度估计随机性的方式是通过使用最近一段时间内的平均梯度来替代当前时刻的随机梯度来作为参数的更新方向,从而提高优化速度。
1.1.3.1 动量法(Momentum Method)
动量是物理中的概念。一个物体的动量是指该物体在它运动方向上保持运动的趋势,是该物体的质量和速度的乘积。动量法是用之前积累动量来替代真正的梯度。每次迭代的梯度可以看做加速度。
在第
t
t
t次迭代时,计算负梯度的加权移动平均作为参数的更新方向,
Δ
θ
t
=
ρ
Δ
θ
t
−
1
−
α
g
t
=
−
α
∑
τ
=
1
t
ρ
t
−
τ
g
τ
\Delta \theta_{t}=\rho \Delta \theta_{t-1}-\alpha \boldsymbol{g}_{t}=-\alpha \sum_{\tau=1}^{t} \rho^{t-\tau} \boldsymbol{g}_{\tau}
Δθt=ρΔθt−1−αgt=−ατ=1∑tρt−τgτ
其中
ρ
\rho
ρ为动量因子,通常设为 0.9,
α
\alpha
α为学习率。
这样,每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小;想法,当最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。一般而言,迭代初期,梯度方向比较一致,动量法会起加速;迭代后期,梯度方向会不一致,在收敛值附近震荡,动量法会起到减速作用,增加稳定性。
1.1.3.2 Nesterov 加速梯度(NAG)
Nesterov 加速梯度(Nesterov Accelerated Gradient,NAG)是一种对动量法的改进,也称为Nesterov 动量法(Nesterov Momentum)。
在动量法中,实际的参数更新方向
Δ
θ
t
\Delta \theta_{t}
Δθt为上一步的参数更新方向
Δ
θ
t
−
1
\Delta \theta_{t-1}
Δθt−1和当前梯度的反方向
−
α
g
t
-\alpha \boldsymbol{g}_{t}
−αgt的叠加。这样,
Δ
θ
t
\Delta \theta_{t}
Δθt的更新可以拆分成两步:
θ
^
=
θ
t
−
1
+
ρ
Δ
θ
t
−
1
θ
t
=
θ
^
−
α
g
t
\begin{aligned} \hat{\theta} &=\theta_{t-1}+\rho \Delta \theta_{t-1} \\ \theta_{t} &=\hat{\theta}-\alpha \boldsymbol{g}_{t} \end{aligned}
θ^θt=θt−1+ρΔθt−1=θ^−αgt
其中
g
t
\boldsymbol{g}_t
gt为
θ
t
−
1
\theta_{t-1}
θt−1上的梯度,而更合理的更新方向应该为
θ
^
\hat{\theta}
θ^上的梯度。
这样合并后的更新方向为
Δ
θ
t
=
ρ
Δ
θ
t
−
1
−
α
g
t
(
θ
t
−
1
+
ρ
Δ
θ
t
−
1
)
\Delta \theta_{t}=\rho \Delta \theta_{t-1}-\alpha \mathfrak{g}_{t}\left(\theta_{t-1}+\rho \Delta \theta_{t-1}\right)
Δθt=ρΔθt−1−αgt(θt−1+ρΔθt−1)
其中
g
t
(
θ
t
−
1
+
ρ
Δ
θ
t
−
1
)
\mathfrak{g}_{t}\left(\theta_{t-1}+\rho \Delta \theta_{t-1}\right)
gt(θt−1+ρΔθt−1)表示损失函数在点
θ
^
=
θ
t
−
1
+
ρ
Δ
θ
t
−
1
\hat{\theta} =\theta_{t-1}+\rho \Delta \theta_{t-1}
θ^=θt−1+ρΔθt−1上的偏导数。
下图给出了动量法和 Nesterov 加速梯度在参数更新时的比较。
1.1.3.3 Adam 算法
Adaptive Moment Estimation Algorithm.不但使用动量法作为参数更新方向,而且可以自适应调整学习率。可以看做是动量法与 RMSprop 算法的结合。
M
t
=
β
1
M
t
−
1
+
(
1
−
β
1
)
g
t
G
t
=
β
2
G
t
−
1
+
(
1
−
β
2
)
g
t
⊙
g
t
\begin{array}{c}M_{t}=\beta_{1} M_{t-1}+\left(1-\beta_{1}\right) g_{t} \\ G_{t}=\beta_{2} G_{t-1}+\left(1-\beta_{2}\right) g_{t} \odot g_{t}\end{array}
Mt=β1Mt−1+(1−β1)gtGt=β2Gt−1+(1−β2)gt⊙gt
其中
β
1
\beta_1
β1和
β
2
\beta_2
β2分布为两个移动平均的衰减率,通常分别取值为0.9 和 0.99。我们可以把
M
t
M_t
Mt和
G
t
G_t
Gt分别看做梯度的均值(一阶矩)和未减去均值的方差(二阶矩)。
假设
M
0
=
0
,
G
0
=
0
M_0=0,G_0=0
M0=0,G0=0,那么初期
M
t
M_t
Mt和
G
t
G_t
Gt的值会比真实的均值和方差要小。因此要对偏差进行修正。
M
^
t
=
M
t
1
−
β
1
t
G
^
t
=
G
t
1
−
β
2
t
\begin{aligned} \hat{M}_{t} &=\frac{M_{t}}{1-\beta_{1}^{t}} \\ \hat{G}_{t} &=\frac{G_{t}}{1-\beta_{2}^{t}} \end{aligned}
M^tG^t=1−β1tMt=1−β2tGt
Adam 算法的参数更新差值为
Δ
θ
t
=
−
α
G
^
t
+
ϵ
M
^
t
\Delta \theta_{t}=-\frac{\alpha}{\sqrt{\hat{G}_{t}+\epsilon}} \hat{M}_{t}
Δθt=−G^t+ϵαM^t
其中学习率
α
\alpha
α通常设置为 0.001,并且也可以进行衰减。
1.1.3.4 梯度截断(Gradient Clipping)
梯度爆炸也是影响深度神经网络学习效率的主要因素。在梯度下降中,如果梯度突然增大,用大的梯度更新参数反而会导致其远离最优点。为避免这种情况,当梯度的模大于一定的阈值时,可以对梯度进行截断。
梯度截断是一种比较简单的启发式方法。常用方法有:
按值截断:给定一个区间
[
a
,
b
]
[a,b]
[a,b]
g
t
=
max
(
min
(
g
t
,
b
)
,
a
)
\boldsymbol{g}_t=\max \left(\min \left(\boldsymbol{g}_t, b\right), a\right)
gt=max(min(gt,b),a)
按模截断:给定截断阈值 b b b,如果 ∥ g t ∥ 2 ≤ b \left\|g_{t}\right\|^{2} \leq b ∥gt∥2≤b 梯度保持不变,如果 ∥ g t ∥ 2 > b \left\|g_{t}\right\|^{2} > b ∥gt∥2>b,令 g t = b ∥ g t ∥ g t \boldsymbol{g}_{t}=\frac{b}{\left\|\boldsymbol{g}_{t}\right\|} \boldsymbol{g}_{t} gt=∥gt∥bgt。
阈值 b b b是一个超参数,实验发现,训练过程对阈值并不十分敏感。
1.2 参数初始化
当使用梯度下降算法来进行网络参数优化时,不同的参数初始化数值会收敛到不同的局部最优解,这些局部最优解在训练集上的损失比较接近,但他们的泛化能力差异很大。另外参数初始化还关系到网络的优化效率。
参数初始化的方式通常有以下三种:
- 预训练初始化(pre-trained initialization)。采用一个已经在大规模数据上训练过的模型的参数作为自己的参数初始值。
预训练模型在目标任务上的学习过程也称为微调(Fine-Tuning)。 - 随机初始化(random initialization)。如果神经网络初始化参数都相同,那么在反向传播时,所有的权重更新也都相同,这样会导致隐藏层神经元没有区分性。这种现象也称为对称权重现象。为了打破这个平衡,比较好的方式是对每个参数都随机初始化。
- 固定值初始化。根据经验用一个特殊的固定值初始化一下特殊参数。例如偏置(Bias)通常初始化为 0,但自 LSTM 的遗忘门中通常初始化为 1 或 2,使得时序上的梯度变大。对于使用 ReLU 的神经元,可将偏置设为 0.01,使得神经元在训练初期更容易激活。
虽然预训练初始化方法通常具有很好的收敛性和泛化性,但灵活性不足。下面介绍三种常用的随机初始化方法:基于固定方差的参数初始化、基于方差缩放的参数初始化和正交初始化方法。
1.2.1 基于固定方差的参数初始化
一种简单的随机初始化的方法是从一个固定均值(通常为 0)和方差 σ 2 \sigma^2 σ2的分布中采样来生成参数的初始值。常用分布有两种:
- 高斯分布 N ( 0 , σ 2 ) \mathcal{N}\left(0, \sigma^{2}\right) N(0,σ2)
- 均匀分布 [ − r , r ] [-r,r] [−r,r] ,其方差为 σ 2 \sigma^2 σ2时, r = 3 σ 2 r=\sqrt{3 \sigma^{2}} r=3σ2。
方差
σ
2
\sigma^2
σ2的设置十分关键。
若参数取值范围太小,一是会导致神经元的输出过小,经过多层之后信号就慢慢消失了;二是会使得 Sigmoid 型激活函数丢失非线性能力,因为 Sigmoid 型的激活函数在 0 附近是近似线性的。
若参数取值范围太大, Sigmoid 型激活函数的梯度会接近于 0,从而导致梯度消失问题。
固定方差的随机初始化方法一般需要配合逐层归一化来使用。
1.2.2 基于方差缩放的参数初始化
初始化一个神经网络时,为了缓解梯度消失或爆炸问题,我们尽可能保持每个神经元的输入和输出的方差一致。
如果一个神经元的输入连接很多,它的每个输入连接上的权重就应该小一些,以避免神经元的输出过大(当激活函数为ReLU时)或过饱和(当激活函数为 Sigmoid 时)。根据神经元的连接数量来自适应的调整初始化分布的方差,这类方法称为方差缩放(Variance Scaling)。
1.2.2.1 Xavier 初始化
假设在一个神经网络中,第
l
l
l层的一个神经元
a
(
l
)
a^{(l)}
a(l)接收前一层的
M
l
−
1
M_{l-1}
Ml−1个神经元的输出
a
i
l
−
1
a_i^{l-1}
ail−1,则
a
(
l
)
=
f
(
∑
i
=
1
M
l
−
1
w
i
(
l
)
a
i
(
l
−
1
)
)
a^{(l)}=f\left(\sum_{i=1}^{M_{l-1}} w_{i}^{(l)} a_{i}^{(l-1)}\right)
a(l)=f(i=1∑Ml−1wi(l)ai(l−1))
神经元的参数和输入的绝对值通常比较小,Logistic 函数和 Tanh 函数可以近似为线性函数,因此为便于推导我们假设激活函数为恒等式
f
(
x
)
=
x
f(x)=x
f(x)=x,
w
i
(
l
)
w_{i}^{(l)}
wi(l)和
a
i
(
l
−
1
)
a_{i}^{(l-1)}
ai(l−1)的均值都为 0,且相互独立则
a
(
l
)
a^{(l)}
a(l)的方差为
var
(
a
(
l
)
)
=
var
(
∑
i
=
1
M
l
−
1
w
i
(
l
)
a
i
(
l
−
1
)
)
=
∑
i
=
1
M
l
−
1
var
(
w
i
(
l
)
)
var
(
a
i
(
l
−
1
)
)
=
M
l
−
1
var
(
w
i
(
l
)
)
var
(
a
i
(
l
−
1
)
)
\begin{aligned} \operatorname{var}\left(a^{(l)}\right) &=\operatorname{var}\left(\sum_{i=1}^{M_{l-1}} w_{i}^{(l)} a_{i}^{(l-1)}\right) \\ &=\sum_{i=1}^{M_{l-1}} \operatorname{var}\left(w_{i}^{(l)}\right) \operatorname{var}\left(a_{i}^{(l-1)}\right) \\ &=M_{l-1} \operatorname{var}\left(w_{i}^{(l)}\right) \operatorname{var}\left(a_{i}^{(l-1)}\right) \end{aligned}
var(a(l))=var(i=1∑Ml−1wi(l)ai(l−1))=i=1∑Ml−1var(wi(l))var(ai(l−1))=Ml−1var(wi(l))var(ai(l−1))
也就是说,输入信号的方差在经过神经元后被缩放了
M
l
−
1
var
(
w
i
(
l
)
)
M_{l-1}\operatorname{var}\left(w_{i}^{(l)}\right)
Ml−1var(wi(l))倍。为了使得经过多层神经网络后信号不被过分的放大或缩小,设置
M
l
−
1
var
(
w
i
(
l
)
)
=
1
M_{l-1}\operatorname{var}\left(w_{i}^{(l)}\right)=1
Ml−1var(wi(l))=1 比较合理。即
var
(
w
i
(
l
)
)
=
1
M
l
−
1
\operatorname{var}\left(w_{i}^{(l)}\right)=\frac{1}{M_{l-1}}
var(wi(l))=Ml−11
同理为了使得反向传播中误差不被放大或缩小,需要
var
(
w
i
(
l
)
)
=
1
M
l
\operatorname{var}\left(w_{i}^{(l)}\right)=\frac{1}{M_{l}}
var(wi(l))=Ml1
作为折衷,同时考虑前向和反向传播,可以设置为
var
(
w
i
(
l
)
)
=
2
M
l
−
1
+
M
l
\operatorname{var}\left(w_{i}^{(l)}\right)=\frac{2}{M_{l-1}+M_l}
var(wi(l))=Ml−1+Ml2
这种根据每层神经元的数量来自动计算初始化参数方差的方法称为 Xavier 初始化。
上述方差是假设激活函数为恒等函数时推导的,使用 Logistic 或 Tanh 函数的神经层通常再乘以一个缩放因子。
1.2.2.2 He 初始化
当第
l
l
l层神经元使用 ReLU 激活函数时,通常有一半的神经元输出为 0,因此其分布的方差也近似为使用恒等函数时的一半。这样只考虑前向传播时,参数
w
i
l
w_i^{l}
wil的理想方差为
var
(
w
i
(
l
)
)
=
2
M
l
−
1
\operatorname{var}\left(w_{i}^{(l)}\right)=\frac{2}{M_{l-1}}
var(wi(l))=Ml−12
这种初始化方法称为 He 初始化。
下表给出了 Xavier 初始化和 He 初始化的具体设置情况。
1.2.3 正交初始化
上述两种基于方差的初始化方法都是对权重矩阵中的每个参数进行独立采样。由于采样的随机性,依然可能出现梯度消失或梯度爆炸问题。
假设一个
L
L
L层的等宽网络(激活函数为恒等式)为
y
=
W
(
L
)
W
(
L
−
1
)
…
W
(
1
)
x
\boldsymbol{y}=\boldsymbol{W}^{(L)} \boldsymbol{W}^{(L-1)} \ldots \boldsymbol{W}^{(1)} \boldsymbol{x}
y=W(L)W(L−1)…W(1)x
误差的反向传播公式为
δ
(
l
−
1
)
=
(
W
(
l
)
)
⊤
δ
(
l
)
\delta^{(l-1)}=\left(\boldsymbol{W}^{(l)}\right)^{\top} \delta^{(l)}
δ(l−1)=(W(l))⊤δ(l),为避免梯度消失或爆炸,我们希望误差项在反向传播中具有范数保持性(Norm-Preserving),即
∥
δ
(
l
−
1
)
∥
2
=
∥
δ
(
l
)
∥
2
=
∥
(
W
(
l
)
)
⊤
δ
(
l
)
∥
2
\left\|\delta^{(l-1)}\right\|^{2}=\left\|\delta^{(l)}\right\|^{2}=\left\|\left(\boldsymbol{W}^{(l)}\right)^{\top} \delta^{(l)}\right\|^{2}
∥∥δ(l−1)∥∥2=∥∥δ(l)∥∥2=∥∥∥∥(W(l))⊤δ(l)∥∥∥∥2。
因此需要将 W ( l ) W^{(l)} W(l)初始化为正交矩阵,即 W ( l ) ( W ( l ) ) ⊤ = I W^{(l)}\left(W^{(l)}\right)^{\top}=I W(l)(W(l))⊤=I,正在方法称为正交初始化。
正交初始化的具体实现过程可以分为两步:
- 用均值为 0、方差为 1 的高斯分布初始化一个矩阵;
- 将这个矩阵用奇异值分解得到两个正交矩阵,并使用其中之一作为权重矩阵。
当在非线性神经网络中应用正交化时,通常要乘以一个缩放系数,如 ReLU 的缩放系数可设置为 2 \sqrt{2} 2。
1.3 数据预处理
要解决两个问题:尺度不变性(归一化),数据特征相关性(白化)。
一般而言,样本特征由于来源以及度量单位不同,它们的尺度(Scale)往往差异很大。不同机器学习模型对数据特征尺度的敏感程度不一样。如果一个机器学习所安抚在缩放全部或部分特征后不影响它的学习和预测,我们就称该算法具有尺度不变性。
对于尺度敏感的模型,必须先对样本进行预处理将各个维度的特征转换到相同的取值区间,并且消除不同特征之间的相关性,才能获取比较理想的结果。
下图给出了数据归一化对梯度的影响。尺度不同会造成大多数位置上的梯度方向并不是最优搜索方向,影响梯度下降法的效率。
归一化(Normalization)方法泛指把数据特征转换为相同尺度的方法。比如把数据特征映射到 [0, 1] 或 [−1, 1] 区间内,或者映射为服从均值为 0、方差为 1 的标准正态分布。
介绍几种神经网络中常用的归一化方法。
最大最小归一化(Min-Max Normalization)。通过缩放每个特征的取值范围到[0,1]或[-1,1]之间。假设有
N
N
N 个样本
{
x
(
n
)
}
n
=
1
N
\left\{\boldsymbol{x}^{(n)}\right\}_{n=1}^{N}
{x(n)}n=1N,对于每一维特征
x
x
x,归一化后的特征为
x
^
(
n
)
=
x
(
n
)
−
min
n
(
x
(
n
)
)
max
n
(
x
(
n
)
)
−
min
n
(
x
(
n
)
)
\hat{x}^{(n)}=\frac{x^{(n)}-\min _{n}\left(x^{(n)}\right)}{\max _{n}\left(x^{(n)}\right)-\min _{n}\left(x^{(n)}\right)}
x^(n)=maxn(x(n))−minn(x(n))x(n)−minn(x(n))其中
min
(
x
)
\min(x)
min(x)和
max
(
x
)
\max(x)
max(x)分别为特征
x
x
x 在所有样本上的最小值和最大值。
标准化(Standardization)也叫 Z 值归一化(Z-Score Normalization)。将每一维特征都调整为均值为 0,方差为 1。对于每一维特征,先计算他的均值和方差:
μ
=
1
N
∑
n
=
1
N
x
(
n
)
σ
2
=
1
N
∑
n
=
1
N
(
x
(
n
)
−
μ
)
2
\begin{aligned} \mu &=\frac{1}{N} \sum_{n=1}^{N} x^{(n)} \\ \sigma^{2} &=\frac{1}{N} \sum_{n=1}^{N}\left(x^{(n)}-\mu\right)^{2} \end{aligned}
μσ2=N1n=1∑Nx(n)=N1n=1∑N(x(n)−μ)2
然后计算归一化特征值
x
^
(
n
)
\hat{x}^{(n)}
x^(n):
x
^
(
n
)
=
x
(
n
)
−
μ
σ
\hat{x}^{(n)}=\frac{x^{(n)}-\mu}{\sigma}
x^(n)=σx(n)−μ
注意,如果标准差为 0,说明这一维特征没有任何区分性,可以直接删掉。
白化(whitening)。用于降低输入数据特征之间的冗余性。输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相同的方差。白化的主要实现方式是使用主成分分析(principal component analysis,PCA)方法去掉各个成分之间的相关性。
1.4 逐层归一化
逐层归一化(Layer-wise Normalization)是对深度神经网络中隐藏层的输入进行归一化,从而使网络更容易训练。注意,这里的逐层是指神经网络中的任何一个中间层,实际上并不需要对所有层进行归一化。
逐层归一化可以有效的提高训练效率的原因:
1.更好的尺度不变性
在深度神经网络中,前一层的输出是后一层的输入,前一层每次参数更新,都会导致后一层的输入分布发生很大改变,越高的层,其输入分布改变月明显。这种现象叫做内部协变量偏移(Internal Covariate Shift)。
从机器学习的角度来看,如果一个神经层的输入分布发生了改变,那么其参数需要重新学习。
为了缓解这个问题,我们把每个神经层的输入分布都归一化为标准正态分布,可使得每个神经层对其输入具有更好的尺度不变性。另外,尺度不变性可使得我们更加高效的进行参数初始化及超参数选择。
2.更平滑的优化地形
逐层归一化可以使得大部分神经层的输入处于不饱和状态,从而让梯度变大,避免梯度消失问题;另一方面还可以使得神经网络的优化地形(optimization landscape)更加平滑,以及使梯度更加稳定,从而允许我们使用更大的学习率,并提高收敛速度。
1.4.1 批量归一化
Batch Normalization,BN,2015。
对于一个深度神经网络,令第
l
l
l层的净输入为
z
(
l
)
\boldsymbol{z}^{(l)}
z(l),神经元的输出为
a
(
l
)
\boldsymbol{a}^{(l)}
a(l),即
a
(
l
)
=
f
(
z
(
l
)
)
=
f
(
W
a
(
l
−
1
)
+
b
)
\boldsymbol{a}^{(l)}=f\left(\boldsymbol{z}^{(l)}\right)=f\left(\boldsymbol{W} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}\right)
a(l)=f(z(l))=f(Wa(l−1)+b)
为提高优化效率,就要使得净输入
z
(
l
)
\boldsymbol{z}^{(l)}
z(l)的分布一致,比如都归一化到标准正态分布。
在实践中一般将归一化应用在仿射变换 W a ( l − 1 ) + b \boldsymbol{W} \boldsymbol{a}^{(l-1)}+\boldsymbol{b} Wa(l−1)+b之后,激活函数之前。即归一化净输入 z ( l ) \boldsymbol{z}^{(l)} z(l)。
逐层归一化要在中间层进行操作,要求效率比较高,因此一般使用标准化将净输入
z
(
l
)
\boldsymbol{z}^{(l)}
z(l)的每一维都归一到标准正态分布。
z
^
(
l
)
=
z
(
l
)
−
E
[
z
(
l
)
]
var
(
z
(
l
)
)
+
ϵ
\hat{\boldsymbol{z}}^{(l)}=\frac{\boldsymbol{z}^{(l)}-\mathbb{E}\left[\boldsymbol{z}^{(l)}\right]}{\sqrt{\operatorname{var}\left(\boldsymbol{z}^{(l)}\right)+\epsilon}}
z^(l)=var(z(l))+ϵz(l)−E[z(l)]
在进行归一化时, z ( l ) \boldsymbol{z}^{(l)} z(l)的期望 E [ z ( l ) ] \mathbb{E}\left[\boldsymbol{z}^{(l)}\right] E[z(l)]和方差 var ( z ( l ) ) \operatorname{var}\left(\boldsymbol{z}^{(l)}\right) var(z(l))通常用当前小批量样本集的均值和方差近似估计。
对净输入 z ( l ) \boldsymbol{z}^{(l)} z(l)的标准归一化,会使其取值集中到 0 附近,如果使用 Sigmoid 激活函数,这个区间会减弱神经网络的非线性性质。可以通过一个附加的缩放和平移变换改变取值区间。
另外,批量归一化本身具有平移变换,所以神经网络的仿射变换 W a ( l − 1 ) \boldsymbol{W} \boldsymbol{a}^{(l-1)} Wa(l−1)不再需要偏置参数。
值得一提的是,逐层归一化不但可以提高优化效率,还能提高网络的泛化能力。
1.4.2 层归一化
批量归一化是对一个中间层的单个神经元进行归一化操作,因此要求小批量样本的数量不能太小,否则难以计算单个神经元的统计信息。此外,如果一个神经元的净输入的分布在神经网络中是动态变化的,比如循环神经网络,那么就无法应用批量归一化操作。
层归一化(Layer Nomalization)是对一个中间层的所有神经元进行归一化。
对于一个深度神经网络,第
l
l
l层的神经元数量为
M
l
M_l
Ml,令第
l
l
l层神经元的净输入为
z
(
l
)
\boldsymbol{z}^{(l)}
z(l),其均值和方差为
μ
(
l
)
=
1
M
l
∑
i
=
1
M
l
z
i
(
l
)
σ
(
l
)
2
=
1
M
l
∑
i
=
1
M
l
(
z
i
(
l
)
−
μ
(
l
)
)
2
\begin{aligned} \mu^{(l)} &=\frac{1}{M_{l}} \sum_{i=1}^{M_{l}} z_{i}^{(l)} \\ \sigma^{(l)^{2}} &=\frac{1}{M_{l}} \sum_{i=1}^{M_{l}}\left(z_{i}^{(l)}-\mu^{(l)}\right)^{2} \end{aligned}
μ(l)σ(l)2=Ml1i=1∑Mlzi(l)=Ml1i=1∑Ml(zi(l)−μ(l))2
层归一化定义为
z
^
(
l
)
=
z
(
l
)
−
μ
(
l
)
σ
(
l
)
2
+
ϵ
⊙
γ
+
β
≜
L
N
γ
,
β
(
z
(
l
)
)
\begin{aligned} \hat{\boldsymbol{z}}^{(l)} &=\frac{\boldsymbol{z}^{(l)}-\mu^{(l)}}{\sqrt{\sigma^{(l)^{2}}+\epsilon}} \odot \boldsymbol{\gamma}+\boldsymbol{\beta} \\ & \triangleq \mathrm{LN}_{\gamma, \beta}\left(z^{(l)}\right) \end{aligned}
z^(l)=σ(l)2+ϵz(l)−μ(l)⊙γ+β≜LNγ,β(z(l))
其中
γ
,
β
\boldsymbol{\gamma},\boldsymbol{\beta}
γ,β分别代表缩放和平移的参数向量,维数和
z
(
l
)
\boldsymbol{z}^{(l)}
z(l)相同。
循环神经网络中的层归一化
时刻
t
t
t,循环神经网络的隐藏层为
h
t
\boldsymbol{h}_{t}
ht,其归一化更新为
z
t
=
U
h
t
−
1
+
W
x
t
h
t
=
f
(
L
N
γ
,
β
(
z
t
)
)
\begin{aligned} \boldsymbol{z}_{t} &=\boldsymbol{U} \boldsymbol{h}_{t-1}+\boldsymbol{W} \boldsymbol{x}_{t} \\ \boldsymbol{h}_{t} &=f\left(\mathrm{LN}_{\gamma, \beta}\left(\boldsymbol{z}_{t}\right)\right) \end{aligned}
ztht=Uht−1+Wxt=f(LNγ,β(zt))
其中输入
x
t
\boldsymbol{x}_{t}
xt为第
t
t
t时刻的输入,
W
\boldsymbol{W}
W和
U
\boldsymbol{U}
U为网络参数。
一般而言 BN 是一种更好的选择,当小批量样本数较小时,可选择 LN。
1.4.3 权重归一化
Weight Normalization 是对神经网络的连接权重进行归一化,通过再参数化方法,将连接权重分解为长度和方向两种参数。
…
1.4.4 局部响应归一化
Local Response Normalization(LRN)是对临近的特征映射进行局部归一化。通常用在基于卷积的图像处理上。
局部响应归一化和层归一化都是对同层的神经元进行归一化。不同的是,局部归一化应用在激活函数之后,只是对邻近的神经元进行局部归一化,并且不减去均值。
局部响应归一化和生物神经元中的侧抑制(lateral inhibition)现象比较类似,即活跃神经元对相邻神经元具有抑制作用。当使用 ReLU 作为激活函数时,如果一个神经元的活性值非常大,LRN 会将它邻近的神经元近似的归一化为 0,从而起到抑制作用,增强模型的泛化能力。
最大汇聚/池化也具有侧抑制作用。但最大汇聚是对同一个特征映射中的邻近位置中的神经元进行抑制,而局部响应归一化是对同一个位置的邻近特征映射中的神经元进行抑制.
1.5 超参数优化
神经网络中不可学习的参数称为超参数。常见的超参数有三类:
- 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数类型等。
- 优化参数,包括优化方法、学习率、小批量的样本数量等。
- 正则化系数。
超参数优化(Hyperparameter Optimization)主要存在两个方面的困难:
4. 超参数优化是一个组合优化问题,无法向一般参数那样通过梯度下降法来进行优化。
5. 评估一组超参数配置的时间代价非常高。
不同超参数对模型性能的影响差异很大。有些超参数(如,正则化系数)对模型性能影响有限,而另一些超参数(如,学习率)对模型性能影响较大。
简单的超参数配置方法:
网格搜索:grid search。根据经验将超参数进行离散化(注意通常不是等间距离散),然后根据这些超参数的不同组合分布训练一个模型,测试,选取一组性能最好的配置。
随机搜索:跟网络搜索类似,简单说就是瞎猜。
自适应的超参数优化方法:
贝叶斯优化:Nayesian optimization。根据当前已经试验的超参数组合来预测下一个可能带来最大收益的组合。比较常用的贝叶斯优化方法为时序模型优化(Sequential Model-Based Optimization,SMBO)
动态资源分配:在超参数优化中,每组超参数配置的评估代价比较高,动态资源分配就是提前终止学习曲线不收敛或收敛比较差的超参数配置的训练,将有限的资源分配给更有可能带来收益的超参数组合。
这是一个多臂赌博机问题的泛化问题:最优臂问题。一种有效的方法是逐次减半(successive halving)方法。
上面介绍的超参数优化方法都是在固定的超参数空间中进行最优配置搜索,而最重要的神经网络架构一般还需要由有经验的专家进行设计。神经架构搜索企图通过神经网络来自动实现网络架构的设计。通常采用元学习和强化学习实现。
2. 网络正则化
神经网络的拟合能力非常强,往往会导致其在训练数据上过拟合。
正则化(Regularization)是通过限制模型复杂度,从而避免模型过拟合,提高泛化能力的方法。
下面介绍几种常用的正则化方法。
2.1 ℓ 1 \ell_{1} ℓ1和 ℓ 2 \ell_{2} ℓ2正则化
ℓ 1 \ell_{1} ℓ1和 ℓ 2 \ell_{2} ℓ2正则化是机器学习中最常用的正则化方法,通过约束参数的 ℓ 1 \ell_{1} ℓ1和 ℓ 2 \ell_{2} ℓ2范数来减小模型的在训练数据集上的过拟合现象。
通过加入
ℓ
1
\ell_{1}
ℓ1和
ℓ
2
\ell_{2}
ℓ2正则化,优化问题可以写为
θ
∗
=
arg
min
θ
1
N
∑
n
=
1
N
L
(
y
(
n
)
,
f
(
x
(
n
)
;
θ
)
)
+
λ
ℓ
p
(
θ
)
\theta^{*}=\underset{\theta}{\arg \min } \frac{1}{N} \sum_{n=1}^{N} \mathcal{L}\left(y^{(n)}, f\left(\boldsymbol{x}^{(n)} ; \theta\right)\right)+\lambda \ell_{p}(\theta)
θ∗=θargminN1n=1∑NL(y(n),f(x(n);θ))+λℓp(θ)
其中
L
(
⋅
)
\mathcal{L}(·)
L(⋅)为损失函数,
N
N
N为训练样本数,
f
(
⋅
)
f(·)
f(⋅)为待学习的神经网络,
θ
\theta
θ为网络参数,
ℓ
p
\ell_{p}
ℓp为范数函数,
p
p
p的取值通常为{1,2}代表
ℓ
1
\ell_{1}
ℓ1和
ℓ
2
\ell_{2}
ℓ2范数,
λ
\lambda
λ为正则化系数。
带正则化的优化问题等价于下面带约束条件的优化问题,
θ
∗
=
arg
min
θ
1
N
∑
n
=
1
N
L
(
y
(
n
)
,
f
(
x
(
n
)
;
θ
)
)
s.t.
ℓ
p
(
θ
)
≤
1
\begin{array}{c}\theta^{*}=\underset{\theta}{\arg \min } \frac{1}{N} \sum_{n=1}^{N} \mathcal{L}\left(y^{(n)}, f\left(\boldsymbol{x}^{(n)} ; \theta\right)\right) \\ \text { s.t. } \quad \ell_{p}(\theta) \leq 1\end{array}
θ∗=θargminN1∑n=1NL(y(n),f(x(n);θ)) s.t. ℓp(θ)≤1
ℓ
1
\ell_{1}
ℓ1范数在零点不可导,因此常用下式来近似:
ℓ
1
(
θ
)
=
∑
d
=
1
D
θ
d
2
+
ϵ
\ell_{1}(\theta)=\sum_{d=1}^{D} \sqrt{\theta_{d}^{2}+\epsilon}
ℓ1(θ)=d=1∑Dθd2+ϵ
其中
D
D
D为参数数量,
ϵ
\epsilon
ϵ为一个非常小的常数。
同时加入
ℓ
1
\ell_{1}
ℓ1和
ℓ
2
\ell_{2}
ℓ2正则化,称为弹性网络正则化。
θ
∗
=
arg
min
θ
1
N
∑
n
=
1
N
L
(
y
(
n
)
,
f
(
x
(
n
)
;
θ
)
)
+
λ
1
ℓ
1
(
θ
)
+
λ
2
ℓ
2
(
θ
)
\theta^{*}=\underset{\theta}{\arg \min } \frac{1}{N} \sum_{n=1}^{N} \mathcal{L}\left(y^{(n)}, f\left(\boldsymbol{x}^{(n)} ; \theta\right)\right)+\lambda_1 \ell_{1}(\theta)+\lambda_2 \ell_{2}(\theta)
θ∗=θargminN1n=1∑NL(y(n),f(x(n);θ))+λ1ℓ1(θ)+λ2ℓ2(θ)
在训练深度神经网络时,特别是过度参数化(模型的参数量远远大于训练数据的数量)时, ℓ 1 \ell_{1} ℓ1和 ℓ 2 \ell_{2} ℓ2正则化的效果不如浅层机器学习模型中显著。
2.2 权重衰减
Weight Decay 。每次参数更新时,引入一个衰减系数。
θ
t
←
(
1
−
β
)
θ
t
−
1
−
α
g
t
\theta_{t} \leftarrow(1-\beta) \theta_{t-1}-\alpha \boldsymbol{g}_{t}
θt←(1−β)θt−1−αgt
其中
g
t
\boldsymbol{g}_{t}
gt为第
t
t
t步更新时的梯度,
α
\alpha
α为学习率,
β
\beta
β为权重衰减系数,一般取值比较小,比如 0.0005。
在标准的随机梯度下降中,权重衰减正则化和 ℓ 2 \ell_2 ℓ2正则化等效。但在较为复杂的优化方法(如 Adam)中,二者并不等价。
为什么权重衰减可以防止过拟合
参考:权重衰减(weight decay)/正则化与学习率衰减(learning rate decay)
L2正则化就是在代价函数后面增加一个正则化项:
C
=
C
0
+
λ
2
n
∑
w
w
2
C=C_{0}+\frac{\lambda}{2 n} \sum_{w} w^{2}
C=C0+2nλw∑w2
其中
C
0
C_0
C0为原始的代价函数,后面那一项就是L2正则化项,
w
w
w为网络模型权重参数,
n
n
n为训练集的样本大小,
λ
\lambda
λ为正则项系数。
1
/
2
1/2
1/2仅仅是为了求导方便。
为什么L2正则化可以对权重进行衰减?
我们对加入L2正则化后的代价函数进行推导,先求导:
∂
C
∂
w
=
∂
C
0
∂
w
+
λ
n
w
\frac{\partial C}{\partial w}=\frac{\partial C_{0}}{\partial w}+\frac{\lambda}{n} w
∂w∂C=∂w∂C0+nλw
∂
C
∂
b
=
∂
C
0
∂
b
.
\frac{\partial C}{\partial b}=\frac{\partial C_{0}}{\partial b} .
∂b∂C=∂b∂C0.
可以发现L2正则化项对偏移参数
b
b
b的更新没有影响,但是对于权重cans
w
w
w的更新有影响:
w
→
w
−
η
∂
C
0
∂
w
−
η
λ
n
w
=
(
1
−
η
λ
n
)
w
−
η
∂
C
0
∂
w
.
\begin{aligned} w & \rightarrow w-\eta \frac{\partial C_{0}}{\partial w}-\frac{\eta \lambda}{n} w \\ &=\left(1-\frac{\eta \lambda}{n}\right) w-\eta \frac{\partial C_{0}}{\partial w} . \end{aligned}
w→w−η∂w∂C0−nηλw=(1−nηλ)w−η∂w∂C0.
在不使用L2正则化时,求导结果中w前系数为1,现在
w
w
w前面系数为1-ηλ/n,因为η、λ、n都是正的,所以1-ηλ/n小于1,它的效果是减小
w
w
w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,
w
w
w最终的值可能增大也可能减小。
基于mini-batch的随机梯度下降,w和b更新的公式跟上面给出的有点不同:后面那一项变成所有导数加和,乘以η再除以m,m是一个mini-batch中样本的个数。
w
→
(
1
−
η
λ
n
)
w
−
η
m
∑
x
∂
C
x
∂
w
b
→
b
−
η
m
∑
x
∂
C
x
∂
b
\begin{array}{l} w \rightarrow\left(1-\frac{\eta \lambda}{n}\right) w-\frac{\eta}{m} \sum_{x} \frac{\partial C_{x}}{\partial w} \\ b \rightarrow b-\frac{\eta}{m} \sum_{x} \frac{\partial C_{x}}{\partial b} \end{array}
w→(1−nηλ)w−mη∑x∂w∂Cxb→b−mη∑x∂b∂Cx
L2正则化项有让w变小的效果,但是为什么w变小可以防止过拟合呢?
原理:
(1)从模型的复杂度上解释:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合更好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。
(2)从数学方面的解释:过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。
2.3 提前停止
Early Stop。在使用梯度下降法进行优化时,用验证集(一个和训练集独立的样本集合)上的误差来代替期望误差。当验证集的错误率不再下降,就停止迭代。
然而在实际操作中,验证集上的错误率变化并不一定是平衡曲线,很有肯先升高后降低。因此,提前停止的具体停止标准需要根据实际任务进行优化。
2.4 dropout
丢弃法(2014)。在训练深度神经网络时,可以随机丢弃一部分神经元来避免过拟合。每次丢弃的神经元是随机的。最简单的方法是设置一个固定的概率 p p p,对每个神经元以此概率判断是否要保留。
对于一个神经层
y
=
f
(
W
x
+
b
)
\boldsymbol{y}=f(\boldsymbol{W} \boldsymbol{x}+\boldsymbol{b})
y=f(Wx+b),我们可以引入一个掩蔽函数 mask(·),使得
y
=
f
(
W
mask
(
x
)
+
b
)
\boldsymbol{y}=f(\boldsymbol{W} \text{mask}(\boldsymbol{x})+\boldsymbol{b})
y=f(Wmask(x)+b).
mask
(
x
)
=
{
m
⊙
x
当训练阶段时
p
x
当测试阶段时
\operatorname{mask}(\boldsymbol{x})=\left\{\begin{array}{ll}\boldsymbol{m} \odot \boldsymbol{x} & \text { 当训练阶段时 } \\ p \boldsymbol{x} & \text { 当测试阶段时 }\end{array}\right.
mask(x)={m⊙xpx 当训练阶段时 当测试阶段时
m ∈ [ 0 , 1 ] D \boldsymbol{m}\in[0,1]^D m∈[0,1]D是丢弃掩码(dropout Mask),通过以概率为 p p p的伯努利分布随机生成。
在训练阶段,激活的神经元平均数量减小为原来的 p p p倍,而在测试阶段,所有的神经元都会被激活,这会造成训练和测试时的网络输出不一致。因此,为了缓解这个问题,在测试时将神经层的输入 x \boldsymbol{x} x乘以 p p p。
通常隐藏层取 p = 0.5 p=0.5 p=0.5,输入层 p p p的取值更接近 1。对输入层进行 dropout 相当于给数据增加噪声,可以提高网络的鲁棒性。
dropout 一般是针对神经元进行随机丢弃,但也可以扩展到对神经元之间的连接进行丢弃,或每一层进行丢弃。
集成学习角度的解释
每次 dropout,相当于从原始网络中采样得到了一个子网络,这些子网络共享原始网络参数。最终训练得到的网络可以近似看作集成了指数级个不同网络的组合模型。
dropout 也可以解释为一种贝叶斯学习的近似。
2.5 数据增强
数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加数据量,提高模型鲁棒性,避免过拟合。
图像数据增强主要通过算法对图像进行转变,引入噪声等方法来增加数据的多样性。增强的方法主要有:
1.旋转 rotation:将图像随机旋转一定的角度。
2.翻转 flip:将图像沿水平或垂直方向随机翻转一定角度。
3.缩放 zoom in/out:放大或缩小一定比例。
4.平移 shift。
5.加噪声 noise。
2.6 标签平滑
数据增强中,我们可以给样本特征加入随机噪声来避免过拟合。同样,我们也可以给样本标签引入噪声。假设训练数据集上有一部分标签是被错误标注的,那么最小化这些样本上的损失函数会导致过拟合。一种改善的正则化方法是标签平滑(label smoothing),即在输出标签中添加噪声来避免模型过拟合。
一个样本
x
\boldsymbol{x}
x的标签可以用 one-hot向量表示,即
y
=
[
0
,
⋯
,
0
,
1
,
0
,
⋯
,
0
]
⊤
\boldsymbol{y}=[0, \cdots, 0,1,0, \cdots, 0]^{\top}
y=[0,⋯,0,1,0,⋯,0]⊤
这种标签可以看做硬目标(hard target)。如果使用 softmax 分类器并使用交叉熵损失函数,最小化损失函数会使得正确类和其他类的权重差异变得很大。如果样本标签是错误的,会导致严重的过拟合现象。
为改善这种情况,我们可以引入一个噪声对标签进行平滑,即假设样本以
ϵ
\epsilon
ϵ的概率为其他类。平滑后的标签为
y
~
=
[
ϵ
K
−
1
,
⋯
,
ϵ
K
−
1
,
1
−
ϵ
,
ϵ
K
−
1
,
⋯
,
ϵ
K
−
1
]
⊤
\tilde{y}=\left[\frac{\epsilon}{K-1}, \cdots, \frac{\epsilon}{K-1}, 1-\epsilon, \frac{\epsilon}{K-1}, \cdots, \frac{\epsilon}{K-1}\right]^{\top}
y~=[K−1ϵ,⋯,K−1ϵ,1−ϵ,K−1ϵ,⋯,K−1ϵ]⊤
其中
K
K
K为标签数量,这种标签可以看作软目标(soft target)。
标签平滑可以避免模型的输出过拟合到硬目标上,并且通常不会损害其分类能力。
更好的做法是按照类别相关性来赋予其他标签不同的概率。比如采用知识蒸馏(knowledge distillation)的方法,先训练另外一个更复杂的教师网络(teacher network),然后使用教师网络的输出作为软目标来训练学生网络(student network)。
3. 小结
深度神经网络的优化和正则化是既对立又统一的关系。一方面我们希望优化算法能够找到一个全局最优解,另一方面我们又不希望模型优化到最优解,这可能导致过拟合。优化和正则化的统一目标是期望风险最小化。
在优化方面,训练神经网络的主要难点是非凸优化和梯度消失问题。提高训练效率的方法通常由三个方面:修改网络模型,使用更有效的优化算法,更好的参数初始化。
在泛化方面,实验表明,即使是过度参数化的深度神经网络(理论上过度参数化的网络容量足够记住所有训练数据,从而产生过拟合)在训练过程中会优先记住训练数据中的一般模式(Pattern),即具有高度泛化能力的模式。
但目前神经网络的泛化能力还没有很好的理论支持。在传统机器学习模型上比较有效的
ℓ
1
\ell_1
ℓ1或
ℓ
2
\ell_2
ℓ2正则化在深度神经网络中作用也比较有限,而一些经验的做法(比如小的批量大小、大的学习率、 提前停止、丢弃法、数据增强)会更有效。