3.7.网络优化
神经网络到机器学习的难点问题:
优化问题:深度神经网络优化困难
损失函数是非凸函数,找全局最优解很难。
深度神经网络参数很多,训练数据很大,无法使用二阶优化算法,而一阶效率比较低。
存在梯度消失和梯度爆炸问题。
泛化问题:复杂度比较高,容易在训练集上产生过拟合。
主要解决办法:网络优化/网络正则化。
1.网络优化
找到一个神经网络模型使得经验(结构)风险最小化的过程,包括模型选择、参数学习等。
1.1.网络结构多样化
神经网络种类很多:
卷积网络
循环网络
图网络
很难找到一种通用的优化方法,不同优化在不同网络中表现也有所差异。
1.2.高维变量的非凸优化
梯度下降法容易陷入局部最优点,因此低维优化主要在于:选择最优参数、逃离局部最优。
鞍点:在高维空间中,非凸优化难点不在逃离局部最优点,而是逃离鞍点(Saddle Point),鞍点的梯度是0,但在某些维度上是最高点,在另一些维度上是最低点。

高维空间中,局部最小值(Local Minima)要求在每个维度上都是最低点,假设10000维参数,梯度为0的点(驻点(Stionary Point))在每一维度上的局部最小值概率为p,那么整个空间中,这种概率为p10000,即高维空间中大部分点都是鞍点。梯度下降的优化方法会在鞍点附近停滞,一种解决办法是引入随机性。
平坦最小值:深度神经网络参数多,并有一定冗余性,使得每个参数对最终损失影响比较小,因此会导致损失函数在局部最小解附近通常是平坦区域,称为平坦最小值(Flat Minima),对比平坦最小值和尖锐最小值(Sharp Minima)。
当一个模型收敛到一个平坦局部最小值,鲁棒性会更好,微小参数变化不影响模型能力。当一个模型收敛到一个尖锐局部最小值,鲁棒性会比较差。
局部最小解的等价性:在比较大的神经网络中,大部分局部最小解是等价的,它们在测试集上性能相似——某种情况下没有必要找全局最小值,容易过拟合。
1.3.改善方法
使用更有效的优化算法提高梯度下降优化的效率和稳定性:学习率调整、梯度估计修正。
使用更好的参数初始化方法、数据预处理方法提高优化效率。
修改网络结构找到更好的优化地形(Optimization Landscape),如:ReLU激活函数、残差连接、逐层归一化。
使用更好的超参数优化方法。
2.优化算法
目前深度神经网络都是使用梯度下降法优化,主要分为:
批量梯度下降
随机梯度下降
小批量梯度下降
优化算法大体上分两类:
调整学习率,使得优化更稳定
梯度估计修正,优化训练速度
2.1.小批量梯度下降
不用在整个训练集上计算梯度,因此,在训练深度神经网络时,经常使用小批量梯度下降法(Mini-Batch Gradient Descent)。
令f(x;θ)表示一个深度神经网络,θ为网络参数,在使用小批量梯度下降进行优化时,每次选取K个训练样本St={(x(k),y(k))}k=1K,第t次迭代(Iteration)时损失函数关于θ的偏导数:
gt(θ)=K1(x,y)∈St∑∂θ∂L(y,f(x;θ))
其中L(⋅)为可微分的损失函数,K称为批量大小(Batch Size),第t次更新梯度gt定位为
gt≜gt(θt−1)
梯度下降更新参数公式:
θt←θt−1−αgt
每次迭代参数更新的差值为:
Δθt≜θt−θt−1
从上述公式可以知道,影响梯度下降的主要因素有:
批量大小K
学习率α
梯度估计
2.2.批量大小选择
批量大小(Batch Size)对网络优化影响很大:它不会影响梯度的期望,但通常会影响梯度的方差。
批量大小越大,方差越小、引入噪声越小、训练越稳定、可设置更大的学习率。
批量大小较小,则需要较小的学习率。
学习率的大小要随着批量大小的增大而相应地增大,简单有效的一个方法是线性缩放规则(Linear Scaling Rule)
回合(Epoch)和迭代(Iteration)的关系:
1回合(Epoch)=(批量大小K训练样本数量N)×迭代(Iteration)
批量大小和模型泛化能力也相关:批量越大,越有可能收敛到尖锐最小值;批量越小,越有可能收敛到平坦最小值。
2.3.学习率调整
学习率是神经网络优化的超参数,梯度下降优化中,这个参数很重要:
如果过大可能不会收敛
过小则收敛速度太慢
常用的学习率调整方法如:
学习率衰减
学习率预热
周期性学习率调整
自适应学习率:AdaGrad, RMSprop, AdaDelta
2.3.1.学习率衰减
学习率一开始要保持很大,收敛到最优点附近时要小,所以比较简单的调整方式是学习率衰减(Learning Rate Decay),也称学习率退火(Learning Rate Annealing)
分段常数衰减(Piecewise Constant Decay):即每经过T1,T2,...,Tm次迭代将学习率衰减成原来的β1,β2,...,βm倍,其中Tm和βm<1为根据经验设置的超参数,分段常数衰减也称为阶梯衰减(Step Decay)。
逆时衰减(Inverse Time Decay),β为衰减率:
αt=α01+β×t1
指数衰减(Exponential Decay),β<1为衰减率:
αt=α0βt
自然指数衰减(Natural Exponential Decay),β为衰减率:
αt=α0exp(−β×t)
余弦衰减(Cosine Decay),T为总迭代次数:
αt=21α0(1+cos(Ttπ))

