经验技巧,可从优化和正则化两个方面来提高学习效率并得到一个好的模型。
深度神经网络,是高度非线性模型,风险函数是非凸函数,风险最小化是非凸优化问题,会存在许多局部最优点。
神经网络种类多样性,卷积网络,循环网络,图网络等,其各自结构也不同。深度不同,宽窄不同。不同参数在网络中的作用差异很大:连接权重、偏置、RNN中循环连接上的权重。
神经网络结构多样性,难找到通用的优化方法。
神经网络超参数多,给优化带来巨大挑战。
低维空间非凸优化问题,主要是存在一些局部最优点,基于梯度下降的优化方法,会陷入局部最优;故难点是如何选择初始化参数和逃离局部最优点。
高维空间非凸优化问题,如深度神经网络的参数学习问题,其难点是如何逃离鞍点(Saddle Point)。
鞍点 鞍点的梯度为0,但他在一些维度上是最高点,一些维度上是最低点。如图:
高维空间中,局部最优要求每一维都是最低点,这种概率很低。假设网络有10000维参数,某一维梯度为 0 的点时局部最低点概率为 p ,整个参数空间中,梯度为0的点是局部最优点的概率为 p 10000 p^{10000} p10000,这种概率非常低,即高维空间中,梯度为0的点大部分都是鞍点。基于梯度下降的优化方法会难以逃离鞍点。故随机梯度下降对高维空间的非凸优化问题十分重要,因在梯度方向上引入了随机性,可有效逃离鞍点。
平坦最小值 深度神经网络参数很多,有冗余性,使得单个参数对最终的损失影响都小,从而使损失函数在局部最小解附近常常是一个平坦的区域,称为平坦最小值(Flat Minima):
在一个平坦最小值的邻域内,所有点对应的损失都比较接近,说明在训练时,无需准确查找局部最小解,只需在一个局部最小解的邻域内就行。平坦最小值常被认为和模型泛化能力有关。
模型收敛到平坦的局部最小值时,鲁棒性好,微小参数变化对模型能力影响不大;模型收敛到尖锐的局部最小值时,鲁棒性差,微小参数变化对模型能力影响大。
模型应该具备良好的泛化能力,即鲁棒性好,因此理想的局部最小值应该是平坦的。
局部最小解的等价性 在非常大的神经网络中,大部分的局部最小解等价,在测试集上性能都比较相似。此外,局部最小解对应的损失都可能非常接近于全局最小解对应的损失。神经网络有一定概率收敛到较差的局部最小值,但当网络规模增加时,这种概率会大大降低。在训练网络时,没必要找全局最小值,反而容易过拟合。
深度神经网络的参数学习主要是通过梯度下降来寻找一组可以最小化结风险的参数。梯度下降可分为:批量梯度下降、随机梯度下降、小批量梯度下降。根据不同的数据量、参数量可以选择一种方式。除在收敛效果和效率上的差异,三种方式存在公同问题:
训练时,训练数据通常很大,若在梯度下降时,每次迭代都要计算整个训练数据上的梯度,计算资源消耗大;同时,大规模训练集的数据冗余严重,没必要在整个训练集上计算梯度。所以常用小批量梯度下降法(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。
从上可看出,影响小批量梯度下降法的主要因素有:
为了更有效地训练深度神经网络,在标准的小批量梯度下降法的基础上,也经常用一些方法加快优化速度,这些方法也可以用于随机梯度下降法:
在小批量梯度下降法中,批量大小对网络优化的影响也非常大。一般而言,批量大小不影响随机梯度的期望,但会影响随机梯度的方差:
学习率通常要随着批量大小的增大而相应的增大,一个简单有效的方法是线性缩放规则:当批量大小增加m倍时,学习率也增加m倍。线性缩放规则往往在批量大小比较小时合适,当批量大小非常大时,线性缩放会使得训练不稳定。
下图是从 Epoch(回合)和Iteration(单次更新)的角度,批量大小对损失下降的影响。每一次小批量更新为一次Iteration,所有训练集的样本更新一遍,为一次Epoch,两者的关系为:1个Epoch等于 ( 训 练 样 本 的 数 量 N 批 量 大 小 K ) (\frac{训练样本的数量N}{批量大小K}) (批量大小K训练样本的数量N)次Iterations。
从图a可发现,批量大小越大,下降效果越明显,并且下降曲线约平滑。
但从图b可发现,按整个数据集上的回合数(Epoch)来看,则是批量样本数越小,适当小的批量大小会导致更快的收敛。
此外,批量大小和模型泛化能力也有一定的关系:批量大小越大,越有可能收敛到陡峭最小值;批量大小越小,越有可能收敛到平坦最小值。
学习率过大不会收敛,过小则收敛速度太慢,常用学习率调整方法有:学习率衰减、学习率预热、周期性学习率调整;以及一些自适应调整学习率的方法:AdaGrad、RMSprop、AdaDelta等。自适应学习率方法可以针对每个参数设置不同的学习率。
经验上看,学习率一开始就要保持较大的值来保证收敛速度,在收敛到最优点附近时,要小一点避免来回震荡。一简单的学习率调整可以通过学习率衰减方式来实现,又称学习率退火
将衰减方式设置为按迭代次数进行衰减。学习率衰减是按每次迭代(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:
在小批量梯度下降法中,当批量大小的设置比较大时,通常需要比较大的学习率. 但在刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,再加上比较大的初始学习率,会使得训练不稳定。
为提训练稳定性,在最初的几轮迭代时,采用比较小的学习率,当梯度下降到一定程度后,再恢复到初始的学习率,称为学习率预热
一个常用预热方法是逐渐预热,假设预热的迭代次数为 T ′ T^{'} T′,初始学习率为 α 0 \alpha_0 α0,在与预热过程中,每次更新的学习率为:
预热结束后,再选择一种学习率衰减方法来减低学习率。
为使得梯度下降法能够逃离鞍点或尖锐最小值,一种经验是在训练周期中,周期性地增大学习率,当参数在尖锐最小值附近时,增大学习率有助于逃离尖锐最小值;当参数在平坦最小值附近时,增大学习率依然有可能在该平坦最小值的吸引域内。因此,周期性地增大学习率虽然可能在短期损害优化过程,使网络收敛稳定性变差,但长期看,有助于找到更好的局部最优解。
循环学习率 :让学习率在一个区间内周期性地增大和缩小。通常可以使用线性缩放来调整学习率,称为三角循环学习率。假设每个循环周期的长度相等都为 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,每个周期中学习率上界 逐步衰减。
在标准的梯度下降中,每个参数每次迭代时都使用相同的学习率。由于每个参数的维度上收敛速度都不同,因此根据不同参数的收敛情况分别设置学习率。
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算法在经过一定的迭代次数后,若没有找到最优点,由于学习率已经很小,很难再找到最优点。
RMSprop算法是Hinton提出的自适应学习率算法,可在有些情况下避免AdaGrad算法中学习率不断单调下降从而过早衰减的缺点。
RMSprop算法首先计算每次迭代梯度 g t \pmb{g}_t gggt 平方的指数衰减移动平均,其中 β \beta β 是衰减率,一般取值为0.9:
RMSprop算法的参数更新差值如下,其中 α \alpha α 是初始的学习率,比如0.0001:
RMSProp 算法和AdaGrad 算法的区别在于 G t G_t Gt 的计算由累积方式变成了指数衰减移动平均. 在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大.
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,在一定程度上平抑了学习率的波动。
在(小批量)随机梯度下降中,若选取样本数量较小,损失会呈现震荡的方式,即随机梯度下降中,每次迭代的梯度估计和整个训练集上的最优梯度并不一致,具有一定的随机性。一种有效地缓解梯度估计随机性的方式是通过使用最近时间内的平均梯度来代替当前时刻的随机梯度来作为参数更新的方向,从而提高优化速度。
动量(Momentum)是模拟物理中的概念。一个物体的动量指这个物体在它运动方向上保持运动的趋势,是物体的质量和速度的乘积。动量法用之前累积动量来代替真正的梯度,每次迭代的梯度可以看做加速度。
在第 t 次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向,其中 ρ \rho ρ为动量因子,常设为0.9, α \alpha α 为学习率:
参数的实际更新差值取决于最近一段时间内梯度的加权平均。当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小,起到减速作用;当该某个参数在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。
一般在迭代初期,梯度方向都比较一致,动量法会起加速作用,可以更快地到达最优点。在后期,梯度方向会不一致,在收敛值附近振荡,动量法会起到减速作用,增加稳定性。从某种角度来说,当前梯度叠加上部分的上次梯度,一定程度上可以近似看作二阶梯度。
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 Δθt 可以被拆分为两步进行,先根据 Δ θ t − 1 \Delta \theta_{t-1} Δθt−1 更新一次得到参数 θ ^ \hat{\theta} θ^,再用 − g t -\pmb{g}_t −gggt 更新:
其中 g t \pmb{g}_t gggt 为点 θ t − 1 \theta_{t-1} θt−1 上的梯度,因此在第二步更新中有些不太合理。更合理的更新方向应为 θ ^ \hat{\theta} θ^ 上的梯度。
合并后的更新方向为:
其中 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上的偏导数。
动量法和Nesterov 加速梯度在参数更新时的比较:
自适应动量估计(Adaptive Moment Estimation,Adam)算法可以看做动量法和RMSprop 算法的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。
Adam算法计算梯度平方 g t 2 g_t^2 gt2 的指数加权平均(类似RMSprop算法),同时计算梯度 g t g_t gt 的指数加权平均(类似动量法):
其中 β 1 \beta_1 β1 和 β 2 \beta_2 β2 分别为两个移动平均的衰减率,通常取值为 β 1 = 0.9 \beta_1 = 0.9 β1=0.9 、 β 2 = 0.99 \beta_2 = 0.99 β2=0.99。
M t \pmb{M}_t MMMt 可以看做梯度的均值(一阶矩), G t \pmb{G}_t GGGt 可以看做梯度的未减去均值的方差(二阶矩)。假设 M 0 = 0 M_0 = 0 M0=0, G 0 = 0 G_0 = 0 G0=0 ,那么迭代初期, M t \pmb{M}_t MMMt 和 G t \pmb{G}_t GGGt 的值会比真实的均值和方差要小,特别当 β 1 \beta_1 β1 和 β 2 \beta_2 β2 都接近1时,偏差很大。需对偏差进行修正:
Adam算法的参数更新差值如下,其中通常学习率 α = 0.001 \alpha = 0.001 α=0.001,并且也可以衰减,比如 α t = α 0 / t \alpha_t = \alpha_0/\sqrt{t} αt=α0/t:
Adam 算法是RMSProp 算法与动量法的结合,因此一种自然的Adam 算法的改进方法是引入Nesterov 加速梯度,称为Nadam 算法。
梯度爆炸,当梯度突然增大时,用大的梯度更新参数反而会导致其远离最优点,可采用梯度截断解决:当梯度的模大于一定阈值时,就对梯队进行截断。梯度截断是简单的启发式方法,把梯度的模限定在一个区间,当梯度的模小于或大于这个区间时就截断,常见的几种方式如下:
按值截断 在第 t 次迭代时,梯度为 g t \pmb{g}_t gggt,给定一个区间 [ a , b ] [a,b] [a,b],若一个参数的梯度小于a,设为a,大于b,则设为b:
按模截断 将梯度的模截断到一个给定的截断阈值 b 。如果 ∣ ∣ g t ∣ ∣ 2 ≤ b ||\pmb{g}_t||^{2} \leq b ∣∣gggt∣∣2≤b,则保持 g t \pmb{g}_t gggt不变,相反则:
截断阈值b是一个超参数,可根据一段时间内的平均梯度来自动调整。实验中发现,训练过程对b不太敏感,故一个小的b就可得到很好的结果。
本章主要介绍两大类优化方法:一是调整学习率,使优化更稳定;二是梯度估计修正,优化训练速度。
这些优化算法可用下面公式同一描述概括:
其中 g t \pmb{g}_t gggt是第 t 步的梯度; α t \alpha_t αt是第 t 步的学习率,可以进行衰减,也可以不变;(⋅) 是学习率缩放函数,可以取1 或历史梯度的模的移动平均;(⋅) 是优化后的参数更新方向,可以取当前的梯度 g t \pmb{g}_t gggt或历史梯度的移动平均。
几种优化方法在MNIST 数据集上收敛性的比较(学习率为0.001,批量大小为128)。
当使用梯度下降法来进行优化网络参数时,参数初始值的选取十分关键,关系到网络的优化效率和泛化能力。常见有三种方式:
预训练初始化,收敛性、泛化性好,但灵活性差,故随机初始化仍然重要,介绍三种:基于固定方差的参数初始化、基于方差缩放的参数初始化、正交初始化
从一个固定均值(常为0)和固定方差( σ 2 \sigma_2 σ2)的分布中采样生成参数的初始值,主要有两种:
这种方法中,关键是设置方差 σ 2 \sigma^2 σ2 ,若参数范围过小,一会导致神经元输出过小,经过多层后信号消失,二会使得Sigmoid函数丢失非线性能力(Sigmoid型函数在0附近近似线性)。若参数范围过大,输入状态过大,对于Sigmoid型函数,激活值饱和,梯度接近于0,从而导致梯度消失。
为降低固定方差对网络性能以及优化效率的影响,这种方法常需要配合逐层归一化使用。
给参数选取合适的随机初始化区间非常重要,一般而言,参数初始化的区间应该根据神经元的性质进行差异化的设置。如果一个神经元的输入连接多,它的每个输入连接上的权重应该小一点,避免神经元的输出过大(激活函数为ReLU)或过饱和(激活函数为Sigmoid)
为缓解梯度消失或梯度爆炸,尽可能保持每个神经元的输入和输出的方差一致,根据神经元的连接数量进行自适应调整初始化分布的方差,成为方差缩放(Variance Scaling)。
假设第 l l l 层的一个神经元 a ( l ) a^{(l)} a(l) ,其接收前一层的 M l − 1 M_{l-1} Ml−1个神经元的输出 a i ( l − 1 ) a^{(l-1)}_{i} ai(l−1) , 1 ≤ i ≤ M l − 1 1 \leq i \leq M_{l-1} 1≤i≤Ml−1:
其中,为简单起见,将激活函数设为恒等函数 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) 的均值为:
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)) 倍,为了使得在经过多层网络后,信号不被过分放大或减弱,尽可能保持每个神经元的输入和输出方差一致, M l − 1 v a r ( w i ( l ) ) = 1 M_{l-1} var(w_i^{(l)}) = 1 Ml−1var(wi(l))=1 合适,即:
同理,为使在反向传播中,误差信号也不被放大或缩小,需要将 w i ( l ) w_i^{(l)} wi(l)的方差保持为:
作为折中,考虑信号在前向和反向传播过程中不被放大或缩小,可以设置:
计算出参数的理想方差后,可以通过高斯分布,或均匀分布,来随机初始化参数。若采用高斯分布,则连接权重按 N ( 0 , 2 M l − 1 + M l ) N(0,\frac{2}{M_{l-1}+M_{l}}) N(0,Ml−1+Ml2) 的高斯分布进行初始化。若过采用区间为 [ − r , r ] [-r,r] [−r,r] 的均匀分布来初始化 w i ( l ) w_i^{(l)} wi(l) 时,则 r 的取值为 6 M l − 1 + M l \sqrt{\frac{6}{M_{l-1}+M_{l}}} Ml−1+Ml6。这种根据每层的神经元数量自动计算初始化参数方差的方法称为 Xavier初始化。
一开始我们假设激活函数为恒等函数 f ( x ) = x f(x) = x f(x)=x,但是Xavier初始化也适用于 Logistic函数和Tanh函数,因为神经元的参数和输入的绝对值通常比较小,处于激活函数的线性区间, Logistic函数和Tanh函数近似于线性函数。由于Logistic函数在线性区间的斜率约为0.25,因此其参数初始化的方差约为 16 × 2 M l − 1 + M l 16 \times \frac{2}{M_{l-1}+M_{l}} 16×Ml−1+Ml2。
当 l l l 层神经元使用ReLU激活函数时,常有一半的神经元输出为0,因此其分布的方差近似为使用恒等函数的一半,这样,只考虑前向传播,参数 w i ( l ) w_i^{(l)} wi(l)的理想方差为:
其中 M l − 1 M_{l-1} Ml−1 是第一个 l − 1 l-1 l−1 层神经元个数。
故当使用 ReLU函数时,如采用高斯分布来初始化时,方差为 2 M l − 1 \frac{2}{M_{l-1}} Ml−12;若采用区间为 [ − r , r ] [-r,r] [−r,r] 的均匀分布来初始化参数,则 r = 6 M l − 1 + M l r = \sqrt{\frac{6}{M_{l-1}+M_{l}}} r=Ml−1+Ml6,这种方法是 He初始化。
Xavier初始化和He初始化都是对权重矩阵中的每个参数进行独立采样,基于采样随机性,采样出的权重矩阵仍可能存在梯度消失和梯度爆炸
假设一个L层的等宽线性网络(激活函数为恒等函数)为:
W ( l ) ∈ R M × M \pmb{W}^{(l)} \in \mathbb{R}^{M \times M} WWW(l)∈RM×M 为第 l l l 层的权重。在反向传播中,误差项 δ \delta δ 的反向传播公式为 : δ ( l − 1 ) = ( W ( l ) ) T δ ( l ) \delta^{(l-1)} = (\pmb{W}^{(l)})^T\delta^{(l)} δ(l−1)=(WWW(l))Tδ(l)。为了避免梯度消失和梯度爆炸,希望误差项咋反向传播中,具有范数保持性(Norm-Preserving)。即:
∣ ∣ δ ( l − 1 ) ∣ ∣ 2 = ∣ ∣ δ ( l ) ∣ ∣ 2 = ∣ ∣ ( W ( l ) ) T δ ( l ) ∣ ∣ 2 ||\delta^{(l-1)}||^2 = ||\delta^{(l)}||^2 = ||(\pmb{W}^{(l)})^T\delta^{(l)}||^2 ∣∣δ(l−1)∣∣2=∣∣δ(l)∣∣2=∣∣(WWW(l))Tδ(l)∣∣2
若以均值为0、方差为 1 M \frac{1}{M} M1 的高斯分布来随机生成权重矩阵中每个元素的初始值,那么当M趋于无穷时,范数保持性成立,当M不足够大时,不能保持范数保持性。
故,一种直接的方式是将 W ( l ) \pmb{W}^{(l)} WWW(l) 初始化为正交矩阵,即 W ( l ) ( W ( l ) ) T = I \pmb{W}^{(l)}(\pmb{W}^{(l)})^T = I WWW(l)(WWW(l))T=I ,这种方法称为正交初始化,正交初始化的具体实现过程可以分为两步:
根据正交矩阵的性质,这个线性网络在信息的前向传播和反向传播中,都具有范数保持性,从而可以避免在训练时就出现梯度消失和梯度爆炸
在非线性神经网络中使用正交化初始时,通常需要将正交矩阵乘以一个缩放系数 ρ \rho ρ。当激活函数为ReLU时,激活函数在0附近的平均梯度可以近似为0.5,为了保持范数不变,缩放系数 ρ \rho ρ 可以设置为 2 \sqrt{2} 2。
样本的原始特征中的每一维数据,由于来源和度量单位不同,特征取值的分布范围往往差异很大,当计算欧式距离时,取值范围大的特征会起主导作用。故对于基于相似度比较的机器学习方法如KNN,必须先对样本进行预处理,将每个维度的特征归一化到同一个取值区间,并消除特征之间的相关性。虽然神经网络可以通过调整参数适应不同特征的取值范围,但只会导致训练效率低。
一个一层的网络 y = t a n h ( w 1 x 1 + w 2 x 2 + b ) y=tanh(w_1x_1 + w_2x_2 + b) y=tanh(w1x1+w2x2+b),其中 x 1 ∈ [ 0 , 1 ] , x 2 ∈ [ 0 , 10 ] x_1 \in [0,1],x_2 \in [0,10] x1∈[0,1],x2∈[0,10]。tanh函数在 [ − 2 , 2 ] [-2,2] [−2,2] 上敏感,其余地方趋近于0,在训练时,应该将 w 1 w_1 w1 设置得小一些,数据维数多时,很难筛选参数,故应将每个特征的取值处理到相似的区间。
此外,不同特征的取值范围差异大时,梯度下降效率也会受到影响。图 a 中,取值范围不同造成大多数位置上的梯度并不是最优的搜索方向,梯度下降需要多次迭代。图 b 中,数据归一化为相同取值范围,大部分位置梯度近似于最优搜索方向,梯度下降只需较少的迭代次数:
SIgmoid函数也可将不同取值范围的特征挤压到一个受限的区间,以下是几中在神经网络中常用的归一化方法:
缩放归一化 这是一种简单的归一化方法,将每一个特征的取值范围缩放到 [ 0 , 1 ] [0,1] [0,1] 或 [ − 1 , 1 ] [-1,1] [−1,1] 之间,假设有N个样本 { x ( n ) } n = 1 N \{\pmb{x}^{(n)}\}_{n=1}^{N} { xxx(n)}n=1N,对于每一维特征x:
其中 min(x) 和 max(x) 是特征x在所有样本上的最值。
标准归一化 也叫z-score归一化,来源于统计上的标准分数。将每一维特征都调整为均值为0,方差为1,假设有N个样本 { x ( n ) } n = 1 N \{\pmb{x}^{(n)}\}_{n=1}^{N} { xxx(n)}n=1N,对于每一维特征x,计算均值和方差:
然后特征减去均值,除以标准差:
这里 σ \sigma σ 不能为0,如果方差为 0,说明这一维特征没有任务区分性,可以直接删除。
白化(Whitening)是一种重要的预处理方法,用来降低输入特征之间的冗余性,经白化处理,特征之间的相关性较低,所有特征具有相同的方差。白化的一个主要实现方式是使用主成分分析(Principal Component Analysis,PCA)方法去除掉各个成分之间的相关性。
在深度神经网络中,某神经层之前的神经层的参数变化,会导致该神经层输入分布发生较大的差异。在使用随机梯度下降训练时。每次参数更新都会导致网络中间每一层的输入的分布发生改变,越深的层,其输入分布改变越明显。
从机器学习角度看,某个神经层的输入分布发生改变,其参数就要重新学习,这叫内部协变量偏移(Internal Covariate Shift)。
为解决内部协变量偏移问题,就要使得每一个神经层的输入的分布在训练过程中保持一致。一种方法是对每一神经层都进行归一化操作,使得分布保持稳定。常见逐层归一化方法如下。
批量归一化(Batch Normalization,BN)方法可对网络中的任意中间层进行归一化操作。对一个深度网络:
为减少内部协变量偏移问题,要使得净输入 z ( l ) \pmb{z}^{(l)} zzz(l) 的分布一致,比如都归一化到标准正太分布。虽然归一化操作可用在输入 a ( l − 1 ) \pmb{a}^{(l-1)} aaa(l−1) 上,但其分布性质不如 z ( l ) \pmb{z}^{(l)} zzz(l) 稳定,故归一化操作常用在仿射变换之后,激活函数之前。
利用4节中介绍的数据预处理方法对 z ( l ) \pmb{z}^{(l)} zzz(l) 进行归一化,相当于每一层都进行一次数据预处理,从而加速收敛速度。但是逐层归一化学要在中间层操作,要求效率高,故复杂度较高的白化方法不太适用。为提高归一化效率,常用标准归一化,将净输入每一维都归一到标准正态分布:
其中 E [ z ( l ) ] \mathbb{E}[\pmb{z}^{(l)}] E[zzz(l)] 和 v a r ( z ( l ) ) var(\pmb{z}^{(l)}) var(zzz(l)) 是指当前参数下, z ( l ) \pmb{z}^{(l)} zzz(l) 的每一维在整个训练集上的期望和方差,目前训练方法都是基于小批量的随机梯度下降,故 z ( l ) \pmb{z}^{(l)} zzz(l) 的期望和方差常用当前小批量样本集的均值和方差近似估计。
给定一个包含 K 个样本的小批量样本集合,第 l 层神经元的净输入 z ( 1 , l ) , ⋯ , z ( K , l ) \pmb{z}^{(1,l)},\cdots,\pmb{z}^{(K,l)} zzz(1,l),⋯,zzz(K,l) 的均值和方差为:
对净输入 z ( l ) \pmb{z}^{(l)} zzz(l) 的标准归一化会使得其取值集中到0附近,如果使用了sigmoid性激活函数时,这个取值区间刚好是接近线性变换的区间,减弱了神经网络的非线性性质。故,可通过一个附加的缩放和平移变换改变取值区间:
其中 γ \gamma γ 和 β \beta β 分别代表缩放和平移的参数向量。从最保守的角度考虑,可以通过标准归一化的逆变换来使的归一化后的变量可以被还原成原来的值。当 γ = σ B 2 \gamma = \sqrt{\sigma_B^2} γ=σB2, β = μ B \beta = \mu_B β=μB时, z ^ ( l ) = z ( l ) \hat{z}^{(l)} = z^{(l)} z^(l)=z(l)。
批量归一化操作可以看做一个加在每一层非线性激活函数之前的特殊的神经层,批量归一化本身具有平移变换,所以仿射变换 W a ( l − 1 ) \pmb{Wa}^{(l-1)} WaWaWa(l−1) 不再需要偏置参数:
每小批量样本的 均值 μ B \mu_B μB 和方差 σ B 2 \sigma_B^2 σB2是净输入 z ( l ) \pmb{z}^{(l)} zzz(l) 的函数,而不是常量,故计算参数梯度时,要考虑 μ B \mu_B μB 和 σ B 2 \sigma_B^2 σB2 的影响。当训练完成时,用这个数据集上的均值 μ B \mu_B μB 和方差 σ B 2 \sigma_B^2 σB2 来代替小样本的均值 μ B \mu_B μB 和方差 σ B 2 \sigma_B^2 σB2。在实践中,均值 μ B \mu_B μB 和方差 σ B 2 \sigma_B^2 σB2可以用移动平均来计算。
批量归一化是对一个中间层的单个神经元进行归一化操作,要求小批量样本数量不能太少,否则难以计算单个神经元的统计信息。此外,如果一个神经元的净输入的分布在神经网络中动态变化,如RNN,则无法应用批量归一化操作。
层归一化 和批量归一化很类似。不同的是,层归一化是对一个中间层的所有神经元进行归一化。对于一个神经网络,净输入为 z ( l ) \pmb{z}^{(l)} zzz(l) 均值和方差为:
层归一化定义为:
其中 γ \gamma γ 和 β \beta β 分别代表缩放和平移的参数向量,和 z ( l ) z^{(l)} z(l) 维数相同。
循环神经网络中的层归一化 层归一化可以应用在循环神经网络中,对循环神经层进行归一化操作,假设在时刻 t t t ,循环神经网络的隐藏层 h t \pmb{h}_t hhht,其层归一化的更新为:
层归一化可以有效缓解,RNN中净输入随时间变大或变小,导致的梯度爆炸或梯度消失。
层归一化和批量归一化整体上是十分类似的,差别在于归一化的方法不同。对于K个样本的一个小批量集合 Z ( l ) = [ z ( 1 , l ) ; ⋯ ; z ( K , l ) ] \pmb{Z}^{(l)} = [\pmb{z}^{(1,l)}; \cdots;\pmb{z}^{(K,l)}] ZZZ(l)=[zzz(1,l);⋯;zzz(K,l)] ,层归一化是对矩阵 Z ( l ) \pmb{Z}^{(l)} ZZZ(l) 的每一列进行归一化,而批量归一化是对每一行进行归一化。一般来说,批量归一化是更好的选择,当小批量样本数量比较小时,可以选择层归一化。
权重归一化(Weight Normalization)是对神经网络的连接权重进行归一化,通过再参数化(Reparameterization)方法,将连接权重分解为长度和方向两种参数。假设第 l l l 层神经元 a ( l ) = f ( W a ( l − 1 ) + b ) \pmb{a}^{(l)} = f(\pmb{Wa}^{(l-1)} + \pmb{b}) aaa(l)=f(WaWaWa(l−1)+bbb) ,将 W 再参数化为:
其中 W i , : \pmb{W}_{i,:} WWWi,: 表示权重 W \pmb{W} WWW 的第 i 行, M l \pmb{M}_{l} MMMl 为神经元数量,新引入的参数 g i g_i gi 为标量, v i \pmb{v}_i vvvi和 a ( l − 1 ) \pmb{a}^{(l-1)} aaa(l−1)。
神经网络中,权重经常是共享的,权重数量往往比神经元数量要少,因此权重归一化的开销较小。
局部相应归一化(Local Response Normalization,LRN)常用在基于卷积的图像处理上。
假设一个卷积层的输出特征 Y ∈ R M ′ × N ′ × P Y \in \mathbb{R}^{M^{'} \times N^{'} \times P} Y∈RM′×N′×P 为三维张量,其中每个切片矩阵 Y p ∈ R M ′ × N ′ Y^{p} \in \R^{M^{'} \times N^{'}} Yp∈RM′×N′ 为一个输出特征映射, 1 ≤ p ≤ P 1 \leq p \leq P 1≤p≤P。
局部响应归一化是对邻近的特征映射进行局部归一化:
其中除和幂运算都是按元素运算, n , k , α , β n,k,\alpha,\beta n,k,α,β 为超参数,n 为局部归一化的特征窗口大小。
局部响应归一化和层归一化都是对同层的神经元进行归一化。不同的是,局部响应归一化应用在激活函数之后,只是对邻近的神经元进行局部归一化,并且不减去均值。
局部响应归一化类似生物神经元中的 侧抑制,即活跃神经元对相邻神经元有抑制作用。当使用ReLU时,神经元的活性值没有限制,局部响应归一化,可以起到平衡和约束作用:如果一个神经元的活性值非常大,那么和它邻近的神经元就近似地归一化为0,从而发挥抑制作用,增强泛化能力。最大汇聚也具有侧抑制作用,但最大汇聚是对同一个特征映射中的邻近位置中的神经元进行抑制,而局部响应归一化是对同一个位置的邻近特征映射中的神经元进行抑制。
归一化方法也可以作为一种有效的正则化方法,从而提高网络的泛化能力,避免过拟合。
神经网络中,除有可学习的参数外,还有许多超参数,常见的超参数有三类:
超参数优化 (Hyperparameter Optimization)存在两方面难点:
假设神经网络中共有 K 个超参数,每个超参数配置为一个向量 x ∈ X \pmb{x} \in X xxx∈X, X ⊂ R K X \subset \R^K X⊂RK 是超参数配置的取值空间。超参数优化的目标函数定义为: f ( x ) : X → R f(x):X \to \R f(x):X→R, f ( x ) f(x) f(x) 是衡量一组超参数配置 x x x 效果的函数,常设置为开发集上的错误率。目标函数 f ( x ) f(x) f(x) 可看做一个黑盒函数,不需知道具体形式, f ( x ) f(x) f(x)的函数形式已知,但不是关于 x x x 的连续函数, x x x 不同, f ( x ) f(x) f(x) 的函数形式不同,无法用梯度下降优化。
网格搜索(Grid Search)是尝试所有超参数的组合来寻址合适的一组超参数配置的方法。假设共有 K K K 个超参数,第 k 个超参数可以取 m k m_k mk 个值,那么总共的配置组合数量为 m 1 × m 2 × ⋯ × m K m_1 \times m_2 \times \cdots \times m_K m1×m2×⋯×mK。若超参数连续,可将超参数离散化,选择几个经验值,如学习率 α ∈ { 0.01 , 0.1 , 0.5 , 1.0 } \alpha \in \{0.01,0.1,0.5,1.0\} α∈{ 0.01,0.1,0.5,1.0},一般而言,连续的超参数不能等间隔离散化,需要根据超参数自身特点离散化。
网格搜索根据这些超参数的不同组合分别训练模型,然后测试这些模型在开发集上的性能,选取性能最好的超参数配置。
不同超参数对模型性能的影响差异大,如正则化系数对模型性能影响有限,学习率对模型性能影响大。从而导致网格搜索会在不重要的超参数上尝试。一种比较有效的方法,是对超参数进行随机组合,选取性能最好的配置,这就是随机搜索(Random Search),易实现,常比网格搜索好。
网格搜索和随机搜索都没有利用不同超参数组合之间的相关性,即若模型超参数组合类似,其性能也接近。故这两种搜索方式较低效。
贝叶斯优化(Bayesian optimization)是一种自适应的超参数优化方法,根据当前已经试验的超参数组合,来预测下一个可能带来最大收益的组合。
一种常用贝叶斯优化方法为时序模型优化,假设超参数优化的函数 f ( x ) f(x) f(x) 服从高斯过程,则 p ( f ( x ) ∣ x ) p(f(\pmb{x})|\pmb{x}) p(f(xxx)∣xxx) 为一个正太分布。贝叶斯优化过程是根据已有的 N 组实验结果 H = { x n , y n } n = 1 N H = \{\pmb{x}_n, y_n\}_{n=1}^N H={ xxxn,yn}n=1N y n y_n yn 来建模高斯过程,并计算 f ( x ) f(\pmb{x}) f(xxx) 的后验分布 p g p ( f ( x ) ∣ x , H ) p_{gp}(f(\pmb{x})|\pmb{x},H) pgp(f(xxx)∣xxx,H) 。
为使 p g p ( f ( x ) ∣ x , H ) p_{gp}(f(\pmb{x})|\pmb{x},H) pgp(f(xxx)∣xxx,H) 接近其真实分布,就需要对样本空间进行足够多的采样,但成本高,常要求用少量的样本使得 p θ ( f ( x ) ∣ x , H ) p_{\theta}(f(\pmb{x})|\pmb{x},H) pθ(f(xxx)∣xxx,H) 接近真实分布。故定义一个收益函数 a ( x , H ) a(x,H) a(x,H) 俩判断一个样本能否给 p θ ( f ( x ) ∣ x , H ) p_{\theta}(f(\pmb{x})|\pmb{x},H) pθ(f(xxx)∣xxx,H)建模提供更多收益。收益越大,修正的高斯过程越接近目标函数的真实分布。
时序模型优化方法算法如下:
期望改善是定义收益函数的一种方式,假设 y ∗ = m i n { y n , 1 ≤ n ≤ N } y^* = min\{y_n, 1 \leq n \leq N\} y∗=min{ yn,1≤n≤N} 是当前样本最优值,期望改善函数为:
期望改善是定义一个样本 x \pmb{x} xxx 在当前模型 p g p ( f ( x ) ∣ x , H ) p_{gp}(f(\pmb{x})|\pmb{x},H) pgp(f(xxx)∣xxx,H) 下, f ( x ) f(\pmb{x}) f(xxx) 超过最好结果 y ∗ y^* y∗的期望。
收益函数还有其他定义形式:改善概率、高斯过程置信上界。
贝叶斯优化缺点:高斯建模要计算协方差矩阵的逆,时间复杂度 O ( N 3 ) O(N^3) O(N3) ,不能很好处理高维情况。高效的高斯过程建模方法,可将时间复杂度从 O ( N 3 ) O(N^3) O(N3) 降低到 O ( N ) O(N) O(N)。
每组超参数配置评估代价较高,可在较早阶段估计出一组超参数配置的效果,从而选择提前终止这组配置的评估,将更多资源留给其他配置。可归结于多臂赌博机问题的一个泛化问题:最优臂问题。即在给定有限的机会次数下,如何玩这些赌博机并找到收益最大的臂。
对于使用随机梯度下降的神经网络,可通过一组超参数的学习曲线来预估这组超参数配置是否有希望得到比较好的结果。如果一组超参数配置的学习曲线不收敛或者收敛较差,可以中止当前的训练。
动态资源分配的关键是将有限资源分配给更有可能带来收益的超参数组合。一种有效方法是逐次减半,将超参数优化看做非随机的最优臂问题。假设尝试N组超参数,总共可以利用资源预算为B,可通过 T = ⌈ log 2 ( N ) ⌉ − 1 T = \lceil \log_2(N) \rceil - 1 T=⌈log2(N)⌉−1轮逐次减半的方法来选最优配置:
N越大,得到最佳配置的机会越大,但每组配置分到的资源越少,这样早期的评估结果可能不准确。
N越小,每组超参数配置的评估会越准确,但有可能无法得到最优的配置。
设置N是平衡“利用-探索”的一个关键因素,一种改进方法是HyperBand方法,通过尝试不同的N来选取最优参数。
以上超参数优化方法,是在固定的超参数空间 X 中进行最优配置搜索,而最重要的神经网络架构常是有经验的专家设计。深度学习使得机器学习的“特征工程”问题转化为“网络架构工程”问题。
神经架构搜索(Neural Architecture Search,NAS)通过神经网络自动实现网络架构的设计。利用一个变长字符串描述一个神经网络的架构,利用元学习思想,NAS利用一个控制器生成一个子网络的架构描述。控制器可由一个循环神经网络实现,控制器的训练可用强化学习实现,其奖励信号为生成的子网络在开发集上的准确率。
泛化问题是机器学习模型的关键,即在样本真实分布上的期望风险最小化,而训练集上的经验风险最小化和期望风险最小化不同,神经网络拟合能力强,其在训练数据上的错误率都可以降到最低,甚至为0,从而过拟合。
正则化(Regularization)是一类通过限制模型复杂度,从而避免过拟合,提高泛化能力的方法,比如引入约束、增加先验、提前停止等。
传统机器学习中,主要通过限制模型复杂度来提高泛化能力,如采用 l 1 l_1 l1 、 l 2 l_2 l2 正则化等。训练神经网络时,在过度参数化时, l 1 l_1 l1 、 l 2 l_2 l2 正则化的效果往往不如浅层机器学习模型中显著,故常用数据增强、提前停止、丢弃法、集成法
通过约束参数的 l 1 l_1 l1 、 l 2 l_2 l2 范数来减小过拟合现象。优化问题可写为:
p的取值常为1或2,代表 l 1 l_1 l1 、 l 2 l_2 l2 范数, λ \lambda λ为正则化系数。
带正则化的优化问题等价于下面带约束条件的优化问题:
不同范数条件下的最优化问题如图,红线表示函数 l p = 1 l_{p}=1 lp=1,F为函数 f ( θ ) f(\theta) f(θ) 的等高线(用直线表示,简单起见):
l 1 l_1 l1范数的约束常使得最优解在坐标轴上,从而使得最终的参数为稀疏性向量,此外, l 1 l_1 l1范数在零点不可导,因此用下式代替,其中D为参数数量, ϵ \epsilon ϵ是一个非常小的常数:
一种折中的正则化方法,是同时加入 l 1 l_1 l1和 l 2 l_2 l2正则化,称为弹性网络正则化,其中 λ 1 \lambda_1 λ1 , λ 2 \lambda_2 λ2是正则化项的系数:
权重衰减在每次参数更新是,引入一个衰减系数:
其中, g t g_t gt 为第 t 步更新时的梯度, α \alpha α为学习率, β \beta β为权重衰减系数,一般取值较小,如0.0005。
在标准的随机梯度下降中,权重衰减正则化和 l 2 l_2 l2正则化的效果相同,因此权重衰减在一些框架中通过 l 2 l_2 l2 正则化来实现。
较为复杂的优化方法中(如Adam)中,权重衰减和 l 2 l_2 l2正则化不等价。
提前停止对于深度神经网络简单有效,为避免在训练集过拟合,使用一个和训练集独立的样本集合,称为验证集,并利用验证集上的错误来代替期望错误,验证集上的错误率不再下降,就停止迭代。
实际中,验证集上的错误率变化曲线,不一定是如图的平衡曲线,很可能使先升高再降低,故提前停止的具体停止标准要根据实际任务进行优化。
训练过程中,随机丢弃一部分神经元(同时丢弃对应的连接边),来避免过拟合。称为丢弃法(Dropout Method)。每次选择丢弃的神经元是随机的,最简单的方式是设置固定概率p,对每一个神经元乘以p来判定要不要保留,对于一个神经层 y = f ( W x + b ) \pmb{y} = f(\pmb{Wx+b}) yyy=f(Wx+bWx+bWx+b),可以引入掩蔽函数mask() 使得 y = f ( W m a s k ( x ) + b ) \pmb{y} = f(\pmb{W mask(x)+b}) yyy=f(Wmask(x)+bWmask(x)+bWmask(x)+b),mask函数定义:
其中 m ∈ { 0 , 1 } D \pmb{m} \in \{0,1\}^D mmm∈{ 0,1}D 是丢弃掩码(DropoutMask),通过以概率为p的伯努利分布随机生成。
训练时,激活神经元的平局元的数量为原来的p倍;测试时,所有的神经元都是可以激活的,从而造成训练和测试时网络输出不一致,为了缓解这个问题,在测试时将神经层输入 x \pmb{x} xxx 乘以 p,也相当于把不同的神经网络做了平均。保留率 p 可以通过验证集来选一个最佳值:一般来说,对于隐藏层的神经元 p=0.5时效果最好,这对大部分的网络和任务都比较有效;对于输入层的神经元,其保留率通常设为接近1的数,使得输入变化不会太大。对输入层神经元进行丢弃时,相当于给数据增加噪声,来提到网络的鲁棒性。
丢弃法常是针对神经元进行随机丢弃,但可以拓展到对神经元之间的连接进行随机丢弃,或每一层进行随机丢弃。下图是一个网络应用丢弃法后的实例:
集成学习角度解释 每做一次丢弃,相当于从原始网络中采样一个子网络,如果一个网络有n个神经元,那么总共有 2 n 2^n 2n个子网络。每次迭代都相当于训练一个不同的子网络,这些子网络都共享原始网络参数。那么,最终的网络可以近似看成集成了指数级个不同网络的组合模型。
贝叶斯学习角度解释 丢弃法可解释为一种贝叶斯学习的近似,用 y = f ( x ; θ ) y = f(\pmb{x};\theta) y=f(xxx;θ) 来表示要学习的网络,贝叶斯学习是假设 θ \theta θ 为随机向量,并且先验分布为 q ( θ ) q(\theta) q(θ) ,贝叶斯方法的预测为:
其中 f ( x ; θ m ) f(\pmb{x};\theta_m) f(xxx;θm) 为第m次应用丢弃方法后的网络,其中 θ m \theta_m θm 是对全部参数 θ \theta θ 的一次采样。
当在RNN上应用丢弃法时,不能直接对每个时刻的隐状态进行随机丢弃,这样会损害RNN在时间维度上的记忆力。一种简单的方法,对非时间维度的连接(即非循环连接)进行随机丢失。如图,虚线边表示进行随机丢弃,不同的颜色表示不同的丢弃掩码:
然而根据贝叶斯学习的解释,丢弃法是对参数 θ \theta θ的采样,每次采样的参数需要在每个时刻保持不变,因此在对循环神经网络上使用丢弃法时,需对参数矩阵的每个元素进行随机丢弃,并在所有时刻都使用相同的丢弃掩码。称为变分丢弃法(Variational Dropout),如图,相同颜色表示使用相同的丢弃掩码:
数据有限的情况下,可通过数据增强增加数据量,提高模型鲁棒性。图像的数据增强主要是对图像进行转变,引入噪声:
数据增强中,可以对样本特征加入随机噪声来避免过拟合,同样也可以给标签加入一定噪声,即标签平滑(Label Smoothing)。假设训练数据集中有一些样本的标签是被错误标注的,那么最小化这些样本上的损失函数会过拟合。
一个样本 x 的标签常用 one-hot向量表示:
这种标签可看做是硬目标(Hard Target)。如果使用softmax分类器并使用交叉熵损失函数,最小化损失函数会使得正确类和其他类的权重差异变得很大。根据softmax函数的性质可知,如果使得某一类的概率输出接近1,其未归一化的得分需远大于其他类的得分,可能导致权重越来越大,并导致过拟合。如果标签错误,则过拟合更严重。假设样本以 ϵ \epsilon ϵ 的概率为其他类,平滑后的标签:
K 是标签数量,这种标签可以看做软目标(Soft Target)。标签平滑可以避免模型输出过拟合到应目标,并不损害其分类能力。
这种方法,给其他 K − 1 K-1 K−1个标签相同的概率 ϵ K − 1 \frac{\epsilon}{K-1} K−1ϵ ,没有考虑标签之间的相关性,一种更好的做法是按类别的相关性赋予其他标签不同的概率。如先训练一个复杂的网络A,使用A的输出作为软目标来训练网络B,这种方法叫知识精炼。