文章目录
- 前言
- 一、网络优化
- 1.1网络结构多样性
- 1.2高维变量的非凸优化
- 1.鞍点
- 2.平坦最小值
- 3.局部最小解的等价性
- 1.3.改善方法
- 二、优化算法
- 2.1小批量梯度下降法(Min-Batch)
- 2.2批量大小选择
- 2.3学习率调整
- 1.学习率衰减(学习率退火)
- 分段常数衰减(阶梯衰减)
- 逆时衰减
- 指数衰减
- 自然指数衰减
- 余弦衰减
- 2.学习率预热(几乎标配)
- 3.周期性学习率调整
- **循环学习率**(三角循环学习率)
- **带热重启的随机梯度下降(SGDR)**
- 4.AdaGrad算法、RMSprop算法和AdaDelta
- 2.4梯度估计修正
- 1.动量法
- 2.Nesterov加速梯度
- 3.Adam算法
- 4.梯度截断
- 按值阶段
- 按模截断
- 2.5小结
- 三、参数初始化
- 3.1基于固定方差的参数初始化
- 3.2基于方差缩放的参数初始化
- 1.Xavier初始化
- 2.He初始化
- 3.4小结
- 3.3正交初始化
- 四、数据预处理
- 4.1规范化
- 4.2最小值最大值规范化
- 4.3标准化
- 4.4白化
- 五、逐层规范化
- 5.1批量规范化(BN)
- 5.2层规范化(LN)
- 1.RNN中的层规范化
- 2.与BN区别
- 5.3权重规范化
- 5.4局部相应规范化
- 六、超参数优化
- 6.1网格搜索
- 6.2随机搜索
- 6.3贝叶斯优化
- 6.4动态资源分配
- 七、网络正则化
- 7.1 l 1 l_1 l1和 l 2 l_2 l2正则化
- 7.2权重衰减
- 7.3早停法
- 7.4暂退法(Dropout)(几乎标配)
- RNN上的暂退法
- 7.5数据增强
- 7.6标签平滑
- 八、总结
- 总结
前言
神经网络调参是深度学习中不可或缺的一环,它直接影响着模型的性能和泛化能力。
当前神经网络模型应用到机器学习时仍有一些问题,主要包括两大类。
- 优化问题
深度神经网络优化十分困难。首先他的损失函数是一个非凸函数,找到局部最优解容易,但找到全局最优解并非容易。其次,神经网络参数非常多,训练数据很大,所以无法使用计算代价很高的二阶优化方法。最后,神经网络存在梯度消失或爆炸问题。
- 泛化问题
由于神经网络复杂度很高,拟合能力很强,很容易在训练集上过拟合。因此要考虑一定的正则化方法来改进网络泛化能力。
目前优化方法也很多,本文从网络优化和网络正则化方面介绍这些优化方法。
在网络优化方面:常用优化方法、参数初始化方法、数据预处理方法、逐层正则化方法和超参数优化方法。
在网络正则化方面:
l
1
l_1
l1和
l
2
l_2
l2正则化、权重衰减、提前停止、暂退法、数据增强和标签平滑。
各位道友!道长(zhǎng) 道长(chǎng)
一、网络优化
网络优化指寻找一个神经网络模型使得经验风险最小化(防止过拟合,多为结构风险最小化)的过程,包括模型选择和参数学习。
由于风险函数非凸,因此风险最小化是一个非凸优化问题。
此外还存在梯度消失问题。
1.1网络结构多样性
神经网络种类非常之多,因此很难找到通用的优化方法。
1.2高维变量的非凸优化
高维空间中,主要要考虑逃离鞍点问题(对比低维空间中的逃出局部最优解问题)。
1.鞍点
鞍点:梯度是0,但是在某些维度上是最高点,某些维度上是最低点。
用梯度下降法优化时,会在鞍点附近接近停滞,很难逃离。
2.平坦最小值
神经网络参数很多,且有冗余性。因此会导致各个参数对最终损失的影响很小。因此会导致损失函数在局部最小解附近通常是一个平坦区域,称为平坦最小值。
因此我们训练神经网络的时候,不需要精确找到一个局部最小解,只要在一个局部最小解邻域就够了。
通常,一个模型收敛到平坦的局部最小解时候,鲁棒性更好。
- 鲁棒性指模型面对危险、噪声时候,仍能保证良好的稳定性和准确度。
3.局部最小解的等价性
在非常大的神经网络中,大部分局部最小解是等价的。
因此,训练神经网络时,通常没有必要找全局最小值(可能会导致过拟合)。
1.3.改善方法
(1)有效的优化算法提高梯度下降的效率和稳定性
(2)更好的参数初始化方法、数据预处理方法来提高优化效率
(3)修改网络结构得到更好的优化地形
如图,下面是优化后的图形,明显看到优化地形可以让地形更加平滑,凸的地方会少很多。
(4)更好的超参数优化方法
二、优化算法
训练神经网络时常用的优化算法大体分为两类:
1)调整学习率,使得优化更稳定
2)**梯度估计修正,**优化训练速度
2.1小批量梯度下降法(Min-Batch)
f
(
x
;
θ
)
f(x;\theta)
f(x;θ)表示一个深度神经网络,
θ
\theta
θ为网络参数,小批量梯度下降时,每次选取K个训练样本
s
t
=
{
(
x
(
k
)
,
y
(
k
)
)
}
k
=
1
K
s_t=\{(x^{(k)},y^{(k)})\}_{k=1}^{K}
st={(x(k),y(k))}k=1K。第t次迭代时,损失函数关于参数
θ
\theta
θ的偏导数为
g
t
=
1
K
∑
(
x
,
y
)
∈
S
t
∂
L
(
y
,
f
(
x
;
θ
)
)
∂
θ
g_t=\frac1K \sum_{(x,y) \in S_t} \frac{\partial L(y,f(x;\theta))}{\partial \theta}
gt=K1(x,y)∈St∑∂θ∂L(y,f(x;θ))
- L为损失函数,K为批量大小
是用梯度下降法更新参数
θ
t
←
θ
t
−
1
−
α
g
t
−
1
\theta_t \leftarrow \theta_{t-1}-\alpha g_{t-1}
θt←θt−1−αgt−1
- α > 0 \alpha>0 α>0为学习率
每次参数更新差值为
Δ
θ
t
\Delta \theta_t
Δθt
Δ
θ
t
=
θ
t
−
θ
t
−
1
\Delta \theta_t=\theta_t-\theta_{t-1}
Δθt=θt−θt−1
因此,在标准小批量梯度下降中, Δ θ t = − α g t − 1 \Delta \theta_t=-\alpha g_{t-1} Δθt=−αgt−1
- 由此可见,影响小批量梯度下降的主要因素有:
1)批量大小K 2)学习率 α \alpha α 3)梯度估计
2.2批量大小选择
批量大小(Batch Size)对网络优化影响非常大。
通常,不影响随机梯度的期望,但是会影响随机梯度的方差。
- 批量越大,随机梯度方差越小,训练越稳定,所以 α \alpha α可以大些
- 批量越小,随机梯度方差越大,所以
α
\alpha
α可以小些,否则会不收敛
(调参的时候有一个线性缩放规则:批量增加m倍时, α \alpha α也增加m倍)
迭代:每一次小批量更新一次
回合:所有训练集样本更新一次
1
E
p
o
c
h
=
(
训练样本数量
N
批量大小
K
)
∗
I
t
e
r
a
t
i
o
n
1 Epoch=(\frac{训练样本数量N}{批量大小K})*Iteration
1Epoch=(批量大小K训练样本数量N)∗Iteration
通常,
- 批量越大,越有可能收敛到尖锐最小值
- 批量越小,越有可能收敛到平坦最小值
2.3学习率调整
1.学习率衰减(学习率退火)
经验上看,开始学习率大些保证速度,在收敛最优点附近时小些,避免来回震荡。
分段常数衰减(阶梯衰减)
每经过T1,T2…次迭代将学习率衰减为原来的 β 1 , β 2 . . . \beta_1,\beta_2... β1,β2...倍。
- T和 β \beta β为经验设置超参数
逆时衰减
α
t
=
α
0
1
1
+
β
∗
t
\alpha_t=\alpha_0\frac1{1+\beta*t}
αt=α01+β∗t1
β
\beta
β为衰减率
指数衰减
α
t
=
α
0
β
t
\alpha_t=\alpha_0\beta^t
αt=α0βt
β
<
1
\beta<1
β<1为衰减率
自然指数衰减
α t = α 0 exp ( − β ∗ t ) \alpha_t=\alpha_0\exp(-\beta*t) αt=α0exp(−β∗t)
余弦衰减
α
t
=
1
2
α
0
(
1
+
c
o
s
(
t
π
T
)
)
\alpha_t=\frac12\alpha_0(1+cos(\frac{t\pi}{T}))
αt=21α0(1+cos(Ttπ))
T为总迭代次数
- 示例,假设初始学习率为1
2.学习率预热(几乎标配)
学习率预热:为了提高训练稳定性,在最初几轮迭代时候,使用比较小的学习率,等梯度下降到一定程度后,恢复初始学习率。
一个常用的预热方法是逐渐预热,在预热过程中,学习率为
α
′
t
=
t
T
′
α
0
\alpha{^{'}}_t=\frac{t}{T^{'}}\alpha_0
α′t=T′tα0
T
′
T^{'}
T′为预热的迭代次数
预热结束后,在选择一种学习率衰减的方法逐渐降低学习率。
3.周期性学习率调整
使用这种方法,有助于逃离鞍点或尖锐最小值
循环学习率(三角循环学习率)
带热重启的随机梯度下降(SGDR)
两种周期性学习率调整的示例
由图可见,学习率总体是下降的。
这样可以有助于逃离鞍点~
4.AdaGrad算法、RMSprop算法和AdaDelta
标准的梯度下降法中,每个参数在每次迭代时候都使用相同的学习率。
由于每个参数在不同维度上收敛速度不同,因此根据不同参数的收敛情况分别设置学习率。
- g t g_t gt为第t次迭代的梯度
- α \alpha α为初始学习率
- ϵ \epsilon ϵ为保持数值稳定性的非常小的常数(一般是 e − 7 e^{-7} e−7到 e − 10 e^{-10} e−10之间)
- ⊙ \odot ⊙为按元素乘积
- G t G_t Gt为每个参数梯度平方的累计值
- Δ θ t \Delta \theta_t Δθt为参数更新差值
- Δ X t − 1 2 \Delta X_{t-1}^{2} ΔXt−12为参数更新差值 Δ θ t \Delta \theta_t Δθt的指数衰减权移动平均(移动平均指的是一段时间内数据的平均值)
三种算法的对比
AdaGrad | RMSprop | AdaDelta |
---|---|---|
借鉴 l 1 l_1 l1和 l 2 l_2 l2正则化的思想 | AdaGrad的改进 | AdaGrad的改进 |
α \alpha α总体减小 | α \alpha α可以变大变小 | α \alpha α可以变大变小 |
如果每个参数的偏导数累计 G t G_t Gt大,那么学习率较小 | G t G_t Gt计算累计方式变成了指数衰减平均移动 | 引入梯度平方指数衰减移动平均来调整学习率 引入 Δ θ \Delta \theta Δθ的平方的指数衰减权移动平均 |
缺点:一定次数迭代后没有找到最优点,由于学习率已经很小了,很难再继续找到最优点 | 避免了AdaGrad中学习率不断下降以至于过早衰减的缺点 | 一定程度上平抑了学习率的波动 |
2.4梯度估计修正
如果每次选取的样本数据集较小,损失会震荡下降。也就是说,随机下降方法中每次迭代的梯度估计和整个数据集的最优梯度方向不一致,具有随机性。
一个有效的缓解这种随机性的方式是:通过使用最近一段时间的平均梯度来代替当前随机梯度作为更新的方向,提高优化速度。
1.动量法
动量法:用之前的累积动量来代替真正的梯度
- 其中 ρ \rho ρ为动量因子,通常为0.9
这样每个参数更新的差值取决于最近一段时间内梯度的加权平均。
当某个参数与最近一段时间内梯度方向不一致时,真实的参数更新幅度会变小;
相反,最近一段时间内的梯度方向一致时,真实的参数更新幅度变大,起到加速作用。
2.Nesterov加速梯度
一种对动量法的改进,也称为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
+
ρ
Δ
θ
t
−
1
Δ
θ
t
=
θ
^
−
α
g
t
\hat{\theta}=\theta_{t-1}+\rho \Delta \theta_{t-1}\\ \Delta \theta_t=\hat{\theta}-\alpha g_t
θ^=θt−1+ρΔθt−1Δθt=θ^−αgt
- 其中 g t 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 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 + ρ Δ θ t − 1 \hat{\theta}=\theta_t+\rho \Delta \theta_{t-1} θ^=θt+ρΔθt−1上的偏导数
动量法和Nesterov加速梯度在参数更新时的比较
3.Adam算法
可以看做Adam算法和RMS算法的结合。不但适用动量法作为参数更新方向,而且可以自适应调整学习率。
Adam算法一方面计算梯度平方的指数平均 G t G_t Gt(RMSprop类似),一方面计算梯度的指数加权平均 M t M_t Mt(动量法类似)
其中
β
1
\beta_1
β1,
β
2
\beta_2
β2为两个移动平均的衰减率,通常前者取0.9,后者取0.99.
在一开始,尤其是
M
0
=
0
M_0=0
M0=0和
G
0
=
0
G_0=0
G0=0时,带入以上两个公式,有
M
1
=
(
1
−
β
1
)
g
1
M_1=(1-\beta_1)g_1
M1=(1−β1)g1
G
1
=
(
1
−
β
2
)
g
t
⊙
g
t
G_1=(1-\beta_2)g_t \odot g_t
G1=(1−β2)gt⊙gt
这样就存在
M
1
M_1
M1和
G
1
G_1
G1会比真实值
M
1
=
g
t
M_1=g_t
M1=gt和
G
1
=
g
t
⊙
g
t
G_1=g_t \odot g_t
G1=gt⊙gt要小。所以会产生一个很有影响的偏差。所以需要进行对偏差的修正。
所以Adam的参数更新差值为
- 通常学习率取0.001,并且可以进行衰减,如 α t = α 0 / t \alpha_t=\alpha_0/\sqrt t αt=α0/t
此外,他也有一个改进版本Nadam算法,是引入Nesterov加速梯度
4.梯度截断
深度神经网络或循环神经网络中,除了梯度消失外,梯度爆炸也是增加学习效率的主要因素。
如果梯度突然增大,用大的梯度更新参数会让其远离最优点。如图所示
为了避免这种情况,当梯度的模大于一定阈值时,就对梯度进行截断,称为梯度截断。
按值阶段
这样可以让梯度在[a,b]内
按模截断
截断阈值b是一个超参数,也可以根据一段时间内的平均梯度自动调整。
如果
∣
∣
g
t
∣
∣
2
≤
b
||g_t||^2\leq b
∣∣gt∣∣2≤b,保持
g
t
g_t
gt不变;
否则,令
实验中发现,训练过程对b不是十分敏感,通常一个小的阈值可以得到更好的结果。
2.5小结
各种优化方法汇总:
这几种方法在MNIST数据集上的收敛性比较(学习率0.001,批量大小128)
三、参数初始化
参数初始化的方式主要有以下三种:
(1)预训练初始化:
不同的参数初值会收敛到不同的局部最优解。好的初始值会得到一个泛化能力高的局部最优解。
通常,一个已经在大模型数据上训练过的模型可以提供一个好的参数初始值,这种初始化方法称为预训练初始化。
预训练模型在目标任务上的学习过程也称为精调
(2)随机初始化
对称权重现象:在神经网络中,如果把参数都设置为0,在第一遍前向计算时候,所有的隐藏层神经元的激活值都相同;反向传播时,所有权重更新也都相同,导致了隐藏层神经元没有区分性。
为了打破这个平衡,比较好的方式时对参数进行随机初始化
(3)固定值初始化
对于一些特殊参数,我们可以根据经验用特殊的固定值来进行初始化。比如偏置值b。
虽然预训练初始化通常有更好的收敛性和泛化性,但是灵活性不够。
这里介绍三类常用的随机初始化方法。
3.1基于固定方差的参数初始化
主要有以下两种:
1)基于高斯分布的初始化。(就是正态分布)
2)基于均匀分布的初始化。
这中方法中,如何设置方差是比较关键的。
如果参数取值范围太小:一是导致神经元输出太小,可能多层之后会慢慢消失;二是使得Sigmoid型激活函数丢失非线性能力
为了降低方差对网络性能和优化效率的影响,基于固定方差的随机初始化方法一般需要配合逐层规范化(后面会讲)来使用
3.2基于方差缩放的参数初始化
根据神经元的连接数量来自适应调整初始化分布的方差,称作方差缩放。
1.Xavier初始化
假设一个神经网络中,第i层神经元是
a
(
l
)
a^{(l)}
a(l),前一层的
M
l
−
1
M_{l-1}
Ml−1个神经元的输出是
a
(
l
−
1
)
a^{(l-1)}
a(l−1)
- f(·)是一个恒等函数,即f(x)=x
假设w和a的均值为0并且独立。
所以
a
(
l
)
a^{(l)}
a(l)的均值为
a
(
l
)
a^{(l)}
a(l)的方差为
也就是说,均值不变,但是方差被放大或缩小了
M
l
−
1
v
a
r
(
w
i
(
l
)
)
M_{l-1}var(w_i^{(l)})
Ml−1var(wi(l))倍(学过概率统计的话,这个推导应该不难)。
为了使信号不被过分放大或者减弱,使之维持原来的在
v
a
r
(
a
(
l
−
1
)
)
var(a^{(l-1)})
var(a(l−1))附近,让
M
l
−
1
v
a
r
(
w
i
(
l
)
)
M_{l-1}var(w_i^{(l)})
Ml−1var(wi(l))=1更加合理。
即
同理,反向传播中,误差信号
δ
\delta
δ也不至于被放大或缩小,保持原来的方差,有
作为折中,可以设置
这些是理想的方差。
- 这样可以通过高斯分布或均匀分布来随机初始化参数.即,
采用高斯分布的时候,可以采用 w i ( l ) ~ N ( 0 , 2 M l − 1 + M l ) w_i^{(l)}~N(0,\frac{2}{M_{l-1}+M_l}) wi(l)~N(0,Ml−1+Ml2)
在[-r,r]的均匀分布时,r的取值为 6 M l − 1 + M l \sqrt{\frac{6}{M_{l-1}+M_l}} Ml−1+Ml6 - 这种方法称为Xavier初始化
- Xavier初始化也适用于logistic函数和Tanh函数(因为他们在0的附近近似为线性函数)实际应用的时候,可以将方差乘一个缩放因子 ρ \rho ρ
2.He初始化
当第l层使用ReLU激活函数时,通常有一半的神经元输出为0,因此分布的方差也近似为使用恒等函数时的一半。
只考虑前向传播,参数w的理想方差为
3.4小结
3.3正交初始化
一个L层的等宽线形网络为
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
我们只要保持
W
(
l
)
(
W
(
l
)
)
T
=
I
W(l)(W{(l)})^T=I
W(l)(W(l))T=I(其中
I
I
I为单位矩阵),就可以一定程度上缓解梯度爆炸或消失问题。
方法:
1)用均值0,方差1的高斯分布初始化一个矩阵
2)将这个矩阵用奇异值分解(以后我就发文章讲奇异值分解)得到两个正交矩阵,并使用其中之一作为权重矩阵
四、数据预处理
一般而言,样本特征的尺度往往差异很大。
如果一个机器学习算法在缩放全部或部分特征后不影响他的学习和预测,称该算法有尺度不变性
比如线性分类器是尺度不变的,但是KNN是尺度敏感的,计算欧式距离时,尺度大的特征会占据主导地位。
理论上讲,神经网络是尺度不变性,但是尺度不同的输入特征会增加训练难度。
比如,tanh的导数在[-2,2]上敏感,其余地方导数接近1。如果参数范围是[-100,100],那么他的训练效率会受到很大影响。
尺度不同会造成大多数位置上的梯度方向不是最优的搜索方向。使用梯度下降时,需要多次迭代才能收敛。
4.1规范化
指把数据特征转换为相同尺度的方法。比如Sigmoid型函数把不同的尺度的特征压缩到一个比较受限的空间内。
4.2最小值最大值规范化
通过缩放,把每一个特征的取值范围规范化到[0,1]或[-1,1]
4.3标准化
也叫Z值规范化
将每一维特征都调整为均值为0,方差为1.
方法:
1)先计算均值和方差
然后标准化(学概率对这个应该不陌生)
4.4白化
使用主成分分析(PCA)去掉各个成分之间的相关性(主成分分析我在后面会讲的)
五、逐层规范化
优点:
1)更好的尺度不变性
缓解内部协变量偏移(随机梯度下降时,每次参数更新都会导致该神经层的输入分布发生改变。越高的层,输入分布改变的越明显)
2)更平滑的优化地形
5.1批量规范化(BN)
- 常用在CNN中
- BN提出的动机是为了解决内部协方差偏移问题,但是后来发现会导致更平滑的优化地形
- 小批量样本数量不可太小
BN可以对神经网络任意中间层进行规范化操作。
一个神经网络,第l层净输入为
z
(
l
)
z^{(l)}
z(l),神经元输出为
a
(
l
)
a^{(l)}
a(l)。
为了提高效率,考虑使得
z
(
l
)
z^{(l)}
z(l)(比
a
(
l
)
a^{(l)}
a(l)更利于优化)的分布一致(比如规范化到标准正态分布)
由于目前的优化算法时基于小批量随机梯度下降法,所以准确估计
z
(
l
)
z^{(l)}
z(l)的期望和方差不可行,通常用当前小批量样本集的均值和方差的近似估计。
由于对
z
(
l
)
z^{(l)}
z(l)规范化会让取值集中到0附近,如果用Sigmoid激活函数,会减弱神经网络的非线性功能。
为了使规范化不对网络造成负面影响,可以通过缩放和平移变换改变取值区间
- γ \gamma γ和 β \beta β分别代表缩放和平移的向量参数。
- 保守考虑,可以通过标准规范化的逆变换使得变量可以被还原回原来的值
- 批量规范化可以看做一个特殊的神经层,加在每一层非线性激活函数之前
- 由于批量规范化具有平移变换,所以 W a Wa Wa不需要偏置。
5.2层规范化(LN)
- 范围更广,RNN
层规范化与BN非常类似,不同的LN是对一个中间层的所有神经元进行规范化。
一个神经网络,第l层净输入为
z
(
l
)
z^{(l)}
z(l),它的均值和方差为
然后,层规范化的定义为
- γ \gamma γ和 β \beta β分别代表缩放和平移的向量参数。
1.RNN中的层规范化
循环神经网络隐藏层为
h
t
h_t
ht,层归一化更新为
- 层规范化的RNN网络可以有效缓解梯度爆炸和消失
2.与BN区别
对于K个样本的小批量集合
Z
(
l
)
=
[
z
(
1
,
l
)
,
z
(
2
,
l
)
,
.
.
.
,
z
(
K
,
l
)
]
Z^{(l)}=[z^{(1,l)},z^{(2,l)},...,z^{(K,l)}]
Z(l)=[z(1,l),z(2,l),...,z(K,l)]
LN是对矩阵的每一列进行规范化
BN是对矩阵的每一行进行规范化
5.3权重规范化
权重规范化是对神经网络的连接权重进行规范化。
假设第l层神经元
a
(
l
)
=
f
(
W
a
(
l
−
1
)
+
b
)
a^{(l)}=f(Wa {(l-1)}+b)
a(l)=f(Wa(l−1)+b),将W再参数化为
引入新参数
g
i
g_i
gi为标量,
v
i
v_i
vi和
a
(
l
−
1
)
a^{(l-1)}
a(l−1)的维数相同
- 在神经网络中,权重往往是贡献的,而且权重数量往往比神经元的数量少,因此权重规范化的开销会较小
5.4局部相应规范化
- 通常用在基于卷积的图像处理上
- 应用在激活函数之后
- 只对邻近的神经元进行规范化
- 不减去均值
- n,k, α \alpha α, β \beta β都是超参数
六、超参数优化
常见的超参数有:
1)网络结构,包括神经元的连接关系,层数,每层神经元的数量,激活函数的类型等
2)优化参数,包括优化方法,学习率,小批量样本数量
3)正则化系数
6.1网格搜索
一种尝试所有超参数组合来寻找一组超参数的配置方法。
如果超参数是连续的,可以将超参数离散化(不可等间隔化)
如
a
∈
{
0.01
,
0.1
,
0.4
,
1
}
a \in \{0.01,0.1,0.4,1\}
a∈{0.01,0.1,0.4,1}
网格搜索根据这些超参数的不同组合分别训练一个模型,然后测试各自的性能,选一个最好的
6.2随机搜索
对超参数进行随机组合,选取一个性能最好的配置
6.3贝叶斯优化
- 一种自适应的超参数优化方法
- 一种常用的贝叶斯优化方法是时序模型优化(SMBO)
假设超参f(x)服从高斯分布
p
(
f
(
x
)
∣
x
)
p(f(x)|x)
p(f(x)∣x),那么先验概率就是正态分布
贝叶斯优化过程就是根据已有的N组实验结果H来建模高斯过程,并计算f(x)的后验分布
p
(
f
(
x
)
∣
x
,
H
)
p(f(x)|x,H)
p(f(x)∣x,H)。
为了让后验分布接近真实分布,需要对样本进行足够的采样。但是超参数优化的每一个样本的生成成本很高。
因此定义一个收益函数来判断一个样本是否能给建模的高斯过程提供更多的收益。
一个常用的收益函数是期望改善,期望改善函数为
算法如下:
缺点:高斯过程建模需要计算协方差矩阵的逆,时间复杂度
O
(
N
3
)
O(N^3)
O(N3)
6.4动态资源分配
超参数优化中,如果我们在较早的阶段就估计出一组配置的效果差,就可以提前中止这种配置的评估,就会将更多的资源给其他的配置。
具体的,由于目前大多采用随机梯度下降法进行优化网络,因此可以通过一组超参数的学习曲线来预估这组超参数配置是否有希望得到比较好的结果。
如果曲线不收敛或者收敛较差,可以提前停止
还有另外一种方法是逐次减半法,如下
- 逐次减半法中,超参数的配置数量N很重要,
- 越大得到的最佳配置机会越大,但是每组分到的资源就少了。
- 越小的话,每组配置的评估会更准确,但可能无法得到最优配置
七、网络正则化
机器学习的关键是泛化问题,即在样本真实分布上的期望风险最小化。由于神经网络的拟合能力非常强,训练集的错误率会降到非常低,但是可能会导致过拟合。
正则化是一类通过限制模型复杂度,从而避免过拟合,提高泛化能力的方法。
7.1 l 1 l_1 l1和 l 2 l_2 l2正则化
l
1
l_1
l1和
l
2
l_2
l2正则化是机器学习中最常用的正则化方法。
该方法的优化问题可写为
θ
∗
=
arg
θ
min
1
N
∑
n
=
1
N
L
(
y
,
f
(
x
;
θ
)
)
+
λ
l
p
(
θ
)
\theta^*=\arg_\theta \min \frac1N \sum_{n=1}^N L(y,f(x;\theta))+\lambda l_p(\theta)
θ∗=argθminN1n=1∑NL(y,f(x;θ))+λlp(θ)
其中,p通常是1或2。
带正则化的优化问题等驾驭下列带约束的优化问题
θ
∗
=
arg
θ
min
1
N
∑
n
=
1
N
L
(
y
,
f
(
x
;
θ
)
)
s
.
t
.
l
p
(
θ
)
≤
1
\theta^*=\arg_\theta \min \frac1N \sum_{n=1}^N L(y,f(x;\theta)) \\ s.t. \quad l_p(\theta) \leq 1
θ∗=argθminN1n=1∑NL(y,f(x;θ))s.t.lp(θ)≤1
其中
l
1
l_1
l1范数在0点不可导,故这样来近似
l
1
(
θ
)
=
∑
d
=
1
D
θ
d
2
+
ϵ
l_1(\theta)=\sum_{d=1}^D \sqrt{\theta_d^2+\epsilon}
l1(θ)=d=1∑Dθd2+ϵ
D为参数数量,
ϵ
\epsilon
ϵ为一个很小的数
- 可以看出 l 1 l_1 l1范式容易使最优解位于坐标轴上,最终使参数为稀疏性变量。
折中的方法为同时加入 l 1 l_1 l1和 l 2 l_2 l2正则化,称为弹性网络正则化
7.2权重衰减
类似于动量法
每次参数更新时,引入一个衰减系数
θ
t
←
(
1
−
β
)
θ
t
−
1
−
α
g
t
\theta_t \leftarrow (1-\beta)\theta_{t-1}-\alpha g_t
θt←(1−β)θt−1−αgt
β
\beta
β通常为0.0005
7.3早停法
使用一个和训练集独立的样本集合称为验证集,用验证集的错误代替期望错误。当验证集的错误率不再下降,就停止迭代
7.4暂退法(Dropout)(几乎标配)
- 不可直接用于RNN,下面会讲用法
当训练一个神经网络时,如果一层的神经元很多,很可能有几个神经元的行为是一致的,一起增大一起减小,这叫协同效应。这种情况会降低模型的能力,而且训练的模型很脆弱,鲁棒性不是很好。
训练神经网络时,可以随机丢弃一部分神经元来避免过拟合,称为暂退法
最简单的方法是,设置一个固定概率p来判定要不要保留神经元。对于神经层y,可以引入一个掩蔽函数mask(·),使得
y
=
f
(
W
m
a
s
k
(
x
)
+
b
)
y=f(Wmask(x)+b)
y=f(Wmask(x)+b),
mask(·)定义为
m
a
s
k
(
x
)
=
{
m
⊙
x
当训练阶段时
p
x
当测试阶段时
mask(x)=\begin{cases} m \odot x\quad当训练阶段时\\ px\quad\quad当测试阶段时 \end{cases}
mask(x)={m⊙x当训练阶段时px当测试阶段时
- 其中,m={0,1}是丢弃掩码(Drop Mask),通过概率为p的伯努利分布随机生成
- 训练的时候使用掩码函数来丢弃一部分神经元可以理解,这是我们的策略。但是,为什么测试的时候还要将神经元乘p倍呢???
⟶ \longrightarrow ⟶这是因为如果不这样的话,会造成训练和测试的输出不一致的问题。由于训练的时候以p的概率丢弃了一部分神经元,也就相当于把神经元的数量降了p倍,所以相应的,测试的时候神经元降到p倍,也相当于给不同的神经网络做了平均。 - 一般来讲,隐藏层的保留率p为0.5最佳;输入层的保留率p接近1最佳
可以从不同的角度来理解Dropout法
- 集成学习角度:每丢弃一次,相当于从原始网络中采样得到一个子网络。如果有n个神经元,那么可以采样出 2 n 2^n 2n个子网络。(每个网络有2种选择[保留或丢弃],n个神经元就是n个2相乘) 每次迭代(即训练完一层网络)都相当于训练一个不同的子网络,由于这些子网络(即网络的每一层)都共享原始网络参数。那么最终网络可以近似看作指数级个不同的网络的组合模型。
- 贝叶斯学习角度:用
y
=
f
(
x
;
θ
)
y=f(x;\theta)
y=f(x;θ)表示要学习的网络,先验分布为
q
(
θ
)
q(\theta)
q(θ),贝叶斯方法预测为
E q ( θ ) [ y ] = ∫ q f ( x ; θ ) q ( θ ) d θ ≈ 1 M ∑ m = 1 M f ( x ; θ m ) E_{q(\theta)}[y]=\int_q f(x;\theta)q(\theta)d\theta \approx \frac1M\sum_{m=1}^Mf(x;\theta_m) Eq(θ)[y]=∫qf(x;θ)q(θ)dθ≈M1m=1∑Mf(x;θm)
f ( x ; θ m ) f(x;\theta_m) f(x;θm)为第m次应用暂退法后的网络(这个约等于号可以用定积分定义来理解)。
RNN上的暂退法
在循环神经网络上应用暂退法时,不能在时间维度上进行丢弃,否则会损害RNN在时间维度上的记忆能力。
- 一种简单的方法:在非时间维度上进行丢弃。
如图,(注意虚线的不同颜色,不同颜色为不同的丢弃掩码)
- 另一种方法是变分暂退法:根据贝叶斯的解释,暂退法是对参数
θ
\theta
θ的采样,每次采样的参数需要在每个时刻保持不变。
因此,对RNN使用暂退法时,需要对参数矩阵的每个元素进行随机丢弃,并在每个时刻使用相同的丢弃掩码。
如图(注意看,相同颜色表示相同的丢弃掩码)
7.5数据增强
深度神经网络一般在需要大量数据的时候才能获得理想的效果。
如果数据量有限,可以通过数据增强来增加数据量,提高鲁棒性,避免过拟合。
- 图像数据的增强方法:对图像进行旋转、翻转、缩放、平移、加噪声等操作。
- 文本数据的增强方法:对文本进行词汇替换、回译(例如把一句话翻译成英语,再把得到的英语翻译成中文。嘻嘻,应该很多人论文都是这么写的吧~)随机编辑噪声等操作。
7.6标签平滑
同数据增强一样,我们不但可以给样本特征加入随机噪声,还可以给样本标签加入一定的噪声。
如果训练数据集的一些样本标签是错误标注的,那么最小化这些样本的损失函数会导致过拟合。
一种改善的正则化方法是标签平滑,即在输出标签中添加噪声来避免过拟合。
如果一个x的标签是用one-hot向量表示。
y
=
[
0
,
.
.
.
,
0
,
1
,
0
,
.
.
.
,
0
]
T
y=[0,...,0,1,0,...,0]^T
y=[0,...,0,1,0,...,0]T
- 这种标签可以看做硬目标。
- 如果使用SoftMax函数作为分类器,如果一类的输出概率接近1,规范化之后回远大于其他类的得分,这样会导致过拟合。如果样本标签是错误的,会导致更严重的过拟合。
如果样本以
ϵ
\epsilon
ϵ的概率为其他类。平滑后的标签为(K为标签数量)
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
- 这种标签可以看做软目标
- 标签平滑可以避免模型输出过拟合到硬目标上,并且通常不损害分类能力。
但是上面的方法并没有考虑到标签之间的相关性。
一种更好的做法是知识蒸馏,按照类别相关性来赋予其他标签的不同概率。比如,先训练一个更复杂的大网络(教师网络),然后用大网络的输出作为软目标来训练网络(学生网络)
八、总结
为了得到一个分类效果不错的网络,总体而言要从三个方面来考虑
模型 | 优化 | 正则化 |
---|---|---|
用ReLU作为激活函数 | SGD+mini-batch(动态学习率、Adam算法优先) | 早停法(Early-Stop) |
残差连接 | 每次迭代都重新随机排序 | 暂退法(Dropout) |
逐层规范化 | 数据预处理(规范化) | 权重衰减 |
- | 参数初始化(预训练) | 批量规范化 |
- | - | l 1 l_1 l1和 l 2 l_2 l2正则化 |
- | - | 数据增强 |
通过这些方法,一般就可以得到一个不错的神经网络模型
总结
今天的内容是神经网络的网络优化与正则化部分,本文内容很多,但是又很重要。读本文时,可以结合邱锡鹏老师的蒲公英书进行学习。
夏天真的到了,天气很热,但是风景很好。
路边的花儿开的繁盛,树儿挺拔茂盛。
夏天总给人一种绿色的、五彩缤纷的有生命力的美。
大家在学习之余也要抽空多出去走走转转,多看看脚下周围,生活很累但请别忘了生活中的美。