2.3.2.学习率预热
为了提高训练稳定性,可以在最初几轮迭代时采用较小的学习率,等梯度下降一定程度后再恢复,这种方法称为学习率预热(Learning Rate Warmup)。最常用的一个学习预热方法是逐渐预热(Gradual Warmup):
αt′=T′tα0,1≤t≤T′
预热的迭代次数为T′
初始学习率为α0
2.3.3.周期学习率调整
为了使得梯度下降法逃离鞍点或尖锐最小值,一种经验方式是在训练过程中周期性增大学习率,当参数小于尖锐最小值则增大学习率——增大学习率有可能在平坦最小值的吸引域(Basin Of Attraction),常用的周期学习率方法:
循环学习率
带热重启的随机梯度下降
循环学习率,最简单的方法是循环学习率(Cyclic Learning Rate)——让一个区间内周期性增大或减小,通常使用线性缩放调整,称为三角循环学习率(Triangular Cyclic Learning Rate)。
m=[1+2ΔTt]
每个循环周期长度相等都为2ΔT,其中前ΔT步为学习率增大阶段,后ΔT步为学习率缩小阶段。
t次迭代时,最终求解的循环周期m如上。
[⋅]表示向下取整,最终计算t次迭代的学习率为:
αt=αminm+(αmaxm−αminm)(max(0,1−b))
αminm,αmaxm分别为m个周期中的上下界,b∈[0,1]计算公式为
b=∣ΔTt−2m+1∣
带热重启的随机梯度下降(Stochastic Gradient Descent with Warm Restarts, SGDR)是用热重启方式替代学习率衰减方法。
αt=αminm+21(αmaxm−αminm)(1+cos(TmTcurπ))
Tm为重启周期,可随重启次数逐渐增加。
Tcur为从上次重启之后的回合(Epoch)数。

