部分有待扩展
任何数学技巧都不能弥补信息的缺失.
引言
虽然神经网络具有非常强的表达能力,但是当应用神经网络模型到机器学习时依然存在一些难点问题.主要分为两大类:
-
优化问题:非凸优化问题+参数多,训练数据大+梯度消失爆炸
-
泛化问题:模型拟合能力较强 – 正则化
网络优化
网络优化是指寻找一个神经网络模型来使得经验(或结构)风险最小化的过程,包括模型选择以及参数学习等.
- 网络结构多样性: 通用方法;另外超参数较多
- 高维变量的非凸优化:逃离鞍点;(平坦)局部最小值(的等价性)
- 神经网络优化的改善方法:优化算法、参数初始、数据预处理、网络结构、超参数
高维变量的非凸优化
低维空间的非凸优化:可能会陷入到局部最优点
选择初始化参数逃离局部最优点
鞍点:一阶梯度为 0,但是二阶梯度的 Hessian矩阵不是半正定矩阵,在一些维度上是最高点,在另一些维度上是最低点
高维空间中局部最优解与鞍点比例…
基于梯度下降的优化方法会在鞍点附近接近于停滞,很难从这些鞍点中逃离. 因此,随机梯度下降对于高维空间中的非凸优化问题十分重要, 通过在梯度方向上引入随机性,可以有效地逃离鞍点.
平坦最小值: 深度神经网络中参数多,并且有一定的冗余性, 每单个参数对最终损失的影响都比较小,因此会导致损失函数在 局部最小解 附近通常是一个平坦的区域,称为平坦最小值
在一个平坦最小值的邻域内,所有点对应的训练损失都比较接近,表明我们在训练神经网络时, 不需要精确地找到一个局部最小解,只要在一个局部最小解的邻域内就足够了.
平坦最小值通常被认为和模型泛化能力有一定的关系.
- 一般而言,当一个模型收敛到一个平坦的局部最小值时,其鲁棒性会更好,即微小的参数变动不会剧烈影响模型能力;
- 而当一个模型收敛到一个尖锐的局部最小值时,其鲁棒性也会比较差.
具备良好泛化能力的模型通常应该是鲁棒的,因此理想的局部最小值应该是平坦的。
局部最小解的等价性
神经网络优化的改善方法
优化算法
梯度下降算法的优化方向:
- 调整学习率,使得优化更稳定
- 梯度估计修正,优化训练速度
梯度下降法
小批量梯度下降
小批量梯度下降法(Mini-Batch Gradient Descent)是批量梯度下降和随机梯度下降的折中. 每次迭代时,我们随机选取 一小部分训练样本 来计算梯度并更新参数, 这样既可以兼顾随机梯度下降法的优点,也可以提高训练效率.
令
f
(
x
;
θ
)
f(x;\theta)
f(x;θ) 表示一个深度神经网络,
θ
\theta
θ 为网络参数,在使用小批量梯度下降进行优化时,每次选取
K
K
K 个训练样本
S
a
m
p
t
=
{
x
(
k
)
,
y
(
k
)
}
k
=
1
K
Samp_t=\lbrace x^{(k)},y^{(k)}\rbrace_{k=1}^{K}
Sampt={x(k),y(k)}k=1K. 第
t
t
t 次迭代时损失函数关于
θ
\theta
θ 的偏导数
g
t
(
θ
)
=
1
K
∑
(
x
,
y
)
∈
S
a
m
p
t
∂
L
(
y
,
f
(
x
;
θ
)
)
∂
θ
g_t(\theta)=\frac 1 K \sum_{(x,y)\in Samp_t}{\frac {\partial L(y,f(x;\theta))}{\partial \theta}}
gt(θ)=K1(x,y)∈Sampt∑∂θ∂L(y,f(x;θ))
其中
L
(
⋅
)
L(\cdot)
L(⋅) 为可微分的损失函数,
K
K
K 称为批量大小(Batch Size).
第
t
t
t 次更新的梯度
g
t
g_t
gt 定义为
g
t
≜
g
t
(
θ
t
−
1
)
g_t \triangleq g_t(\theta_{t-1})
gt≜gt(θt−1)
使用梯度下降来更新参数,
θ
t
=
θ
t
−
1
−
α
g
t
,
α
>
0
\theta_t=\theta_{t-1}-\alpha g_t,\quad \alpha>0
θt=θt−1−αgt,α>0
每次迭代时参数更新的差值
Δ
θ
t
\Delta \theta_t
Δθt 定义为
Δ
θ
t
≜
θ
t
−
θ
t
−
1
\Delta \theta_t \triangleq \theta_t- \theta_{t-1}
Δθt≜θt−θt−1
Δ
θ
t
\Delta \theta_t
Δθt 和梯度
g
t
g_t
gt 并不需要完全一致.
Δ
θ
t
\Delta \theta_t
Δθt 为每次迭代时参数的实际更新方向,
即
θ
t
=
θ
t
−
1
+
Δ
θ
t
\theta_t=\theta_{t-1}+\Delta \theta_t
θt=θt−1+Δθt.在标准的小批量梯度下降中,
Δ
θ
t
=
−
α
g
t
\Delta \theta_t = −\alpha g_t
Δθt=−αgt.
影响小批量梯度下降法的主要因素有:1. 批量大小𝐾 2. 学习率𝛼 3. 梯度估计
批量大小选择
一般而言,批量大小不影响随机梯度的期望,但是会影响随机梯度的方差.
g t ( θ ) = 1 K ∑ ( x , y ) ∈ S a m p t ∂ L ( y , f ( x ; θ ) ) ∂ θ g_t(\theta)=\frac 1 K \sum_{(x,y)\in Samp_t}{\frac {\partial L(y,f(x;\theta))}{\partial \theta}} gt(θ)=K1(x,y)∈Sampt∑∂θ∂L(y,f(x;θ))
- 批量大小越大,随机梯度的方差越小,引入的噪声也越小,训练也越稳定, 因此可以设置较大的学习率.
- 而批量大小较小时,需要设置较小的学习率,否则模型会不收敛. 学习率通常要随着批量大小的增大而相应地增大
线性缩放规则(Linear Scaling Rule)
:当批量大小增加
m
m
m 倍时,学习率也增加
m
m
m 倍.
线性缩放规则往往在批量大小比较小时适用,当批量大小非常大时,线性缩放会使得训练不稳定 Reason?
批量大小和模型的泛化能力也有一定的关系.通过实验发现:批量越大,越有可能收敛到尖锐最小值; 批量越小,越有可能收敛到平坦最小值.
学习率调整
常用的学习率调整方法包括学习率衰减、学习率预热、周期性学习率调整以及一些自适应调整学习率的方法,比如 AdaGrad、RMSprop、AdaDelta 等.
学习率预热
小批量梯度下降法中,当批量大小的设置比较大时,通常需要比较大的学习率.
但在刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,再加上比较大的初始学习率,会使得训练不稳定.
为了提高训练稳定性,我们可以 在最初几轮迭代时,采用比较小的学习率, 等梯度下降到一定程度后再恢复到初始的学习率,这种方法称为学习率预热(Learning Rate Warmup).
逐渐预热: 假设预热的迭代次数为
T
′
T'
T′ ,初始学习率为
α
0
\alpha_0
α0 ,在预热过程中,每次更新的学习率为
α
t
′
=
t
T
′
α
0
,
1
≤
t
≤
T
′
\alpha_t'=\frac t {T'} \alpha_0,\quad 1\le t\le T'
αt′=T′tα0,1≤t≤T′
当预热过程结束,再选择一种 学习率衰减方法 来逐渐降低学习率.
学习率衰减
从经验上看,学习率在一开始要保持大些来保证收敛速度,在收敛到最优点附近时要小些以避免来回振荡.
学习率衰减是按每次迭代(Iteration)进行,也可以按每
m
m
m 次迭代或每个回合(Epoch)进行.衰减率通常和总迭代次数相关.
假设初始化学习率为 α 0 \alpha_0 α0,在第 t t t 次迭代时的学习率 α t \alpha_t αt.常见的衰减方法有以下几种:
- 分段常数衰减
每经过 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 T_m Tm 和 β m \beta_m βm 为根据 经验 设置的超参数 - 逆时衰减(Inverse Time Decay)
α t = α 0 1 1 + β × t \alpha_t=\alpha_0 \frac 1 {1+\beta \times t} αt=α01+β×t1 - 指数衰减(Exponential Decay):
α t = α 0 β t , β < 1 \alpha_t=\alpha_0 \beta^t,\quad \beta<1 αt=α0βt,β<1 - 自然指数衰减(Natural Exponential Decay):
α t = α 0 e − β × t \alpha_t=\alpha_0 e^{-\beta \times t} αt=α0e−β×t - 余弦衰减(Cosine Decay):
α t = 1 2 α 0 ( 1 + cos ( t π T ) ) \alpha_t=\frac 1 2 \alpha_0(1+\cos(\frac {t\pi}{T})) αt=21α0(1+cos(Ttπ))
其中𝑇 为总的迭代次数.
周期性学习率调整
为了使得梯度下降法能够逃离鞍点或尖锐最小值,一种经验性的方式是 在训练过程中周期性地增大学习率
周期性地增大学习率虽然可能短期内损害优化过程,使得网络收敛的稳定性变差,但从长期来看有助于找到更好的局部最优解.
- 循环学习率
让学习率在一个区间内周期性地增大和缩小.通常可以使用线性缩放来调整学习率,称为三角循环学习率(Triangular Cyclic Learning Rate).
假设每个循环周期的长度相等都为 2 Δ T 2\Delta T 2ΔT ,其中前 Δ T \Delta T ΔT 步为学习率线性增大阶段,
后 Δ T \Delta T ΔT 步为学习率线性缩小阶段.在第 t t t 次迭代时,其所在的循环周期数 m m m 为
m = ⌊ 1 + t 2 Δ T ⌋ m=\lfloor1+\frac{t}{2\Delta T}\rfloor m=⌊1+2ΔTt⌋
第 t t t 次迭代的学习率为
α t = α m i n m + ( α m a x m − α m i n m ) ( m a x ( 0 , 1 − b ) ) \alpha_t=\alpha_{min}^m+(\alpha_{max}^m-\alpha_{min}^m)(max(0,1-b)) αt=αminm+(αmaxm−αminm)(max(0,1−b))
其中 α m a x m \alpha_{max}^m αmaxm 与 α m i n m \alpha_{min}^m αminm 分别为第 m m m 个周期中学习率的上界和下界,可以随着 m m m 的增大而逐渐降低; b ∈ [ 0 , 1 ] b\in[0,1] b∈[0,1] 的计算为
b = ∣ t Δ T − 2 m + 1 ∣ b=\vert\frac t {\Delta T}-2m+1\vert b=∣ΔTt−2m+1∣
- 带热重启的随机梯度下降((Stochastic Gradient Descent with Warm Restarts,SGDR)
热 重 启 类 比 《 计 算 机 网 络 》 T C P 拥 塞 控 制 的 快 恢 复 \tiny{热重启 类比 《计算机网络》 TCP拥塞控制的快恢复} 热重启类比《计算机网络》TCP拥塞控制的快恢复
用热重启方式来替代学习率衰减的方法. 学习率每间隔一定周期后 重新初始化为某个预先设定值, 然后逐渐衰减.每次重启后模型参数不是从头开始优化,而是从重启前的参数基础上继续优化.
假设在梯度下降过程中重启 M M M 次,第 m m m 次重启在上次重启开始第 T m T_m Tm 个回合后进行, T m T_m Tm 称为重启周期.在第 m m m 次重启之前,采用余弦衰减来降低学习率.
第 t t t 次迭代的学习率为
α t = α m i n m + 1 2 ( α m a x m − α m i n m ) ( 1 + cos ( T c u r T m π ) ) \alpha_t=\alpha_{min}^m+\frac 1 2(\alpha_{max}^m-\alpha_{min}^m)(1+\cos(\frac{T_{cur}}{T_m}\pi)) αt=αminm+21(αmaxm−αminm)(1+cos(TmTcurπ))
第 m m m 个周期中学习率的上界和下界,可以随着 m m m 的增大而逐渐降低; T c u r T_{cur} Tcur 为从上次重启之后的回合(Epoch)数. T c u r T_{cur} Tcur 可以取小数,比如0.1、0.2等,这样可以在一个回合内部进行学习率衰减
AdaGrad算法
在标准的梯度下降法中,每个参数在每次迭代时都使用相同的学习率. 由 于 每 个 参 数 的 维 度 上 收 敛 速 度 都 不 相 同 , 因 此 根 据 不 同 参 数 的 收 敛 情 况 分 别 设 置 学 习 率 . \small{由于每个参数的维度上收敛速度都不相同,因此根据不同参数的收敛情况分别设置学习率.} 由于每个参数的维度上收敛速度都不相同,因此根据不同参数的收敛情况分别设置学习率.
AdaGrad算法(Adaptive Gradient Algorithm)是借鉴 l 2 l_2 l2 正则化的思想,每次迭代时自适应地调整每个参数的学习率. 在 第 t 次 迭 代 时 , 先 计 算 每 个 参 数 梯 度 平 方 的 累 计 值 \textcolor{red}{在第 t 次迭代时,先计算每个参数梯度平方的累计值} 在第t次迭代时,先计算每个参数梯度平方的累计值
G
t
=
∑
τ
=
1
t
g
τ
⊙
g
τ
G_t=\sum_{\tau=1}^{t}{g_{\tau}\odot g_{\tau}}
Gt=τ=1∑tgτ⊙gτ
其中
⊙
\odot
⊙ 为按元素乘积,
g
τ
∈
R
∣
θ
∣
g_{\tau} \in R^{\vert \theta \vert}
gτ∈R∣θ∣ 是第
τ
\tau
τ 次迭代时的梯度.
A
d
a
G
r
a
d
算
法
的
参
数
更
新
差
值
为
\textcolor{red}{AdaGrad算法的参数更新差值为}
AdaGrad算法的参数更新差值为
Δ
θ
t
=
−
α
G
t
+
ϵ
⊙
g
t
\Delta \theta_t=-\frac {\alpha}{\sqrt{G_t+\epsilon}}\odot g_t
Δθt=−Gt+ϵα⊙gt
其中
α
\alpha
α 是初始的学习率,
ϵ
\epsilon
ϵ 是为了保持数值稳定性而设置的非常小的常数,一般取值
e
−
7
e^{-7}
e−7 到
e
−
10
e^{-10}
e−10.
在 AdaGrad 算法中,
- 如果某个参数的偏导数累积比较大,其学习率 α \alpha α 相对较小 r e a s o n ? ? Δ θ t − 1 = θ t − θ t − 1 当 G t 大 → Δ θ t 大 → θ t + 1 , s o ? ? ? \quad \tiny{reason?? \Delta \theta_{t-1}= \theta_t-\theta_{t-1} 当 G_t大 \rarr \Delta \theta_t 大 \rarr \theta_{t+1} ,so???} reason??Δθt−1=θt−θt−1当Gt大→Δθt大→θt+1,so???
- 相反,如果其偏导数累积较小,其学习率 α \alpha α 相对较大.
但整体是随着迭代次数的增加,学习率逐渐缩小
AdaGrad 算法的 缺 点 \textcolor{blue}{缺点} 缺点 是 经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点.
以下摘自《李宏毅2020机器学习》Gradient_descent_1 更容易理解。
RMSprop算法
RMSprop算法是Geoff Hinton提出的一种 自适应学习率 的方法,可以 在 有 些 情 况 下 避 免 A d a G r a d 算 法 中 学 习 率 不 断 单 调 下 降 以 至 于 过 早 衰 减 的 缺 点 . \textcolor{blue}{在有些情况下避免 AdaGrad 算法中学习率不断单调下降以至于过早衰减的缺点.} 在有些情况下避免AdaGrad算法中学习率不断单调下降以至于过早衰减的缺点.
RMSprop算法 首 先 计 算 每 次 迭 代 梯 度 g t 平 方 的 指 数 衰 减 移 动 平 均 \textcolor{red}{首先计算每次迭代梯度 g_t 平方的指数衰减移动平均} 首先计算每次迭代梯度gt平方的指数衰减移动平均 ,
G t = β G t − 1 + ( 1 − β ) g t ⊙ g t = ( 1 − β ) ∑ τ = 1 t β t − τ g τ ⊙ g τ \begin{aligned}G_t&=\beta G_{t-1}+(1-\beta)g_t\odot g_t\\ &=(1-\beta)\sum_{\tau =1}^{t}{\beta^{t-\tau}g_{\tau}\odot g_{\tau}}\end{aligned} Gt=βGt−1+(1−β)gt⊙gt=(1−β)τ=1∑tβt−τgτ⊙gτ
其中
β
\beta
β 为衰减率,一般取值为0.9.
R
M
S
p
r
o
p
算
法
的
参
数
更
新
差
值
为
\textcolor{red}{RMSprop算法的参数更新差值为}
RMSprop算法的参数更新差值为
Δ
θ
t
=
−
α
G
t
+
ϵ
⊙
g
t
\Delta \theta_t=-\frac {\alpha}{\sqrt{G_t+\epsilon}}\odot g_t
Δθt=−Gt+ϵα⊙gt
其中
α
\alpha
α 是初始的学习率,比如0.001.
从上式可以看出,RMSProp 算法和 AdaGrad 算法的区别在于 G t G_t Gt 的计算 由累积方式变成了指数衰减移动平均. 在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大.
AdaDelta
AdaDelta 算法也是 AdaGrad 算法的一个改进.和 RMSprop 算法类似,AdaDelta 算法 通过梯度平方的指数衰减移动平均来调整学习率. 此外,AdaDelta算法 还引入了每次参数更新差值 Δ θ \Delta \theta Δθ 的平方的指数衰减权移动平均
第
t
次
迭
代
时
,
参
数
更
新
差
值
Δ
θ
的
平
方
的
指
数
衰
减
权
移
动
平
均
为
\textcolor{red}{第 t 次迭代时,参数更新差值 \Delta \theta 的平方的指数衰减权移动平均为}
第t次迭代时,参数更新差值Δθ的平方的指数衰减权移动平均为
Δ
X
t
−
1
2
=
β
1
Δ
X
t
−
2
2
+
(
1
−
β
1
)
Δ
θ
t
−
1
⊙
Δ
θ
t
−
1
\Delta X_{t-1}^{2}=\beta_1 \Delta X_{t-2}^2+(1-\beta_1)\Delta \theta_{t-1} \odot \Delta \theta_{t-1}
ΔXt−12=β1ΔXt−22+(1−β1)Δθt−1⊙Δθt−1
其中
β
1
\beta_1
β1 为衰减率.此时
Δ
θ
t
\Delta \theta_t
Δθt 还未知,因此只能计算到
Δ
X
t
−
1
\Delta X_{t-1}
ΔXt−1.
A
d
a
D
e
l
t
a
算
法
的
参
数
更
新
差
值
为
\textcolor{red}{AdaDelta算法的参数更新差值为}
AdaDelta算法的参数更新差值为
Δ
θ
t
=
−
Δ
X
t
−
1
2
+
ϵ
G
t
+
ϵ
g
t
\Delta \theta_t=-\frac {\sqrt{\Delta X_{t-1}^{2}+\epsilon}}{\sqrt{G_t+\epsilon}}g_t
Δθt=−Gt+ϵΔXt−12+ϵgt
其中 G t G_t Gt 的计算方式和RMSprop算法一样, Δ X t − 1 2 \Delta X_{t-1}^{2} ΔXt−12 为参数更新差值 Δ θ \Delta \theta Δθ 的指数衰减权移动平均.
从上式可以看出,AdaDelta算法将RMSprop算法中的初始学习率 α \alpha α 改为动态计算的 Δ X t − 1 2 \sqrt{\Delta X_{t-1}^{2}} ΔXt−12 ,在一定程度上平抑了学习率的波动.
梯度修正估计
在随机(小批量)梯度下降法中,如果每次选取样本数量比较小,损失会呈现振荡的方式下降.
也就是说,随机梯度下降方法中每次迭代的梯度估计和整个训练集上的最优梯度并不一致,具有一定的 随机性.
一种有效地缓解梯度估计随机性的方式是 通过使用最近一段时间内的平均梯度来代替当前时刻的随机梯度 来作为参数更新的方向,从而提高优化速度.
动量法
动量法(Momentum Method)是用之前积累动量来替代真正的梯度.每次迭代的梯度可以看作加速度.
在 第 t 次 迭 代 时 , 计 算 负 梯 度 的 “ 加 权 移 动 平 均 ” 作 为 参 数 的 更 新 方 向 , \textcolor{red}{在第 t 次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向,} 在第t次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向,
Δ θ t = ρ Δ θ t − 1 − α g t = − α ∑ τ = 1 t ρ t − τ g τ \Delta \theta_t=\rho \Delta \theta_{t-1}-\alpha g_t=-\alpha \sum_{\tau =1}^{t}{\rho ^{t-\tau}g_{\tau}} Δθt=ρΔθt−1−αgt=−ατ=1∑tρt−τgτ
其中 ρ \rho ρ 为动量因子,通常设为0.9。
Nesterov加速梯度
是一种对动量法的改进,在动量法中,实际的参数更新方向
Δ
θ
t
\Delta \theta_t
Δθt 为上一步的 参数更新方向
Δ
θ
t
−
1
\Delta \theta_{t-1}
Δθt−1 和当前梯度的反方向
−
g
t
-g_t
−gt 的叠加.
这样,
Δ
θ
t
\Delta \theta_t
Δθt 可以被拆分为两步进行,先根据
Δ
θ
t
−
1
\Delta \theta_{t-1}
Δθt−1 更新一次得到参数
θ
^
\hat \theta
θ^ 再用
−
g
t
-g_t
−gt 进行更新.
θ
^
=
θ
t
−
1
+
ρ
Δ
θ
t
−
1
θ
t
=
θ
^
−
α
g
t
\begin{aligned} \hat \theta&=\textcolor{blue}{\theta_{t-1}}+\rho \Delta \theta_{t-1}\\ \theta_t&=\hat \theta-\alpha g_t \end{aligned}
θ^θt=θt−1+ρΔθt−1=θ^−αgt
其中梯度
g
t
g_t
gt 为点
θ
t
−
1
\theta_{t-1}
θt−1 上的梯度,因此在第二步更新中有些不太合理.更合理的 更新方向 应该为
θ
^
\hat \theta
θ^ 上的梯度.
but 动量法: Δ θ t = ρ Δ θ t − 1 − α g t = − α ∑ τ = 1 t ρ t − τ g τ \Delta \theta_t=\rho \Delta \theta_{t-1}-\alpha g_t=-\alpha \sum_{\tau =1}^{t}{\rho ^{t-\tau}g_{\tau}} Δθt=ρΔθt−1−αgt=−α∑τ=1tρt−τgτ
合并后的更新方向为
Δ
θ
t
=
ρ
Δ
θ
t
−
1
−
α
g
t
(
θ
t
−
1
+
ρ
Δ
θ
t
−
1
)
\Delta \theta_t=\rho \Delta \theta_{t-1}-\alpha g_t(\theta_{t-1}+\rho \Delta \theta_{t-1})
Δθt=ρΔθt−1−αgt(θt−1+ρΔθt−1)
其中
g
t
(
θ
t
−
1
+
ρ
Δ
θ
t
−
1
)
g_t(\theta_{t-1}+\rho \Delta \theta_{t-1})
gt(θt−1+ρΔθt−1) 表示损失函数在点
θ
^
=
θ
t
−
1
+
ρ
Δ
θ
t
−
1
\hat \theta=\theta_{t-1}+\rho \Delta \theta_{t-1}
θ^=θt−1+ρΔθt−1 上的偏导数.
Adam算法
Adam算法(Adaptive Moment Estimation Algorithm)可以看作 动量法和 RMSprop 算法的结合 ,不但使用动量作为参数更新方向,而且可以自适应调整学习率.
Adam 算法一方面计算梯度平方 g t 2 g_t^2 gt2 的指数加权平均(和 RMSprop 算法类似),另一方面计算梯度 g t g_t gt 的指数加权平均(和动量法类似).
G t = β 2 G t − 1 + ( 1 − β 2 ) g t ⊙ g t M t = β 1 M t − 1 + ( 1 − β 1 ) g t G_t=\beta_2G_{t-1}+(1-\beta_2)g_t\odot g_t\\ M_t=\beta_1M_{t-1}+(1-\beta_1)g_t Gt=β2Gt−1+(1−β2)gt⊙gtMt=β1Mt−1+(1−β1)gt
RMSProp: G t = β G t − 1 + ( 1 − β ) g t ⊙ g t G t : 累 计 梯 度 − 即 − g t 平 方 的 指 数 衰 减 移 动 平 均 G_t=\beta G_{t-1}+(1-\beta)g_t\odot g_t \quad G_t:累计梯度 -即- g_t平方的指数衰减移动平均 Gt=βGt−1+(1−β)gt⊙gtGt:累计梯度−即−gt平方的指数衰减移动平均
Momentum: Δ θ t = ρ Δ θ t − 1 − α g t \Delta \theta_t=\rho \Delta \theta_{t-1}-\alpha g_t Δθt=ρΔθt−1−αgt
其中
β
1
\beta_1
β1 和
β
2
\beta_2
β2 分别为两个移动平均的衰减率,通常取值为
β
1
=
0.9
,
β
2
=
0.99
\beta_1=0.9,\enspace \beta_2=0.99
β1=0.9,β2=0.99 .
我们可以把
M
t
M_t
Mt 和
G
t
G_t
Gt 分别看作梯度的均值(一阶矩)和未减去均值的方差(二阶矩).
当 β 1 \beta_1 β1 和 β 2 \beta_2 β2 都接近于1时,偏差会很大.因此,需要对偏差进行修正.
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} Mt^Gt^=1−β1tMt,=1−β2tGt
Adam算法的参数更新差值为
Δ
θ
t
=
−
α
G
t
^
+
ϵ
M
t
^
\Delta \theta_t=- \frac {\alpha}{\sqrt{\hat{G_t} + \epsilon}}\hat{M_t}
Δθt=−Gt^+ϵαMt^
其中学习率
α
\alpha
α 通常设为0.001,并且也可以进行衰减.
Adam 算法是 RMSProp 算法与动量法的结合,因此一种自然的 Adam 算法的改进方法是引入Nesterov加速梯度,称为Nadam算法
梯度截断
在基于梯度下降的优化过程中,如果梯度突然增大,用大的梯度更新参数反而会导致其远离最优点.
为了避免这种情况,当梯度的模大于一定阈值时,就对梯度进行截断,称为梯度截断(Gradient Clipping)。
梯度截断是一种比较简单的启发式方法,把梯度的模限定在一个区间,当梯度的模小于或大于这个区间时就进行截断.一般截断的方式有以下几种:
- 按值截断 在第
t
t
t 次迭代时,梯度为
g
t
g_t
gt,给定一个区间
[
a
,
b
]
[a,b]
[a,b] ,如果一个参数的梯度小于a时,就将其设为a;如果大于b时,就将其设为b.
g t = m a x ( m i n ( g t , b ) , a ) g_t=max(min(g_t,b),a) gt=max(min(gt,b),a) - 按模截断 按模截断是将梯度的模截断到一个给定的截断阈值b.
如果 ∥ g t ∥ 2 ≤ b \Vert g_t\Vert^2\le b ∥gt∥2≤b ,保持 g t g_t gt 不变。如果 ∥ g t ∥ 2 > b \Vert g_t\Vert^2>b ∥gt∥2>b 令
g t = b ∥ g t ∥ g t g_t=\frac {b}{\Vert g_t\Vert} g_t gt=∥gt∥bgt
截断阈值 b 是一个超参数,也可以根据一段时间内的平均梯度来自动调整.
实验中发现,训练过程对阈值 b 并不十分敏感,通常一个小的阈值就可以得到很好的结果。
小结
- 调整学习率,使得优化更稳定;
- 梯度估计修正,优化训练速度.
参数初始化
神经网络的参数学习是一个非凸优化问题.当使用梯度下降法来进行优化网络参数时,参数初始值的选取十分关键,关系到网络的优化效率和泛化能力.
不同的局部最小值、陷入鞍点、、、
参数初始化的方式通常有以下三种:
- 预训练初始化:通常情况下,一个已经在大规模数据上训练过的模型可以提供一个好的参数初始值。
- 随机初始化: 对每个参数都随机初始化(Random Initialization),使得不同神经元之间的区分性更好.
- 固定值初始化:对于一些特殊的参数,我们可以根据经验用一个特殊的固定值来进行初始化.
虽然预训练初始化通常具有更好的收敛性和泛化性,但是灵活性不够,不能在目标任务上任意地调整网络结构。
三类常用的 随机初始化方法 :基于固定方差的参数初始化、基于方差缩放的参数初始化和正交初始化方法
基于固定方差的参数初始化
从一个固定均值(通常为 0)和方差 σ 2 \sigma^2 σ2 的分布中采样来生成参数的初始值
- 高斯分布初始化 使用高斯分布 N ( 0 , σ 2 ) N(0,\sigma^2) N(0,σ2) 来初始化参数
- 均匀分布初始化 在一个给定的区间 [ − r , − r ] [-r,-r] [−r,−r] 内采用均匀分布来初始化参数 v a r ( x ) = ( b − a ) 2 12 var(x)=\frac {(b-a)^2}{12} var(x)=12(b−a)2 若令 v a r ( x ) = σ 2 var(x)=\sigma^2 var(x)=σ2 那么 r = 3 σ 2 r=\sqrt{3\sigma^2} r=3σ2
在基于固定方差的随机初始化方法中,比较关键的是如何设置方差 σ 2 \sigma^2 σ2.
- 如果参数范围取的太小: a.导致神经元的输出过小,经过多层之后信号就慢慢消
失了 b.使得 Sigmoid 型激活函数丢失非线性的能力 (Sigmoid在0附近基本上是近似线性) - 如果参数范围取的太大:会导致输入状态过大.对于 Sigmoid 型激活函数来说,激活值变得饱和,梯度接近于0,从而导致梯度消失问题.
为了降低固定方差对网络性能以及优化效率的影响,基于固定方差的随机初始化方法一般需要配合逐层归一化来使用.
基于方差缩放的参数初始化
初始化一个深度网络时,为了缓解梯度消失或爆炸问题,我们尽可能 保 持 每 个 神 经 元 的 输 入 和 输 出 的 方 差 一 致 \textcolor{blue}{保持每个神经元的输入和输出的方差一致} 保持每个神经元的输入和输出的方差一致 , 根据神经元的连接数量来自适应地调整初始化分布的方差, 这类方法称为方差缩放(Variance Scaling).
Xavier初始化
假设在一个神经网络中,第
l
l
l 层的一个神经元
a
(
l
)
a^{(l)}
a(l) ,其接收前一层的
M
l
−
1
M_{l-1}
Ml−1 个神经元的输入
a
i
(
l
−
1
)
,
1
≤
i
≤
M
l
−
1
a^{(l-1)}_i, \enspace 1\le i \le M_{l-1}
ai(l−1),1≤i≤Ml−1
a
(
l
)
=
f
(
∑
i
=
1
M
l
−
1
w
i
(
l
)
a
i
(
l
−
1
)
)
a^{(l)}=f(\sum_{i=1}^{M_{l-1}}{w_i^{(l)}a_i^{(l-1)}})
a(l)=f(i=1∑Ml−1wi(l)ai(l−1))
为简单起见,这里令激活函数
f
(
⋅
)
f(\cdot)
f(⋅) 为恒等函数,即
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) 的均值
E
[
a
(
l
)
]
=
E
[
∑
i
=
1
M
l
−
1
w
i
(
l
)
a
i
(
l
−
1
)
]
=
0
E[a^{(l)}]=E[\sum_{i=1}^{M_{l-1}}{w_i^{(l)}a_i^{(l-1)}}]=0
E[a(l)]=E[i=1∑Ml−1wi(l)ai(l−1)]=0
a
(
l
)
a^{(l)}
a(l) 的方差:
v
a
r
(
a
(
l
)
)
=
v
a
r
(
∑
i
=
1
M
l
−
1
w
i
(
l
)
a
i
(
l
−
1
)
)
=
∑
i
=
1
M
l
−
1
v
a
r
(
w
i
(
l
)
)
v
a
r
(
a
i
(
l
−
1
)
)
=
M
l
−
1
v
a
r
(
w
i
(
l
)
)
v
a
r
(
a
i
(
l
−
1
)
)
\begin{aligned} var(a^{(l)})&=var(\sum_{i=1}^{M_{l-1}}{w_i^{(l)}a_i^{(l-1)}})\\ &=\sum_{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)}) \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 v a r ( w i ( l ) ) M_{l-1}var(w_i^{(l)}) Ml−1var(wi(l)) 倍
前向传播令
M
l
−
1
v
a
r
(
w
i
(
l
)
)
=
1
M_{l-1}var(w_i^{(l)})=1
Ml−1var(wi(l))=1 即
v
a
r
(
w
i
(
l
)
)
=
1
M
l
−
1
var(w_i^{(l)})=\frac 1 {M_{l-1}}
var(wi(l))=Ml−11
后向传播时
v
a
r
(
w
i
(
l
)
)
=
1
M
l
var(w_i^{(l)})=\frac 1 {M_l}
var(wi(l))=Ml1
作为折中,同时考虑信号在前向和反向传播中都不被放大或缩小,可以设置
v
a
r
(
w
i
(
l
)
)
=
2
M
l
−
1
+
M
l
var(w_i^{(l)})= \frac 2 {M_{l-1}+M_l}
var(wi(l))=Ml−1+Ml2
v a r ( a ( l ) ) = 1 16 M l − 1 v a r ( w i ( l ) ) v a r ( a i ( l − 1 ) ) var(a^{(l)})=\textcolor{red}{\frac 1 {16} M_{l-1}var(w_i^{(l)})}var(a_i^{(l-1)}) var(a(l))=161Ml−1var(wi(l))var(ai(l−1))
He初始化
当第𝑙 层神经元使用ReLU激活函数时,通常有一半的神经元输出为0,因此其分布的方差也近似为使用恒等函数时的一半.这样,只考虑前向传播时,参数
w
i
(
l
)
w_i^{(l)}
wi(l) 的理想方差为
v
a
r
(
w
i
(
l
)
)
=
2
M
l
−
1
var(w_i^{(l)})=\frac 2 {M_{l-1}}
var(wi(l))=Ml−12
因此当使用 ReLU 激活函数时,
- 若采用高斯分布来初始化参数 w i ( l ) w_i^{(l)} wi(l) ,其方差为 2 M l − 1 \frac 2 {M_{l-1}} Ml−12
- 若采用区间为 [ − r , r ] [-r,r] [−r,r] 的均分分布来初始化参数 w i ( l ) w_i^{(l)} wi(l) , 那么 r = 6 M l − 1 r=\sqrt{\frac 6 {M_{l-1}}} r=Ml−16
正交初始化方法
上面介绍的两种基于方差的初始化方法都是对权重矩阵中的每个参数进行独立采样.由于采样的随机性,采样出来的权重矩阵依然可能存在梯度消失或梯度爆炸问题.
假设一个𝐿层的等宽线性网络(激活函数为恒等函数)为
y
=
W
(
L
)
W
(
L
−
1
)
.
.
.
W
(
1
)
x
y=W^{(L)}W^{(L-1)}...W^{(1)}x
y=W(L)W(L−1)...W(1)x
在反向传播中,误差项𝛿 的反向传播公式为
δ
l
−
1
=
(
W
(
l
)
)
T
δ
(
l
)
\delta^{l-1}=(W^{(l)})^T\delta^{(l)}
δl−1=(W(l))Tδ(l)
为了避免梯度消失或梯度爆炸问题,我们希望误差项在反向传播中具有范数保持性(Norm-Preserving)
即
∥
δ
l
−
1
∥
2
=
∥
δ
l
∥
2
=
∥
(
W
(
l
)
)
T
δ
(
l
)
∥
2
\Vert \delta^{l-1}\Vert^2=\Vert \delta^{l}\Vert^2=\Vert(W^{(l)})^T\delta^{(l)}\Vert^2
∥δl−1∥2=∥δl∥2=∥(W(l))Tδ(l)∥2
如果我们以均值为 0、方差为
1
M
\frac 1 M
M1的高斯分布来随机生成权重矩阵
W
(
l
)
W^{(l)}
W(l) 中每个元素的初始值,那么当
M
→
∞
M\to \infty
M→∞时,范数保持性成立.
但是当
M
M
M 不足够大时,这种对每个参数进行独立采样的初始化方式难以保证范数保持性.
因此,一种更加直接的方式是将
W
(
l
)
W^{(l)}
W(l) 初始化为正交矩阵,即
W
(
l
)
(
W
(
l
)
)
T
=
I
W^{(l)}(W^{(l)})^T=I
W(l)(W(l))T=I 这种方法称为 正交初始化(Orthogonal Initialization)
正交初始化的具体实现过程可以分为两步:
- 用均值为 0、方差为 1的高斯分布初始化一个矩阵;
- 将这个矩阵用奇异值分解得到两个正交矩阵,并使用其中之一作为权重矩阵.
当在非线性神经网络中应用正交初始化时,通常需要将正交矩阵乘以一个
缩放系数
ρ
\rho
ρ.
比如当激活函数为ReLU时,激活函数在0附近的平均梯度可以近似为
0.5
0.5
0.5.为了保持范数不变,缩放系数
ρ
\rho
ρ 可以设置为
2
\sqrt{2}
2.
数据预处理
样本特征由于来源以及度量单位不同,它们的尺度(Scale)(即取值范围)往往差异很大.
如果一个机器学习算法在缩放全部或部分特征后不影响它的学习和预测,我们就称该算法具有 尺度不变性(Scale Invariance)
线性分类器是尺度不变的,而最近邻分类器就是尺度敏感的.
对于尺度敏感的模型,必须先对样本进行预处理,将各个维度的特征转换到相同的取值区间,并且消除不同特征之间的相关性 ,才能获得比较理想的结果.
如果数据维数很多时,我们很难这样精心去选择每一个参数. 因此,如果每一个特征的尺度相似,我们就不太需要区别对待每一个参数,从而减少人工干预.
尺度不同会造成在大多数位置上的梯度方向并不是最优的搜索方向.当使用梯度下降法寻求最优解时,会导致需要很多次迭代才能收敛
归一化(Normalization)方法泛指把数据特征转换为相同尺度的方法
-
最小最大值归一化(Min-Max Normalization)是一种非常简单的归一化方法,通过缩放将每一个特征的取值范围归一到 [ 0 , 1 ] 或 [ − 1 , 1 ] [0, 1]或[−1, 1] [0,1]或[−1,1] 之间.
假设有𝑁 个样本 { x ( n ) } n = 1 N \{x^{(n)}\}_{n=1}^{N} {x(n)}n=1N ,对于每一维特征 x x x,归一化后的特征为
x ^ ( n ) = x ( n ) − m i n n ( x ( n ) ) m a x n ( x ( n ) ) − m i n n ( x ( n ) ) \hat x^{(n)}=\frac {x^{(n)}-min_n(x^{(n)})}{max_n(x^{(n)})-min_n(x^{(n)})} x^(n)=maxn(x(n))−minn(x(n))x(n)−minn(x(n)) -
标准化(Standardization)也叫Z值归一化(Z-Score Normalization),来源于统计上的标准分数.将每一个维特征都调整为均值为0,方差为1.
假设有𝑁 个样本 { x ( n ) } n = 1 N \{x^{(n)}\}_{n=1}^{N} {x(n)}n=1N ,对于每一维特征 x x x,我们先计算它的均值和方差:
μ = 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{(x^{(n)}-\mu)^2} \end{aligned} μσ2=N1n=1∑Nx(n)=N1n=1∑N(x(n)−μ)2
之后 x − μ σ \frac {x-\mu}{\sigma} σx−μ 进行标准化,okay. -
白化(Whitening)是一种重要的预处理方法,用来降低输入数据特征之间的冗余性.输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相同的方差. 白化的一个主要实现方式是使用主成分分析(Principal Component Analysis,PCA)方法去除掉各个成分之间的相关性. 具 体 实 现 ? ? ? \textcolor{red}{具体实现???} 具体实现???
逐层归一化
逐层归一化(Layer-wise Normalization)是将传统机器学习中的数据归一化方法应用到深度神经网络中,对神经网络中隐藏层的输入进行归一化,从而使得网络更容易训练。
逐层归一化可以有效提高训练效率的原因有以下几个方面:
- 更好的尺度不变性 :在深度神经网络中,一个神经层的输入是之前神经层的输出.经过
f
(
w
a
(
l
−
1
)
+
b
)
f(wa^{(l-1)}+b)
f(wa(l−1)+b) 作用后,输入分布会发生变化
a
(
l
−
1
)
与
a
(
l
)
的
分
布
a^{(l-1)}与a^{(l)}的分布
a(l−1)与a(l)的分布。
当使用随机梯度下降来训练网络时,每次参数更新都会导致该神经层的输入分布发生改变.越高的层,其输入分布会改变得越明显。
从机器学习角度来看,如果一个神经层的输入分布发生了改变,那么其参数需要重新学习,这种现象叫作内部协变量偏移(Internal Covariate Shift)
把每个神经层的输入分布都归一化为标准正态分布,可以使得每个神经层对其输入具有更好的尺度不变性.不论低层的参数如何变化,高层的输入保持相对稳定.
另外,尺度不变性可以使得我们更加高效地进行参数初始化以及超参选择. - 更平滑的优化地形:逐层归一化一方面可以使得大部分神经层的输入处于不饱和区域,从而让梯度变大,避免梯度消失问题;
另一方面还可以使得神经网络的优化地形(Optimization Landscape)更加平滑,以及使梯度变得更加稳定,从而允许我们使用更大的学习率,并提高收敛速度。
下面介绍几种比较常用的逐层归一化方法:批量归一化、层归一化、权重归一化和局部响应归一化.
批量归一化
对单一神经元:标准化后放缩平移
批量归一化(Batch Normalization,BN)方法是一种有效的逐层归一化方法, 可以对神经网络中任意的中间层进行归一化操作.
对于一个深度神经网络,对于第
l
l
l 层有:
a
(
l
)
=
f
(
z
(
l
)
)
=
f
(
W
a
(
l
−
1
)
+
b
)
a^{(l)}=f(z^{(l)})=f(Wa^{(l-1)}+b)
a(l)=f(z(l))=f(Wa(l−1)+b)
为了提高优化效率,就要使得净输入
z
(
l
)
z^{(l)}
z(l) 的分布一致,比如都归一化到标准正态分布.
在实践中归一化操作一般应用在仿射变换(Affine Transformation) W a ( l − 1 ) + b Wa^{(l-1)}+b Wa(l−1)+b之后、激活函数之前.
逐层归一化需要在中间层进行操作,要求效率比较高 ,因此复杂度比较高的白化方法就不太合适.
为了提高归一化效率,一般使用标准化将净输入
z
(
l
)
z^{(l)}
z(l) 的每一维都归一到标准正态分布.
z ^ l = z ( l ) − E [ z ( l ) ] v a r ( z ( l ) ) + ϵ \hat z^l=\frac {z^{(l)}-E[z^{(l)}]}{\sqrt {var(z^{(l)})+\epsilon}} z^l=var(z(l))+ϵz(l)−E[z(l)]
当前小批量样本集的均值 μ \mu μ 和方差 σ 2 \sigma^2 σ2 近似估计 E [ z ( l ) ] 和 v a r ( z ( l ) ) E[z^{(l)}]和var(z^{(l)}) E[z(l)]和var(z(l)).
给定一个包含
K
K
K 个样本的 小批量样本集合(Batch),第
l
l
l 层神经元的净输入
z
(
1
,
l
)
,
z
(
2
,
l
)
,
.
.
.
,
z
(
K
,
l
)
,
z^{(1,l)},z^{(2,l)},...,z^{(K,l)},
z(1,l),z(2,l),...,z(K,l), 的均值和方差为
μ
B
=
1
K
∑
k
=
1
K
z
(
k
,
l
)
σ
B
2
=
1
K
∑
k
=
1
K
(
z
(
k
,
l
)
−
μ
B
)
⊙
(
z
(
k
,
l
)
−
μ
B
)
\begin{aligned} \mu_B&=\frac 1 K\sum_{k=1}^{K}{z^{(k,l)}}\\ \sigma_B^2&=\frac 1 K \sum_{k=1}^{K}{(z^{(k,l)}-\mu_B)\odot(z^{(k,l)}-\mu_B)} \end{aligned}
μBσB2=K1k=1∑Kz(k,l)=K1k=1∑K(z(k,l)−μB)⊙(z(k,l)−μB)
但是标准化后, z ( l ) z^{(l)} z(l) 的数据会在0附近,对于sigmoid型激活函数,将会失去非线性。
为了使得归一化不对网络的表示能力造成负面影响,可以通过一个附加的缩放和平移变换改变取值区间.
z
^
(
l
)
=
z
(
l
)
−
μ
B
σ
B
2
+
ϵ
⊙
γ
+
β
≜
B
N
γ
,
β
(
z
(
l
)
)
\begin{aligned} \hat z^{(l)}&=\frac {z^{(l)}-\mu_B} {\sqrt{\sigma_B^2+\epsilon}} \odot\gamma+\beta\\ &\triangleq BN_{\gamma,\beta}(z^{(l)}) \end{aligned}
z^(l)=σB2+ϵz(l)−μB⊙γ+β≜BNγ,β(z(l))
从最保守的角度考虑,可以通过标准归一化的逆变换来使得归一化后的变量可以被还原为原来的值.
当
γ
=
σ
B
2
,
β
=
μ
B
\gamma=\sqrt{\sigma_B^2},\beta=\mu_B
γ=σB2,β=μB.时有
z
^
(
l
)
=
z
(
l
)
\hat z^{(l)}=z^{(l)}
z^(l)=z(l)
批量归一化操作可以看作一个特殊的神经层,加在每一层非线性激活函数之前,即
a
(
l
)
=
f
(
B
N
γ
,
β
(
z
(
l
)
)
)
=
f
(
B
N
γ
,
β
(
W
a
(
l
−
1
)
)
)
a^{(l)}=f(BN_{\gamma,\beta}(z^{(l)}))=f(BN_{\gamma,\beta}(Wa^{(l-1)}))
a(l)=f(BNγ,β(z(l)))=f(BNγ,β(Wa(l−1)))
其中因为批量归一化本身具有平移变换,所以仿射变换
W
a
(
l
−
1
)
Wa^{(l-1)}
Wa(l−1) 不再需要偏置参数.
值得一提的是,逐层归一化不但可以提高优化效率,还可以作为一种隐形的正则化方法.
在训练时,神经网络对一个样本的预测不仅和该样本自身相关,也和同一批次中的其他样本相关.
由于在选取批次时具有随机性,因此使得神经网络不会“过拟合”到某个特定样本,从而提高网络的泛化能力
层归一化
对整层神经元:标准化后放缩平移
批量归一化的缺陷: 对一个中间层的单个神经元进行归一化操作,因此要求小批
量样本的数量不能太小,否则难以计算单个神经元的统计信息.此外,如果一个
神经元的净输入的分布在神经网络中是动态变化的,比如 循环神经网络 ,那么就无法应用批量归一化操作.
层归一化是和批量归一化非常类似的方法.和批量归一化不同的是, 层归一化是对一个中间层的所有神经元进行归一化.
对于深度神经网络,对于第 l l 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}{(z_i^{(l)}-\mu^{(l)})^2} \end{aligned}
μ(l)σ(l)2=Ml1i=1∑Mlzi(l)=Ml1i=1∑Ml(zi(l)−μ(l))2
其中
M
l
M_l
Ml 为第
l
l
l 层的神经元数量.
层归一化定义为:
z
^
(
l
)
=
z
(
l
)
−
μ
(
l
)
σ
(
l
)
2
+
ϵ
⊙
γ
+
β
≜
L
N
γ
,
β
(
z
(
l
)
)
\begin{aligned} \hat z^{(l)} &= \frac {z^{(l)-\mu^{(l)}}}{\sqrt{\sigma^{{(l)}^2}+\epsilon}} \odot \gamma +\beta\\ &\triangleq LN_{\gamma,\beta}(z^{(l)}) \end{aligned}
z^(l)=σ(l)2+ϵz(l)−μ(l)⊙γ+β≜LNγ,β(z(l))
其中 γ \gamma γ 和 β \beta β 分别代表缩放和平移的参数向量,和 z ( l ) z^{(l)} z(l) 维数相同.
循环神经网络中的层归一化
假设在时刻
t
t
t ,循环神经网络的隐藏层为
h
t
h_t
ht,其层归一化的更新为
z
t
=
U
h
t
−
1
+
W
x
t
h
t
=
f
(
L
N
γ
,
β
(
z
t
)
)
\begin{aligned} z_t&=Uh_{t-1}+Wx_t\\ h_t&=f(LN_{\gamma,\beta}(z_t)) \end{aligned}
ztht=Uht−1+Wxt=f(LNγ,β(zt))
在标准循环神经网络中,循环神经层的净输入一般会随着时间慢慢变大或变小,从而导致梯度爆炸或消失.而层归一化的循环神经网络可以有效地缓解这种状况.
层归一化和批量归一化整体上是十分类似的,差别在于归一化的方法不同.
对于 𝐾 个样本的一个小批量集合
Z
(
l
)
=
[
z
(
1
,
l
)
;
.
.
.
;
z
(
K
,
l
)
]
Z^{(l)}=[z^{(1,l)};...;z^{(K,l)}]
Z(l)=[z(1,l);...;z(K,l)] ,层归一化是对矩阵
Z
(
l
)
Z^{(l)}
Z(l) 的每一列进行归一化,而批量归一化是对每一行进行归一化.
一般而言,批量归一化是一种更好的选择.当小批量样本数量比较小时,可以选择层归一化.
权重归一化
权重归一化(Weight Normalization)是对神经网络的连接权重进行归一化,通过再参数化(Reparameterization)方法,将连接权重分解为长度和方向两种参数.
假设第
l
l
l 层神经元
a
(
l
)
=
f
(
W
a
l
−
1
+
b
)
a^{(l)}=f(Wa_{l-1}+b)
a(l)=f(Wal−1+b) ,我们将
W
W
W 再参数化为
W
i
,
:
=
g
i
∥
v
i
∥
v
i
,
1
≤
i
≤
M
l
W_{i,:}=\frac {g_i} {\Vert v_i\Vert}v_i,\quad 1\le i\le M_l
Wi,:=∥vi∥givi,1≤i≤Ml
W
i
,
:
W_{i,:}
Wi,: 表示权重
W
W
W 的第i行,参数
g
i
g_i
gi 为标量,
v
i
v_i
vi 和
a
(
l
−
1
)
a^{(l-1)}
a(l−1) 维数相同
由于在神经网络中(Convolution)权重经常是共享的 ,权重数量往往比神经元数量要少,因此权重归一化的开销会比较小.
局部响应归一化
局部响应归一化(Local Response Normalization,LRN)是一种受生物学启发的归一化方法, 通常用在基于卷积的图像处理上.
局部响应归一化和层归一化都是对同层的神经元进行归一化.不同的是,局部响应归一化应用在激活函数之后,只是对邻近的神经元进行局部归一化,并且不减去均值.
局部响应归一化和生物神经元中的 侧抑制(lateral inhibition)
现象比较类似,即活跃神经元对相邻神经元具有抑制作用.
当使用ReLU作为激活函数时,神经元的活性值是没有限制的,局部响应归一化可以起到平衡和约束作用.如果一个神经元的活性值非常大,那么和它邻近的神经元就近似地归一化为 0,从而起到抑制作用,增强模型的泛化能力.
最大汇聚也具有侧抑制作用.但最大汇聚是对同一个特征映射中的邻近位置中的神经元进行抑制, 而局部响应归一化是对同一个位置的邻近特征映射中的神经元进行抑制.
超参数优化
常见的超参数有以下三类:
- 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等.
- 优化参数,包括优化方法、学习率、小批量的样本数量等.
- 正则化系数.
超参数优化(Hyperparameter Optimization)主要存在两方面的困难:
- 超参数优化是一个组合优化问题, 无法像一般参数那样通过梯度下降方法来优化 ,也没有一种通用有效的优化方法; (无实际表达式–贝叶斯)
- 评估一组超参数配置(Configuration)的 时间代价非常高 ,从而导致一些优化方法(比如演化算法(Evolution Algorithm))在超参数优化中难以应用.
对于超参数的配置,比较简单的方法有网格搜索、随机搜索、贝叶斯优化
、动态资源分配
和神经架构搜索
.
网格搜索
遍历取值空间
网格搜索(Grid Search)是一种通过尝试所有超参数的组合来寻址合适一
组超参数配置的方法.
网格搜索根据这些超参数的不同组合分别训练一个模型,然后测试这些模型在开发集上的性能,选取一组性能最好的配置.
随机搜索
**不同超参数对模型性能的影响有很大差异.**有些超参数(比如正则化系数)对模型性能的影响有限,而另一些超参数(比如学习率)对模型性能影响比较大.
在这种情况下,采用网格搜索会在不重要的超参数上进行不必要的尝试.
一种在实践中比较有效的改进方法是对超参数进行随机组合,然后选取一个性能最好的配置,这就是随机搜索(Random Search).
随机搜索在实践中更容易实现,一般会比网格搜索更加有效.
网格搜索和随机搜索都没有利用不同超参数组合之间的相关性, 即如果模型的超参数组合比较类似,其模型性能也是比较接近的.因此这两种搜索方式一般都比较低效.
贝叶斯优化
贝叶斯优化(Bayesian optimization)是一种自适应的超参数优化方法, 根据当前已经试验的超参数组合,来预测下一个可能带来最大收益的组合.
一种比较常用的贝叶斯优化方法为时序模型优化(Sequential Model-Based Optimization,SMBO)
.
假设超参数优化的函数 f ( x ) f(x) f(x) 服从高斯过程,则 p ( f ( x ) ∣ x ) p(f(x)\vert x) p(f(x)∣x) 为一个正态分布.贝叶斯优化过程是根据已有的 N N N 组试验结果 H = { x n , y n } n = 1 N \mathcal{H}=\{x_n,y_n\}_{n=1}^N H={xn,yn}n=1N ( y n y_n yn 为 f ( x n ) f(x_n) f(xn) 的观测值)来建模高斯过程,并计算 f ( x ) f(x) f(x) 的后验分布 p G P ( f ( x ) ∣ x , H ) \mathcal{p}_\mathcal{GP}(f(x)\vert x,\mathcal{H}) pGP(f(x)∣x,H).
为了使得
p
G
P
(
f
(
x
)
∣
x
,
H
)
\mathcal{p}_\mathcal{GP}(f(x)\vert x,\mathcal{H})
pGP(f(x)∣x,H) 接近其真实分布,就需要对样本空间进行 足够多的采样 .
但是超参数优化中每一个样本的生成成本很高,需要用尽可能少的样本来使得
p
θ
(
f
(
x
)
∣
x
,
H
)
\mathcal{p}_{\theta}(f(x) \vert x,\mathcal{H})
pθ(f(x)∣x,H) 接近于真实分布.
因此, 需要通过定义一个收益函数(Acquisition Function)
a
(
x
,
H
)
a(x,\mathcal{H})
a(x,H) 来判断一个样本是否能够给建模
p
θ
(
f
(
x
)
∣
x
,
H
)
\mathcal{p}_{\theta}(f(x)\vert x,\mathcal{H})
pθ(f(x)∣x,H) 提
供更多的收益. 收益越大,其修正的高斯过程会越接近目标函数的真实分布.
收益函数
的定义有很多种方式.一个常用的是期望改善(Expected Improvement,EI)函数.假设
y
∗
=
m
i
n
{
y
n
,
1
≤
n
≤
N
}
y^*=min\lbrace y_n,1\le n\le N\rbrace
y∗=min{yn,1≤n≤N} 是当前已有样本中的最优值,期望改善函数为,
E
I
(
x
,
H
)
=
∫
−
∞
+
∞
m
a
x
(
y
∗
−
y
,
0
)
p
G
P
(
f
(
x
)
∣
x
,
H
)
d
x
EI(x,\mathcal{H})=\int_{-\infty}^{+\infty}{max(y^*-y,0)\mathcal{p}_\mathcal{GP}(f(x)\vert x,\mathcal{H})}\mathrm{d}x
EI(x,H)=∫−∞+∞max(y∗−y,0)pGP(f(x)∣x,H)dx
期望改善是定义一个样本
x
x
x 在当前模型
p
G
P
(
f
(
x
)
∣
x
,
H
)
\mathcal{p}_\mathcal{GP}(f(x)\vert x,\mathcal{H})
pGP(f(x)∣x,H) 下,
f
(
x
)
f(x)
f(x) 超过最好结果
y
∗
y^*
y∗ 的期望.
贝叶斯优化的一个缺点是高斯过程建模需要计算协方差矩阵的逆,时间复杂度是
O
(
N
3
)
O(N^3)
O(N3) ,因此 不能很好地处理高维情况 .
深度神经网络的超参数一般比较多,为了使用贝叶斯优化来搜索神经网络的超参数,需要一些更高效的高斯过程建模.
高斯过程
高斯过程(Gaussian Process)是一种应用广泛的 随机过程模型.假设有
一组连续随机变量
X
0
,
X
1
,
.
.
.
,
X
T
X_0,X_1,...,X_T
X0,X1,...,XT,如果由这组随机变量构成的任一有限集合
X
t
1
,
.
.
.
,
t
N
=
[
X
t
1
,
.
.
.
,
X
t
N
]
T
,
1
≤
N
≤
T
X_{t_1,...,t_N}=[X_{t_1},...,X_{t_N}]^T,\quad 1\le N\le T
Xt1,...,tN=[Xt1,...,XtN]T,1≤N≤T
都服从一个多元正态分布,那么这组随机变量为一个随机过程.
高斯过程也可以定义为:如果
X
t
1
,
.
.
.
,
t
N
X_{t_1,...,t_N}
Xt1,...,tN 的任一线性组合都服从一元正态分布,那么这组随机变量为一个随机过程.
高斯过程回归(Gaussian Process Regression) 是利用高斯过程来对一个函数分布进行建模.
和机器学习中参数化建模(比如贝叶斯线性回归)相比,高斯过程是一种非参数模型,可以拟合一个黑盒函数,并给出拟合结果的置信度。
假设一个未知函数 f ( x ) f(x) f(x) 服从高斯过程,且为平滑函数.如果两个样本 x 1 , x 2 x_1,x_2 x1,x2 比较接近,那么对应的 f ( x 1 ) , f ( x 2 ) f(x_1),f(x_2) f(x1),f(x2) 也比较接近.
假设从函数 f ( x ) f(x) f(x) 中采样有限个样本 X = [ x 1 , x 2 , . . . , x N ] X=[x_1,x_2,...,x_N] X=[x1,x2,...,xN] ,这 N N N 个点服从一个多元正态分布,
二元正态分布记作 ( X 1 , X 2 ) ∼ N ( μ 1 , μ 2 , σ 1 2 , σ 2 2 , ρ ) (X_1,X_2)\sim N(\mu_1,\mu_2,\sigma_1^2,\sigma_2^2,\rho) (X1,X2)∼N(μ1,μ2,σ12,σ22,ρ) okay
κ ( x i , x j ) \kappa(x_i,x_j) κ(xi,xj) 协方差
在高斯过程回归中,一个常用的核函数是平方指数1 (Squared Exponential)
核函数:
κ ( x i , x j ) = e x p ( − ∥ x i − x j ∥ 2 2 l 2 ) \kappa(x_i,x_j)=exp(\frac{-\Vert x_i-x_j\Vert^2}{2l^2}) κ(xi,xj)=exp(2l2−∥xi−xj∥2)
其中𝑙 为超参数.当 x i x_i xi 和 x j x_j xj 越接近,其函数值越大,表明 f ( x i ) , f ( x j ) f(x_i),f(x_j) f(xi),f(xj) 越相关.
假设 f ( x ) f(x) f(x) 的一组带噪声的观测值为 { ( x n , y n ) } n = 1 N \lbrace (x_n,y_n) \rbrace_{n=1}^{N} {(xn,yn)}n=1N , 其中 y n ∼ N ( f ( x n ) , σ 2 ) y_n \sim \mathcal{N}(f(x_n),\sigma^2) yn∼N(f(xn),σ2) 为 f ( x n ) f(x_n) f(xn) 的观测值,服从正态分布, σ \sigma σ 为噪声方差.
更新 – 高斯过程
对于一个新的样本点 x ∗ x^* x∗ ,我们希望预测 f ( x ∗ ) f(x^*) f(x∗) 的观测值 y ∗ y^* y∗ .令向量 y = [ y 1 , y 2 , . . , y N ] T y=[y_1,y_2,..,y_N]^T y=[y1,y2,..,yN]T 为已有的观测值,根据高斯过程的假设, [ y ; y ∗ ] [y;y^*] [y;y∗] 满足
[
y
y
∗
]
∼
N
(
[
μ
X
μ
x
∗
]
,
[
K
(
X
,
X
)
+
σ
2
I
K
(
x
∗
,
X
)
T
K
(
x
∗
,
X
)
κ
(
x
∗
,
x
∗
)
]
)
\begin{bmatrix}y\\y^*\end{bmatrix}\sim \mathcal{N}(\begin{bmatrix}\mu_{X}\\ \mu_{x^*}\end{bmatrix},\begin{bmatrix}K(X,X)+\sigma^2I && K(x^*,X)^T \\ K(x^*,X) && \kappa(x^*,x^*)\end{bmatrix})
[yy∗]∼N([μXμx∗],[K(X,X)+σ2IK(x∗,X)K(x∗,X)Tκ(x∗,x∗)])
其中
K
(
x
∗
,
X
)
=
[
κ
(
x
∗
,
x
1
)
,
.
.
.
,
κ
(
x
∗
,
x
n
)
]
K(x^*,X)=[\kappa(x^*,x_1),...,\kappa(x^*,x_n)]
K(x∗,X)=[κ(x∗,x1),...,κ(x∗,xn)]
根据上面的联合分布,
y
∗
y^*
y∗ 的后验分布为
p
(
y
∗
∣
X
,
y
)
=
N
(
μ
^
,
σ
^
2
)
p(y^* \vert X,y)=\mathcal{N}(\hat{\mu},\hat{\sigma}^2)
p(y∗∣X,y)=N(μ^,σ^2)
其中均值
μ
^
\hat{\mu}
μ^ 和方差
σ
^
2
\hat{\sigma}^2
σ^2 为
μ
^
=
K
(
x
∗
,
X
)
(
K
(
X
,
X
)
+
σ
2
I
)
−
1
(
y
−
μ
(
X
)
)
+
μ
(
x
∗
)
σ
^
2
=
κ
(
x
∗
,
x
∗
)
−
K
(
x
∗
,
X
)
(
K
(
X
,
X
)
+
σ
2
I
)
−
1
K
(
x
∗
,
X
)
T
\hat{\mu}=K(x^*,X)(K(X,X)+\sigma^2I)^{-1}(y-\mu(X))+\mu(x^*)\\ \hat{\sigma}^2=\kappa(x^*,x^*)-K(x^*,X)(K(X,X)+\sigma^2I)^{-1}K(x^*,X)^T
μ^=K(x∗,X)(K(X,X)+σ2I)−1(y−μ(X))+μ(x∗)σ^2=κ(x∗,x∗)−K(x∗,X)(K(X,X)+σ2I)−1K(x∗,X)T
均值函数
μ
(
x
)
\mu(x)
μ(x) 可以近似地互相抵消.在实际应用中,一般假设
μ
(
x
)
=
0
\mu(x)=0
μ(x)=0 ,均值
μ
^
\hat{\mu}
μ^ 可以简化为
μ
^
=
K
(
x
∗
,
X
)
(
K
(
X
,
X
)
+
σ
2
I
)
−
1
y
\hat{\mu}=K(x^*,X)(K(X,X)+\sigma^2I)^{-1}y
μ^=K(x∗,X)(K(X,X)+σ2I)−1y
动态资源分配
在超参数优化中,每组超参数配置的评估代价比较高.如果我们可以在较早的阶段就估计出一组配置的效果会比较差,那么我们就可以中止这组配置的评估,将更多的资源留给其他配置.
这个问题可以归结为多臂赌博机问题2 的一个泛化问题:最优臂问题(Best-Arm Problem),即在给定有限的机会次数下,如何玩这些赌博机并找到收益最大的臂.
和多臂赌博机问题类似,最优臂问题也是在利用和探索之间找到最佳的平衡.
由于目前神经网络的优化方法一般都采取随机梯度下降,因此我们可以通过 一组超参数的学习曲线来预估 这组超参数配置是否有希望得到比较好的结果.
如果一组超参数配置的学习曲线不收敛或者收敛比较差,我们可以应用早期停止(Early-Stopping)
策略来中止当前的训练.
动态资源分配的关键是将有限的资源分配给更有可能带来收益的超参数组合
.
一种有效方法是逐次减半(Successive Halving)方法
将超参数优化看作一种非随机的最优臂问题.
假设要尝试
N
N
N 组超参数配置,总共可利用的资源预算(摇臂的次数)为
B
B
B,我们可以通过
T
=
⌈
log
2
N
⌉
−
1
T=\lceil \log_2^N\rceil-1
T=⌈log2N⌉−1 轮逐次减半的方法来选取最优的配置.
在逐次减半方法中,尝试的超参数配置数量𝑁 十分关键.
- 如果𝑁 越大,得到最佳配置的机会也越大,但每组配置分到的资源就越少,这样早期的评估结果可能不准确.
- 如果 𝑁 越小,每组超参数配置的评估会越准确,但有可能无法得到最优的配置.
因此,如何设置 𝑁 是平衡“利用-探索”的一个关键因素. ???具体如何设置N???
神经架构搜索
上面介绍的超参数优化方法都是 在固定(或变化比较小)的超参数空间 X \mathscr{X} X 中进行最优配置搜索,而最重要的神经网络架构一般还是需要由有经验的专家来进行设计.
神经架构搜索(Neural Architecture Search,NAS)是一个新的比较有前景的研究方向,通过神经网络来自动实现网络架构的设计.
一个神经网络的架构可以用一个变长的字符串来描述.利用元学习的思想,神经架构搜索利用一个控制器来生成另一个子网络的架构描述.控制器可以由一个循环神经网络来实现.控制器的训练可以通过强化学习来完成,其奖励信号为生成的子网络在开发集上的准确率.
网络正则化
正则化(Regularization)是一类通过限制模型复杂度,从而避免过拟合,提高泛化能力的方法,比如引入约束、增加先验、提前停止等.
在传统的机器学习中,提高泛化能力的方法主要是限制模型复杂度,比如采用 ℓ 1 \ell_1 ℓ1 和 ℓ 2 \ell_2 ℓ2 正则化等方式.
而在训练深度神经网络时,特别是在过度参数化3 (Over-Parameterization)时, ℓ 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 范数来减小模型在训练数据集上的过拟合现象.
通过加入
ℓ
1
\ell_1
ℓ1 和
ℓ
2
\ell_2
ℓ2 正则化,优化问题可以写为
θ
∗
=
arg
min
θ
1
N
∑
n
=
1
N
L
(
y
(
n
)
,
f
(
x
(
n
)
;
θ
)
)
+
λ
ℓ
p
(
θ
)
\theta^*=\arg\min_{\theta}{\frac 1 N \sum_{n=1}^N{\mathcal{L}(y^{(n)},f(x^{(n)};\theta))}+\lambda\ell_p(\theta)}
θ∗=argθminN1n=1∑NL(y(n),f(x(n);θ))+λℓp(θ)
ℓ p \ell_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
u
b
j
e
c
t
t
o
:
ℓ
p
(
θ
)
≤
1
\theta^*=\arg\min_{\theta}{\frac 1 N \sum_{n=1}^N{\mathcal{L}(y^{(n)},f(x^{(n)};\theta))}},\\ subject\enspace to: \quad \ell_p(\theta)\le 1
θ∗=argθminN1n=1∑NL(y(n),f(x(n);θ)),subjectto:ℓp(θ)≤1
ℓ
1
\ell_1
ℓ1 范数 (
ℓ
1
(
θ
)
=
∑
d
=
1
D
∣
θ
d
∣
\ell_1(\theta)=\sum_{d=1}^{D}{\vert\theta_d\vert}
ℓ1(θ)=∑d=1D∣θd∣)在零点不可导,因此经常用下式来近似:
ℓ
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
ϵ 为一个非常小的正常数.
下图给出了不同范数约束条件下的最优化问题示例.红线表示函数 ℓ p = 1 \ell_p=1 ℓp=1, F \mathcal{F} F 为函数 f ( θ ) f(\theta) f(θ) 的等高线(为简单起见,这里用直线表示).
一种折中的正则化方法是同时加入
ℓ
1
\ell_1
ℓ1 和
ℓ
2
\ell_2
ℓ2 正则化,称为弹性网络正则化
(Elastic Net Regularization).
θ
∗
=
arg
min
θ
1
N
∑
n
=
1
N
L
(
y
(
n
)
,
f
(
x
(
n
)
;
θ
)
)
+
λ
1
ℓ
1
(
θ
)
+
λ
2
ℓ
2
(
θ
)
\theta^*=\arg\min_{\theta}{\frac 1 N \sum_{n=1}^N{\mathcal{L}(y^{(n)},f(x^{(n)};\theta))}+\lambda_1\ell_1(\theta)+\lambda_2\ell_2(\theta)}
θ∗=argθminN1n=1∑NL(y(n),f(x(n);θ))+λ1ℓ1(θ)+λ2ℓ2(θ)
其中
λ
1
\lambda_1
λ1 与
λ
2
\lambda_2
λ2 为正则化系数。
权重衰减
回顾
权重衰减(Weight Decay)是一种有效的正则化方法,在每次参数更新时,引入一个衰减系数.
θ
t
←
(
1
−
β
)
θ
t
−
1
\theta_t\leftarrow (1-\beta)\theta_{t-1}
θt←(1−β)θt−1
β
\beta
β 为权重衰减系数,一般取值比较小,比如 0.0005.
在标准的随机梯度下降中,权重衰减正则化和
ℓ
2
\ell_2
ℓ2 正则化的效果相同.
?
理
解
?
\textcolor{red}{?理解?}
?理解? 因此,权重衰减在一些深度学习框架中通过
ℓ
2
\ell_2
ℓ2 正则化来实现.但是,在较为复杂的优化方法(比如 Adam)中,权重衰减正则化和
ℓ
2
\ell_2
ℓ2 正则化并不等价。
提前停止
回顾
提前停止(Early Stop)对于深度神经网络来说是一种简单有效的正则化方法.
提前停止由于深度神经网络的拟合能力非常强,因此比较容易在训练集上过拟合.
使用梯度下降法进行优化时,我们可以使用一个和训练集独立的样本集合,称为验证集(Validation Set),并用验证集上的错误来代替期望错误.当验证集上的错误率不再下降,就停止迭代.
丢弃法
回顾 – 卷积神经网路介绍随即丢弃
当训练一个深度神经网络时,我们可以随机丢弃一部分神经元(同时丢弃其对应的连接边)来避免过拟合,这种方法称为丢弃法(Dropout Method)
最简单的方法是设置一个固定的概率 p p p .对每一个神经元都以概率 p p p 来判定要不要保留.对于一个神经层 y = f ( W x + b ) y=f(Wx+b) y=f(Wx+b) ,我们可以引入一个掩蔽函数 m a s k ( ⋅ ) mask(\cdot) mask(⋅) 使得 y = f ( W m a s k ( x ) + b ) y=f(Wmask(x)+b) y=f(Wmask(x)+b).
KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ mask(x)= \begi…
其中 m ∈ { 0 , 1 } D m \in \lbrace 0,1 \rbrace^D m∈{0,1}D 是丢弃掩码(Dropout Mask),通过以概率为 𝑝 的伯努利分布随机生成.
在训练时,激活神经元的平均数量为原来的𝑝倍.而在测试时,所有的神经元都是可以激活的,这会造成训练和测试时网络的输出不一致.
为了缓解这个问题,在测试时需要将神经层的输入 x x x 乘以 p p p,也相当于把不同的神经网络做了平均.保留率 p p p 可以通过验证集来选取一个最优的值.
一般来讲,对于隐藏
层的神经元,其保留率 p = 0.5 p=0.5 p=0.5 时效果最好,这对大部分的网络和任务都比较有效.
对于输入层的神经元,其保留率通常设为更接近1的数,使得输入变化不会太大.对输入层神经元进行丢弃时,相当于给数据增加噪声,以此来提高网络的鲁棒性.
集成学习角度的解释 每做一次丢弃,相当于从原始的网络中采样得到一个子网络.
如果一个神经网络有 𝑛 个神经元,那么总共可以采样出
2
n
2^n
2n 个子网络.每次迭代都相当于训练一个不同的子网络,这些子网络都共享原始网络的参数.那么, 最终的网络可以近似看作集成了指数级个不同网络的组合模型.
贝叶斯学习角度的解释 丢弃法也可以解释为一种贝叶斯学习的近似.用 y = f ( x ; θ ) y=f(x;\theta) y=f(x;θ) 来表示要学习的神经网络,贝叶斯学习是假设参数 θ \theta θ 为随机向量,并且先验分布为 q ( θ ) q(\theta) q(θ),贝叶斯方法的预测为
E q ( θ ) [ y ] = ∫ q f ( x ; θ ) q ( θ ) d θ ≈ 1 M ∑ m = 1 M f ( x , θ m ) \begin{aligned} \mathbb{E}_{q(\theta)}[y]&=\int_q{f(x;\theta)q(\theta)\mathrm{d}\theta}\\ &\approx \frac 1 M \sum_{m=1}^M{f(x,\theta_m)} \end{aligned} Eq(θ)[y]=∫qf(x;θ)q(θ)dθ≈M1m=1∑Mf(x,θm)
其中 f ( x , θ m ) f(x,\theta_m) f(x,θm) 为第𝑚次应用丢弃方法后的网络,其参数 θ m \theta_m θm 为对全部参数 θ \theta θ 的一次采样.
循环神经网络上的丢弃法
当在循环神经网络上应用丢弃法时,不能直接对每个时刻的隐状态进行随机丢弃,这样会损害循环网络在时间维度上的记忆能力.
一种简单的方法是对非时间维度的连接(即非循环连接)进行随机丢失
然而根据贝叶斯学习的解释,丢弃法是一种对参数 θ \theta θ 的采样.每次采样的参数需要在每个时刻保持不变.因此,在对循环神经网络上使用丢弃法时, 需要对参数矩阵的每个元素进行随机丢弃,并在所有时刻都使用相同的丢弃掩码. 这种方法称为变分丢弃法
数据增强
深度神经网络一般都需要大量的训练数据才能获得比较理想的效果.在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加数据量,提高模型鲁棒性,避免过拟合.
目前,数据增强还主要应用在图像数据(GAN、、、)上, 在文本等其他类型的数据上还没有太好的方法.
图像数据的增强主要是通过算法对图像进行转变,引入噪声等方法来增加数据的多样性.增强的方法主要有几种:
- 旋转(Rotation):将图像按顺时针或逆时针方向随机旋转一定角度.
- 翻转(Flip):将图像沿水平或垂直方法随机翻转一定角度.
- 缩放(Zoom In/Out):将图像放大或缩小一定比例.
- 平移(Shift):将图像沿水平或垂直方法平移一定步长.
- 加噪声(Noise):加入随机噪声.
标签平滑
在数据增强中,我们可以给样本特征加入随机噪声来避免过拟合.同样,我们也可以给样本的标签引入一定的噪声.
假设训练数据集中有一些样本的标签是被错误标注的,那么最小化这些样本上的损失函数会导致过拟合.一种改善的正则化方法是标签平滑 即在输出标签中添加噪声来避免模型过拟合
一个样本𝒙的标签可以用one-hot向量表示,这种标签可以看作硬目标(Hard Target).
如果使用Softmax分类器并使用交叉熵损失函数,最小化损失函数会使得正确类和其他类的权重差异变得很大.
根据Softmax 函数的性质可知,如果要使得某一类的输出概率接近于 1,其未归一化的得分需要远大于其他类的得分,可能会导致其权重越来越大,并导致过拟合.
此外,如果样本标签是错误的,会导致更严重的过拟合现象
我们可以引入一个噪声对标签进行平滑,即假设样本以
ϵ
\epsilon
ϵ 的概率为其他类.
平滑后的标签为
y
~
=
[
ϵ
K
−
1
,
.
.
.
,
ϵ
K
−
1
,
1
−
ϵ
,
ϵ
K
−
1
,
.
.
.
,
ϵ
K
−
1
]
T
\tilde{y}=[\frac {\epsilon}{K-1},...,\frac {\epsilon}{K-1},1-\epsilon,\frac {\epsilon}{K-1},...,\frac {\epsilon}{K-1}]^T
y~=[K−1ϵ,...,K−1ϵ,1−ϵ,K−1ϵ,...,K−1ϵ]T
其中 𝐾 为标签数量,这种标签可以看作软目标(Soft Target).
标签平滑可以避免模型的输出过拟合到硬目标上,并且通常不会损害其分类能力.
上面的标签平滑方法是给其他 K − 1 K-1 K−1 个标签相同的概率 ϵ K − 1 \frac {\epsilon}{K-1} K−1ϵ ,没有考虑标签之间的相关性 .一种更好的做法是按照类别相关性来赋予其他标签不同的概率.
总结
深度神经网络的优化和正则化是既对立又统一的关系.
- 一方面我们希望优化算法能找到一个全局最优解(或较好的局部最优解),
- 另一方面我们又不希望模型优化到最优解,这可能陷入过拟合。
在优化方面,训练神经网络时的主要难点是非凸优化以及梯度消失问题.
优化的三个方向:
- 修改网络模型来得到更好的优化地形,比如使用逐层归一化、残差连接以及ReLU激活函数等;
- 使用更有效的优化算法,比如动态学习率以及梯度估计修
正等; - 使用更好的参数初始化方法.
目前,深度神经网络的泛化能力还没有很好的理论支持.在传统机器学习模型上比较有效的 ℓ 1 \ell_1 ℓ1 或 ℓ 2 \ell_2 ℓ2 正则化在深度神经网络中作用也比较有限,而一些经验的做法(比如小的批量大小、大的学习率、提前停止、丢弃法、数据增强)会更有效.