神经网络模型应用到机器学习任务时,存在两大类难点:
- 优化问题:神经网络模型是一个非凸函数,再加上在深度网络中的梯度消失问题,很难进行优化;并且参数比较多,训练数据大,会导致训练效率低。
- 泛化问题:神经网络拟合能力强,容易在训练集上过拟合。因此在训练时,可通过正则化来改善泛化能力。
经验技巧,可从优化和正则化两个方面来提高学习效率并得到一个好的模型。
1. 网络优化
深度神经网络,是高度非线性模型,风险函数是非凸函数,风险最小化是非凸优化问题,会存在许多局部最优点。
1.1 网络优化的难点
1.1.1 网络结构的多样性
神经网络种类多样性,卷积网络,循环网络,图网络等,其各自结构也不同。深度不同,宽窄不同。不同参数在网络中的作用差异很大:连接权重、偏置、RNN中循环连接上的权重。
神经网络结构多样性,难找到通用的优化方法。
神经网络超参数多,给优化带来巨大挑战。
1.1.2 高维变量的非凸优化
低维空间非凸优化问题,主要是存在一些局部最优点,基于梯度下降的优化方法,会陷入局部最优;故难点是如何选择初始化参数和逃离局部最优点。
高维空间非凸优化问题,如深度神经网络的参数学习问题,其难点是如何逃离鞍点(Saddle Point)。
鞍点 鞍点的梯度为0,但他在一些维度上是最高点,一些维度上是最低点。如图:
高维空间中,局部最优要求每一维都是最低点,这种概率很低。假设网络有10000维参数,某一维梯度为 0 的点时局部最低点概率为 p ,整个参数空间中,梯度为0的点是局部最优点的概率为 p 10000 p^{10000} p10000,这种概率非常低,即高维空间中,梯度为0的点大部分都是鞍点。基于梯度下降的优化方法会难以逃离鞍点。故随机梯度下降对高维空间的非凸优化问题十分重要,因在梯度方向上引入了随机性,可有效逃离鞍点。
平坦最小值 深度神经网络参数很多,有冗余性,使得单个参数对最终的损失影响都小,从而使损失函数在局部最小解附近常常是一个平坦的区域,称为平坦最小值(Flat Minima):
在一个平坦最小值的邻域内,所有点对应的损失都比较接近,说明在训练时,无需准确查找局部最小解,只需在一个局部最小解的邻域内就行。平坦最小值常被认为和模型泛化能力有关。
模型收敛到平坦的局部最小值时,鲁棒性好,微小参数变化对模型能力影响不大;模型收敛到尖锐的局部最小值时,鲁棒性差,微小参数变化对模型能力影响大。
模型应该具备良好的泛化能力,即鲁棒性好,因此理想的局部最小值应该是平坦的。
局部最小解的等价性 在非常大的神经网络中,大部分的局部最小解等价,在测试集上性能都比较相似。此外,局部最小解对应的损失都可能非常接近于全局最小解对应的损失。神经网络有一定概率收敛到较差的局部最小值,但当网络规模增加时,这种概率会大大降低。在训练网络时,没必要找全局最小值,反而容易过拟合。
深度神经网络的参数学习主要是通过梯度下降来寻找一组可以最小化结风险的参数。梯度下降可分为:批量梯度下降、随机梯度下降、小批量梯度下降。根据不同的数据量、参数量可以选择一种方式。除在收敛效果和效率上的差异,三种方式存在公同问题:
- 如何改进优化算法
- 如何初始化参数
- 如何预处理数据
2. 优化算法
2.1 小批量梯度下降
训练时,训练数据通常很大,若在梯度下降时,每次迭代都要计算整个训练数据上的梯度,计算资源消耗大;同时,大规模训练集的数据冗余严重,没必要在整个训练集上计算梯度。所以常用小批量梯度下降法(Mini-Batch Gradient Descent)。
令 f ( x ; θ ) f(\pmb{x}; \theta) f(xxx;θ) 表示一个深度神经网络, θ \theta θ为网络参数,使用小批量梯度下降时,每次选 K K K个训练样本 S t = { ( x ( k ) , y ( k ) ) } k = 1 K S_t = \{(\pmb{x}^{(k)}, \pmb{y}^{(k)})\}_{k=1}^K St={
(xxx(k),yyy(k))}k=1K 。第 t 次迭代(Iteration)时损失函数关于参数 θ \theta θ 的偏导数为:
其中 K 为批量大小 (Batch Size)。
第 t 次更新的梯度 g t g_t gt 定义为:
使用梯度下降来更新参数,其中 α > 0 \alpha >0 α>0 为学习率:
每次迭代时,参数更新的差值 Δ θ t \Delta\theta_t Δθt 定义为:
Δ θ t \Delta\theta_t Δθt 和梯度 g t \pmb{g}_t gggt 并不需要完全一致。 Δ θ 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。
从上可看出,影响小批量梯度下降法的主要因素有:
- 批量大小K
- 学习率 α \alpha α
- 梯度估计
为了更有效地训练深度神经网络,在标准的小批量梯度下降法的基础上,也经常用一些方法加快优化速度,这些方法也可以用于随机梯度下降法:
- 如何选择批量大小
- 如何调整学习率
- 如何修正梯度估计
2.2 批量大小选择
在小批量梯度下降法中,批量大小对网络优化的影响也非常大。一般而言,批量大小不影响随机梯度的期望,但会影响随机梯度的方差:
- 批量大小越大,随机梯度的方差越小,引入的噪声越小,训练越稳定,因此可设置较大的学习率。
- 批量大小越小,随机梯度的方差越大,引入的噪声越大,训练越不稳定,因此要设置较小的学习率,否则模型不收敛。
学习率通常要随着批量大小的增大而相应的增大,一个简单有效的方法是线性缩放规则:当批量大小增加m倍时,学习率也增加m倍。线性缩放规则往往在批量大小比较小时合适,当批量大小非常大时,线性缩放会使得训练不稳定。
下图是从 Epoch(回合)和Iteration(单次更新)的角度,批量大小对损失下降的影响。每一次小批量更新为一次Iteration,所有训练集的样本更新一遍,为一次Epoch,两者的关系为:1个Epoch等于 ( 训 练 样 本 的 数 量 N 批 量 大 小 K ) (\frac{训练样本的数量N}{批量大小K}) (批量大小K训练样本的数量N)次Iterations。
从图a可发现,批量大小越大,下降效果越明显,并且下降曲线约平滑。
但从图b可发现,按整个数据集上的回合数(Epoch)来看,则是批量样本数越小,适当小的批量大小会导致更快的收敛。
此外,批量大小和模型泛化能力也有一定的关系:批量大小越大,越有可能收敛到陡峭最小值;批量大小越小,越有可能收敛到平坦最小值。
2.3 学习率调整
学习率过大不会收敛,过小则收敛速度太慢,常用学习率调整方法有:学习率衰减、学习率预热、周期性学习率调整;以及一些自适应调整学习率的方法:AdaGrad、RMSprop、AdaDelta等。自适应学习率方法可以针对每个参数设置不同的学习率。
2.3.1 学习率衰减
经验上看,学习率一开始就要保持较大的值来保证收敛速度,在收敛到最优点附近时,要小一点避免来回震荡。一简单的学习率调整可以通过学习率衰减方式来实现,又称学习率退火
将衰减方式设置为按迭代次数进行衰减。学习率衰减是按每次迭代(Iteration)进行,假设初始化学习率为 α 0 \alpha_0 α0,在第 t t t 次迭代时的学习率 α t \alpha_t αt . 常见的衰减方法有:
分段常数衰减:又称为阶段衰减,经过 T 1 , T 2 , ⋯ , T m T_1,T_2, \cdots,T_m T1,T2,⋯,Tm 次迭代将学习率衰减为原来的 β 1 , β 2 , ⋯ , β m \beta_1,\beta_2,\cdots, \beta_m β1,β2,⋯,βm 倍,其中 T m T_m Tm 和 β m < 1 \beta_m < 1 βm<1 是根据经验设置的超参数。
逆时衰减: β \beta β为衰减率:
指数衰减: β < 1 \beta <1 β<1 为衰减率:
自然指数衰减: β \beta β为衰减率
余弦衰减:T 为总的迭代次数
不同衰减方法的实例,假设初始学习率为1:
2.3.2 学习率预热
在小批量梯度下降法中,当批量大小的设置比较大时,通常需要比较大的学习率. 但在刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,再加上比较大的初始学习率,会使得训练不稳定。
为提训练稳定性,在最初的几轮迭代时,采用比较小的学习率,当梯度下降到一定程度后,再恢复到初始的学习率,称为学习率预热
一个常用预热方法是逐渐预热,假设预热的迭代次数为 T ′ T^{'} T′,初始学习率为 α 0 \alpha_0 α0,在与预热过程中,每次更新的学习率为:
预热结束后,再选择一种学习率衰减方法来减低学习率。
2.3.3 周期性学习率调整
为使得梯度下降法能够逃离鞍点或尖锐最小值,一种经验是在训练周期中,周期性地增大学习率,当参数在尖锐最小值附近时,增大学习率有助于逃离尖锐最小值;当参数在平坦最小值附近时,增大学习率依然有可能在该平坦最小值的吸引域内。因此,周期性地增大学习率虽然可能在短期损害优化过程,使网络收敛稳定性变差,但长期看,有助于找到更好的局部最优解。
循环学习率 :让学习率在一个区间内周期性地增大和缩小。通常可以使用线性缩放来调整学习率,称为三角循环学习率。假设每个循环周期的长度相等都为 2 Δ T 2\Delta T 2ΔT,前 Δ T \Delta T ΔT步为学习率线性增大阶段,后 Δ T \Delta T ΔT步为学习率线性缩小阶段。在第 t 次迭代时,所在的循环周期数 m 为:
第 t 次迭代的学习率为:
其中 α m a x m \alpha_{max}^{m} αmaxm 和 α m i n m \alpha_{min}^{m} αminm 为第m个周期中学习率的上界和下界,可以随着 m 的增大逐渐减低; b ∈ [ 0 , 1 ] b\in [0,1] b∈[0,1] 的计算为:
带热重启的随机梯度下降:学习率每间隔一定周期后重新初始化为某个预先设定的值,然后逐渐衰减,每次重启后模型参数不是从头开始优化,而是从重启前的参数基础上继续优化。
假设在梯度下降过程中重启M次,第m次重启在上次重启开始第 T m T_m Tm 个回合后进行, T m T_m Tm 称为重启周期。在第 m 次重启之前,采用余弦衰减来降低学习率。第 t 次迭代的学习率为:
其中 α m a x m \alpha_{max}^{m} αmaxm 和 α m i n m \alpha_{min}^{m} αminm 为第m个周期中学习率的上界和下界,可以随着 m 的增大逐渐减低; T c u r T_{cur} Tcur 为从上次重启之后的回合(Epoch)数。 T c u r T_{cur} Tcur 可以取小数,如0.1、0.2等,这样可以在一个回合内部进行学习率衰减,重启周期 T m T_m Tm 可以随着重启次数逐渐增加,比如 T m = T m − 1 × χ T_m = T_{m-1} \times \chi Tm=Tm−1×χ。其中 1 ≤ χ 1 \leq \chi 1≤χ 为放大因子。
两种周期性学习率调整的示例如下,初始学习率设为1,每个周期中学习率上界 逐步衰减。
2.3.4 AdaGrad算法
在标准的梯度下降中,每个参数每次迭代时都使用相同的学习率。由于每个参数的维度上收敛速度都不同,因此根据不同参数的收敛情况分别设置学习率。
AdaGrad(Adaptive Gradient)算法借鉴 l 2 l_2 l2 正则化的思想,每次迭代时自适应地调整每个参数的学习率。在第 t 次迭代时,先计算每个参数梯度平方的累计值,其中 ⨀ \bigodot ⨀ 为按元累乘积, g τ ∈ R ∣ θ ∣ \pmb{g}_\tau \in \mathbb{R}^{|\theta|} gggτ∈R∣θ∣ 是第 τ \tau τ 次迭代时的梯度:
AdaGrad算法的参数更新差值如下,其中 α \alpha α 是出事的学习率, ε \varepsilon ε 是为了保持数值稳定性而设置的很小的常数,一般取 e − 7 e^{-7} e−7到 e − 10 e^{-10} e−10,开方、除、加都是按元素进行的:
AdaGrad算法中,若某个参数的偏导数累乘积比较大,其学习率相对较小;相反,如果其偏导数累乘积较小,其学习率相对较大。但整体随着迭代次数的增加,学习率逐渐缩小。
AdaGrad算法在经过一定的迭代次数后,若没有找到最优点,由于学习率已经很小,很难再找到最优点。
2.3.5 RMSprop算法
RMSprop算法是Hinton提出的自适应学习率算法,可在有些情况下避免AdaGrad算法中学习率不断单调下降从而过早衰减的缺点。
RMSprop算法首先计算每次迭代梯度 g t \pmb{g}_t gggt 平方的指数衰减移动平均,其中 β \beta β 是衰减率,一般取值为0.9:
RMSprop算法的参数更新差值如下,其中 α \alpha α 是初始的学习率,比如0.0001:
RMSProp 算法和AdaGrad 算法的区别在于 G t G_t Gt 的计算由累积方式变成了指数衰减移动平均. 在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大.
2.3.6 AdaDelta算法
AdaDelta算法是AdaGrad算法的改进,类似RMSProp 算法,AdaDelta算法通过梯度平方的指数衰减移动平均来调整学习率。此外,AdaDelta算法还引入了每次参数更新差值 Δ θ \Delta \theta Δθ 的平方的指数衰减权移动平均。
AdaDelta算法在第 t 次迭代时,参数更新差值 Δ θ \Delta \theta Δθ 的平方的指数衰减权移动平均如下,其中 β 1 \beta_1 β1 为衰减率,此时 Δ θ t \Delta \theta_t Δθt 未知,因此只能计算到 Δ X t − 1 \Delta X_{t-1} ΔXt−1:
AdaDelta算法的参数更新差值如下,其中 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,在一定程度上平抑了学习率的波动。
2.4 梯度估计修正
在(小批量)随机梯度下降中,若选取样本数量较小,损失会呈现震荡的方式,即随机梯度下降中,每次迭代的梯度估计和整个训练集上的最优梯度并不一致,具有一定的随机性。一种有效地缓解梯度估计随机性的方式是通过使用最近时间内的平均梯度来代替当前时刻的随机梯度来作为参数更新的方向,从而提高优化速度。
2.4.1 动量法
动量(Momentum)是模拟物理中的概念。一个物体的动量指这个物体在它运动方向上保持运动的趋势,是物体的质量和速度的乘积。动量法用之前累积动量来代替真正的梯度,每次迭代的梯度可以看做加速度。
在第 t 次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向,其中 ρ \rho ρ为动量因子,常设为0.9, α \alpha α 为学习率:
参数的实际更新差值取决于最近一段时间内梯度的加权平均。当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小,起到减速作用;当该某个参数在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。
一般在迭代初期,梯度方向都比较一致,动量法会起加速作用,可以更快地到达最优点。在后期,梯度方向会不一致,在收敛值附近振荡,动量法会起到减速作用,增加稳定性。从某种角度来说,当前梯度叠加上部分的上次梯度,一定程度上可以近似看作二阶梯度。
2.4.2 Nesterov 加速梯度
Nesterov加速梯度NAG,又叫Nesterov动量法,是对动量法的改进。
动量法中,实际的参数更新方向为 Δ θ t \Delta \theta_t Δθt 为上一步的参数更新方向 Δ θ t − 1 \Delta \theta_{t-1} Δθt−1 和当前梯度的反方向 − g t -\pmb{g}_t −gggt 的叠加。故, Δ θ t \Delta \theta_t Δθ