2.3.4.AdaGrad算法
AdaGrad算法(Adaptive Gradient Algorithm)借鉴了l2正则化的思想,每次迭代时自适应地调整每个参数的学习率,在第t次迭代时,先计算每个参数梯度平方累计值:
Gt=γ=1∑Tgγ⊙gγ
AdaGrad算法的参数更新差值为
Δθt=−Gt+ϵα⊙gt
AdaGrad算法中,如果某个参数偏导数累积比较大,其学习率相对较小;反之,如果偏导数累积较小,则学习率比较大;该算法的缺点是经过一定次数的迭代依然没找到最优点时,由于学习率很小很难继续找最优点。
2.3.5.RMSprop算法
RMSprop算法是一种自适应学习率的方法,可在有些情况下避免了AdaGrad算法中学习率不断单调下降以至过早衰减的缺点。
RMSprop算法计算gt平方指数衰减移动平均:
Gt=(1−β)γ=1∑tβt−γgt⊙gt
β是衰减率,一般取值0.9
RMSprop算法参数的更新差值为
Δθt=−Gt+ϵα⊙gt
RMSprop和AdaGrad算法的区别在于Gt的计算从累积方式变成了指数衰减移动平均,在迭代过程中,每个参数的学习率并不是呈衰减趋势,即可变小也可变大。
2.3.6.AdaDelta算法
AdaDelta算法是AdaGrad算法的一个改进,和RMSprop算法类似,AdaDelta算法通过梯度平方指数衰减移动平均来调整学习率,此外AdaDelta算法还引入了每次参数更新差值Δθ。
AdaDelta算法的指数衰减移动平均为
ΔXt−12=β1ΔXt−22+(1−β1)Δθt−1⊙Δθt−1
AdaDelta算法的参数更新差值为
Δθt=−Gt+ϵΔXt−12+ϵgt
AdaDelta算法将RMSprop算法中的初始学习率α改成了动态计算ΔXt−12,在一定程度上平抑了学习率的波动。
2.4.梯度估计修正
除调整学习率,还可以进行梯度估计(Gradient Estimation)的修正。
2.4.1.动量法
动量(Momentum)是模拟物理中的概念,动量法(Momentum Method)是用之前累积的动量代替真正的梯度,每次迭代梯度可看做加速度;在第t次迭代时,计算负梯度加权移动平均作为参数更新方向:
Δθt=ρΔθt−1−αgt=−αγ−1∑tρt−γgγ
ho为动量因子,通常为0.9。
α为学习率。
2.4.2.Nesterov加速梯度
Nesterov加速度(Nesterov Accelerated Gradient, NAG)是一种对动量法的改进,也称Nesterov动量法(Nesterov Momentum),它和动量法对比如下:

2.4.3.Adam算法
Adam算法(Adaptive Moment Estimation Algorithm)可以看做动量法和RMSprop算法的结合:既可使用动量作参数更新方向,而且可自适应调整学习率。
Adam算法的参数更新差值为
Δθt=−Gt^+ϵαMt^
Adam算法是RMSProp算法和动量法的结合,因此一种自然Adam算法的改进是引入Nesterov加速梯度,称为Nadam算法。
2.4.4.梯度截断
为了避免梯度爆炸,当梯度的模大于一定阈值时,就对梯度进行截断,称为梯度截断(Gradient Clipping),截断分类:
按值截断:gt=max(min(gt,b),a),最大最小值合并求解
按模截断:按模截断是将梯度的模截断到一个给定的截断阈值b:gt=∣∣gt∣∣bgt
2.4.5.优化算法小结
常用方法汇总
学习率调整
固定衰减学习率
分段常数衰减、逆时衰减、(自然)指数衰减、余弦衰减
学习率调整
周期性学习率
循环学习率、SGDR
学习率调整
自适应学习率
AdaGrad、RMSprop、AdaDelta
梯度估计修正
动量法、Nesterov加速梯度、梯度截断
综合方法
Adam ≈ 动量法 + RMSprop
3.参数初始化
参数初始化通常有如下方法:
预训练初始化(Pre-trained Initialization):通常一个已经在大规模数据上训练过的模型可提供一个好的参数初始值。
随机初始化(Random Initialization):解决对称权重的问题。
固定值初始化。
3.1.基于固定方差的参数初始化
高斯分布初始化:使用一个高斯分布N(0,σ2)对每个参数随机初始化。
均匀分布初始化,在一个给定区间[−r,r]内采用均匀分布初始化,通常计算方差为:
var(x)=12(b−a)2 如果var(x)=σ2,则最终计算值为: r=3σ2
3.2.基于方差缩放的参数初始化
激活函数为ReLU,容易出现输出过大
激活函数为Sigmoid,容易过饱和
为了缓解梯度消失或爆炸问题,尽可能保持每个神经元输入和输出方差一致,根据神经元连接数量自适应调整初始化分布的方差,这一类问题称为方差缩放(Variance Scaling)。
Xavier初始化
He初始化
比对结果如
初始化方法
激活函数
均匀分布[−r,r]
高斯分布N(0,σ2)
Xavier初始化
Logistic
r=4Ml−1+Ml6
σ2=16×Ml−1+Ml2
Xavier初始化
Tanh
r=Ml−1+Ml6
σ2=Ml−1+Ml2
He初始化
ReLU
r=Ml−16
σ2=Ml−12
3.3.正交初始化
假设一个L层的等宽线性网络(激活函数为恒等函数)
y=W(L)W(L−1)...W(1)x
为了避免梯度消失或梯度爆炸问题,我们希望误差在反向传播中具有范数保持性(Norm-Preserving),即:∣∣δ(l−1)∣∣2=∣∣δl∣∣2=∣∣(W(l))Tδ(l)∣∣2,一种更直接的方式是将W(l)初始化为正交矩阵,这种方法为正交初始化(Orthogonal Initialization),两步:
用均值0、方差为1的高斯分布初始化一个矩阵。
将这个矩阵用奇异值分解得到两个正交矩阵,并使用其中一个做权重矩阵。
4.数据预处理
通常特征样本来源和度量单位的不同,它们的尺度(Scale)差异很大,不同机器学习模型对尺度敏感性不一样,如果一个算法在特征缩放和尺度变更后依旧不影响最终的预测结果,那么该算法就具有尺度不变性(Scale Invariance)。理论上讲神经网络应该具有尺度不变性,可通过调参来适应不同的尺度,但尺度不同(量纲不统一)会增加训练的难度,所以在机器学习之前数据预处理就变得十分重要了。
归一化(Normalization)方法指把数据特征转换成相同尺度的方法,如把最终数据压缩到[0,1]或[-1,1]区间内,或映射为服从均值为0、方差为1的标准正态分布。
最小最大值归一化(Min-Max Normalization)是最常见的归一化方法,最终值区间会归一化到
[0,1]之间,归一化公式为:x(n)^=maxn(x(n))−minn(x(n))x(n)−minn(x(n))
标准化(Standardization)也称为Z值归一化(Z-Score Normalization),它来源于统计上的标准分数,将为一个特征都调整为均值为0、方差为1的标准正态分布:
均值:μ=N1n−1∑Nx(n) 方差:σ2=N1n=1∑N(x(n)−μ)2 最终得到新的特征值:x^(n)=σx(n)−μ
白化(Whitening)是一种重要的预处理方法,用来降低数据特征之间冗余性,通过白化过后的特征之间相关性比较低,并且所有特征具有相同的方差,白化的一个主要实现方式是主成分分析(Principal Component Analysis, PCA)
5.逐层归一化
逐层归一化(Layer-wise Normalization)是将传统机器学习中的数据归一化方法应用到深度神经网络中,对神经网络中隐藏层的输入进行归一化,从而使得网络更容易训练。逐层归一化的优势:
更好的尺度不变性:如果一个神经层的输入分布发生了改变,那么参数需要重新学习,这种现象称为内部协变量偏移(Internal Covariate Shift),把每个神经层的输入分布都归一化为标准正态分布,可以使得每个神经层对其输入具有更好尺度不变性。
更平滑的优化地形:逐层归一化使得大部分神经层的输入处于不饱和区域,让梯度变大以避免梯度消失问题,另一方面使得神经网络的优化地形(Optimization Landscape)更加平滑,让梯度变得更加稳定。
5.1.批量归一化
批量归一化(Batch Normalization, BN)可以对神经网络中任意的中间层进行归一化操作:
a(l)=f(z(l))=f(Wα(l−1)+b)
f(⋅)是激活函数
W,b是可学习的参数
实践过程中,归一化操作通常应用在仿射变换(Affine Transformation)Wα(l−1)+b之后,激活函数之前;为了提高归一化效率,通常使用标准化将净输入z(l)的每一维都归一到标准正态分布:
z^(l)=var(z(l))+ϵz(l)−E[z(l)]
给定一个包含了K个样本的小批量样本集合,第l层神经元的净输入z(l)的均值和方差为
μB=K1k=1∑Kz(k,l)
σB2=K1k=1∑K(z(k,l)−μB)⊙(z(k,l)−μB)
为了使得归一化对不同网络的表示能力造成负面影响,可通过一个附加的缩放和平移变换来改变取值空间,实际上批量归一化可以看做一个特殊的神经层,加在每一层非线性激活函数之前,它的定义如:
z^(l)=σB2+ϵz(l)−μB⊙γ+β
γ和β分别代表平移和缩放的参数向量。
5.2.层归一化
批量归一化是对一个中间层的单个神经元进行归一化操作,所以样本量不能太大,如果一个神经元净输入的分布在神经网络中是动态变化的(RNN),那么就无法使用批量归一化。
层归一化(Layer Normalization)是和批量归一化类似的操作,不同点在于层归一化是对一个中间层的所有神经元执行归一化。如果第l层神经元净输入为z(l),它的均值和方差为:
μ(l)=Ml1i=1∑Mlzi(l)
σl2=Ml1i=1∑Ml(zi(l)−μ(l))2
循环神经网络中的层归一化:层归一化可应用在循环神经网络中,对循环神经层执行归一化操作,这种操作可以有效缓解梯度爆炸和梯度消失的问题。
一般批量归一化更好,若小批量样本数量比较小的时候,可选择层归一化。
5.3.权重归一化
权重归一化(Weight Normalization)是对神经网络权重进行归一化,通过再参数化(Reparameterization)的方法,将权重分解成长度、方向两种参数,假设第l层神经元为:a(l)=f(Wa(l−1)+b),再参数化为:
Wi,:=∣∣vi∣∣givi,1≤i≤Ml
5.4.局部响应归一化
局部响应归一化(Local Response Normalization, LRN)是一种生物学启发的归一化方法,主要用在基于卷积的图像处理上。局部响应归一化是对邻近的特征映射进行局部归一化:
Y^p=Yp/(k+α∑j=max(1,p−2n)min(P,p+2n)(Yj)2)β≜LRNn,k,α,β(Yp)
局部归一化应用在激活函数之后,它只对邻近的神经元进行局部归一化,并且不减去均值,它和生物学中侧抑制(lateral inhibition)现象类似。
6.超参数优化
常见的三类超参数:
网络结构:神经元连接关系、层数、每层神经元数量、激活函数类型
优化参数:包括优化方法、学习率、小批量样本数量
正则化系数
超参数优化(Hyperparameter Optimization)的两个难点:
它是一个组合优化,无法通过一般参数那种梯度下降法来直接优化,也没有通用有效的优化方法。
评估一组超参数配置(Configuration)的时间代价很高,导致一些优化方法难以应用。
6.1.网格搜索
网格搜索(Grid Search)是一种通过尝试所有超参数组合来寻址合适一组超参数配置的方法。
6.2.随机搜索
对超参数进行随机组合,然后选取一组性能最好的配置,这就是随机搜索(Random Search),比网格搜索更加高效。
上述两种方法都没有利用不同超参数组合之间的相关性。
6.3.贝叶斯优化
贝叶斯优化(Bayesian optimization)是一种自适应的超参数方法,根据当前已经试验的超参数组合,预测下一个可能带来最大收益的组合,最常用的贝叶斯优化是时序模型优化(Sequential Model-Based Optimization, SMBO),它根据已经有的N组实验结果建立高斯模型,计算f(x)的后验分布,为了使得该分布接近于真实分布,对空间进行更多采样,为了尽可能少的样本计算,通过定义一个收益函数(Acquisition Function)来判断该样本是否对模型提供更多收益。
收益函数定义方式:
期望改善(Expected Improvment, EI)
改善概率(Probability of Improvement)
高斯过程置信上界(GP Upper Confidence Bound, GP-UCB)
6.4.动态资源分配
在超参数优化中,如果很早就可以评估配置效果差,那么可以中止这组配置的评估,将资源留给其他配置,这个问题可归结多臂赌博机问题:最优臂问题(Best-Arm Problem),即在给定有限的机会次数下,如何玩赌博机并找到最大收益。
目前神经网络优化都是使用了梯度下降法,如果一组超参数配置的学习曲线不收敛或收敛差,可使用早期停止(Early-Stopping)策略来中止训练。动态资源分配的关键是将有限资源分配给更有可能带来收益的超参数组合:
逐次减半(Successive Halving)
HyperBand改进方法
6.5.神经架构搜索
神经架构搜索(Neural Architecture Search, NAS)通过神经网络实现网络架构的自动设计:使用一个控制器生成另一个子网络的结构,控制器训练可使用强化学习来完成。
7.网络正则化
正则化(Regularization)是一类通过限制模型复杂度,从而避免过拟合,提高泛化能力的方法,如:引入约束、增加先验、提前停止。
传统机器学习
l1和l2正则化方法
深度学习
数据增强
提前停止
丢弃法
集成法
7.1.l1,l2正则化
公式:
θ∗=argθminN1n=1∑NL(y(n),f(x(n);θ))+λlp(θ)
L(⋅)是损失函数
N是迅联样本数量
f(⋅)是待学习的神经网络
θ为参数
lp为范数函数
l1范数在零点不可导,所以有近似公式:
l1(θ)=d=1∑Dθd2+ϵ
l1比较稀疏,l2更平滑,还可以同时引入l1和l2,弹性网络正则化(Elastic Net Regularization)
θ∗=argθminN1n=1∑NL(y(n),f(x(n);θ))+λ1l1(θ)+λ2l2(θ)
7.2.权重衰减
权重衰减(Weight Decay)在每次参数更新时,引入一个衰减系数:
θt→(1−β)θt−1−αgt
gt为第t步更新时的梯度
α为学习率
β为权重衰减系数,一般为
0.0005
标准随机梯度下降,权重衰减和l2正则化效果相同,深度学习中不等价。
7.3.提前停止
提前停止(Early Stop)对深度网络而言十分有效:使用梯度下降法优化时,可使用一个和训练集独立的样本集合,验证集(Validation Set),并使用验证集上的错误代替期望错误,验证集上错误率不再下降,则停止迭代。
7.4.丢弃法
训练一个神经网络模型时,可随机丢弃部分神经元,这种方法称为丢弃法(Dropout Method),每次选择丢弃的神经元是随机的。设置固定概率p,对每个神经元以概率p判定要不要保留,对于神经层y=f(Wx+b),引入一个掩蔽函数mask(⋅):
m∈0,1D是丢弃掩码(Dropout Mask),通过以概率为p的伯努利分布随机生成。
集成学习角度的解释,贝叶斯学习角度的解释。
7.4.1.循环神经网络上的丢弃
在循环神经网络上丢弃时,不能直接对每个时刻的隐状态进行随机丢弃,这样会损害循环网络在时间维度上的记忆能力;丢弃法是一种对参数θ的采样,每次采样需要在每个时刻保持不变,因此在循环神经网络上使用丢弃时,需要对参数矩阵的每个元素进行随机丢弃,并要所有时刻都使用相同的丢弃掩码。——变分丢弃法(Variational Dropout)。
7.5.数据增强
数据增强(Data Augmentation)方法(图像数据增强示例)
旋转(Rotation)
翻转(Flip)
缩放(Zoom In/Out)
平移(Shift)
加噪声(Noise)
7.6.标签平滑
数据增强中,有时候会引入随机噪声避免过拟合,如果样本中标签错误标注,最小化这些样本上的损失函数会导致过拟合,改善方法就是标签平移(Label Smoothing)。
硬目标(Hard Target)
软目标(Soft Target)
最后更新于