网络优化与正则化

花书上关于网络优化的笔记记录于https://www.jianshu.com/p/06bb6d6a5227

花书上关于网络正则化的笔记记录于https://www.jianshu.com/p/b88df5ccd5c3

虽然神经网络具有非常强的表达能力,但是当应用神经网络模型到机器学习时依然存在一些难点。主要分为两大类:

  • 优化问题:神经网络模型是一个非凸函数,再加上在深度网络中的梯度消失问题,很难进行优化;另外,深层神经网络模型一般参数比较多,训练数据也比较大,会导致训练的效率比较低。

  • 泛化问题:因为神经网络的拟合能力强,反而容易在训练集上产生过拟合。因此,在训练深层神经网络时,同时也需要通过一定的正则化方法来改进网络的泛化能力。

1、网络优化难点

  • 网络结构多样性:神经网络的种类非常多,比如卷积网络、循环网络等,其结构也非常不同。有些比较深,有些比较宽。不同参数在网络中的作用也有很大的差异,比如连接权重和偏置的不同,以及循环网络中循环连接上的权重和其它权重的不同。由于网络结构的多样性,我们很难找到一种通用的优化方法。不同的优化方法在不同网络结构上的差异也都比较大。此外,网络的超参数一般也比较多,这也给优化带来很大的挑战。

  • 高维变量的非凸优化:低维空间的非凸优化问题主要是存在一些局部最优点。基于梯度下降的优化方法会陷入局部最优点,因此低维空间非凸优化的主要难点是如何选择初始化参数和逃离局部最优点。深层神经网络的参数非常多,其参数学习是在非常高维空间中的非凸优化问题,其挑战和在低维空间的非凸优化问题有所不同。

在高维空间中,非凸优化的难点并不在于如何逃离局部最优点,而是如何逃离鞍点。因为在高维空间中,局部最优点要求在每一维度上都是最低点,这种概率非常低。也就是说高维空间中,大部分梯度为0 的点都是鞍点。基于梯度下降的优化方法会在鞍点附近接近于停滞,同样很难从这些鞍点中逃离。

此外,深层神经网络的参数非常多,并且有一定的冗余性,这导致每单个参数对最终损失的影响都比较小,这导致了损失函数在局部最优点附近是一个平坦的区域,称为平坦最小值(Flat Minima)。在非常大的神经网络中,大部分的局部最小值是相等的。虽然神经网络有一定概率收敛于比较差的局部最小值,但随着网络规模增加,网络陷入局部最小值的概率大大降低。

2、优化算法

目前,深层神经网络的参数学习主要是通过梯度下降方法来寻找一组可以最小化结构风险的参数。在具体实现中,梯度下降法可以分为:批量梯度下降、随机梯度下降以及小批量梯度下降三种形式。根据不同的数据量和参数量,可以选择一种具体的实现形式。除了在收敛效果和效率上的差异,这三种方法都存在一些共同的问题,比如1)如何初始化参数;2)预处理数据;3)如何选择合适的学习率,避免陷入局部最优等

2.1、小批量梯度下降

在训练深层神经网络时,训练数据的规模比较大。如果在梯度下降时,每次迭代都要计算整个训练数据上的梯度需要比较多的计算资源。此外,大规模训练集中的数据通常也会非常冗余,也没有必要在整个训练集上计算梯度。因此,在训练深层神经网络时,经常使用小批量梯度下降算法。

令表示一个深层神经网络,为网络参数,使用小批量梯度下降进行优化时,每次选取个训练样本。第次迭代(Iteration)时损失函数关于参数的偏导数为:

\mathfrak{g}_{t}(\theta)=\frac{1}{K} \sum_{\left(\mathrm{x}^{(k)}, \mathrm{y}^{(k)}\right) \in \mathcal{I}_{t}} \frac{\partial \mathcal{L}\left(\mathbf{y}^{(k)}, f\left(\mathrm{x}^{(k)} ; \theta\right)\right)}{\partial \theta}

其中为可微分的损失函数,称为批量大小(Batch Size)。

第次更新的梯度定义为:

使用梯度下降来更新参数:

其中为学习率。

每次迭代时参数更新的差值定义为:

和梯度并不需要完全一致。为每次迭代时参数的实际更新方向,即。在标准的小批量梯度下降中,。

批量大小对随机梯度下降的影响:在小批量梯度下降中,批量大小(Batch Size)对网络优化的影响也非常大。一般而言,批量大小不影响随机梯度的期望,但是会影响随机梯度的方差。批量大小越大,随机梯度的方差越小,引入的噪声也越小,训练也越稳定,因此可以设置较大的学习率。而批量大小较小时,需要设置较小的学习率,否则模型会不收敛。学习率通常要随着批量大小的增大而相应地增大。一个简单有效的方法是线性缩放规则(Linear Scaling Rule):当批量大小增加倍时,学习率也增加倍。线性缩放规则往往在批量大小比较小时适用,当批量大小非常大时,线性缩放会使得训练不稳定。

下图给出了从Epoch(回合)和Iteration(单次更新)的角度,批量大小对损失下降的影响。每一次小批量更新为一次Iteration,所有训练集的样本更新一遍为一次Epoch,两者的关系为1个Epoch 等于( 训练样本的数量N)/(批量大小K ) 次Iterations。

为了更有效地进行训练深层神经网络,在标准的小批量梯度下降方法的基础上,也经常使用一些改进方法以加快优化速度。常见的改进方法主要从以下两个方面进行改进:学习率调整和梯度方向优化。这些改进的优化方法也同样可以应用在批量或随机梯度下降方法上。

2.2、学习率调整

学习率是神经网络优化时的重要超参数。在梯度下降方法中,学习率的取值非常关键,如果过大就不会收敛,如果过小则收敛速度太慢。常用的学习率调整方法包括学习率衰减率、学习率预热、周期学习率以及一些自适应地调整学习率的方法。

2.2.1、学习率衰减

经验上看,学习率在一开始要保持大些来保证收敛速度,收敛到最优点附近时要小些以避免来回震荡。比较简单的学习率调整可以通过学习率衰减(Learning Rate Decay)的方式来实现,也称为学习率退火(Learning Rate Annealing)

假设初始化学习率为,在第次迭代时的学习率。常用的衰减方式为可以设置为按迭代次数进行衰减。常见的衰减方法有以下几种:

  • 分段常数衰减(Piecewise Constant Decay):即每经过次迭代将学习率衰减为原来的倍,其中和为根据经验设置的超参数。

  • 逆时衰减(Inverse Time Decay)

其中为衰减率。

  • 指数衰减(Exponential Decay)

其中为衰减率。

  • 自然指数衰减(Natural Exponential Decay)

其中为衰减率。

  • 余弦衰减(Cosine Decay)

其中为总的迭代次数。

2.2.2、学习率预热

在小批量梯度下降方法中,当批量大小的设置比较大时,通常需要比较大的学习率。但在刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,再加上比较大的初始学习率,会使得训练不稳定。

为提高训练稳定性,我们可以在最初几轮迭代时采用较小的学习率,等梯度下降到一定程度后再恢复到初始学习率,这种方法称为学习率预热(Learning Rate Warmup)

一个常用的学习率预热方法是逐渐预热(Gradual Warmup)。假设预热的迭代次数为,初始学习率为,在预热过程中,每次更新的学习率为:

当预热过程结束,再选择一种学习率衰减方法来逐渐降低学习率。

2.2.3、周期性学习率调整

为了使得梯度下降方法能够逃离局部最小值或鞍点,一种经验性的方式是在训练过程中周期性地增大学习率。虽然增加学习率可能短期内有损网络的收敛稳定性,但从长期来看有助于找到更好的局部最优解。一般而言,当一个模型收敛一个平坦(Flat)的局部最小值时,其鲁棒性会更好,即微小的参数变动不会剧烈影响模型能力;而当模型收敛到一个尖锐(Sharp)的局部最小值时,其鲁棒性也会比较差。具备良好泛化能力的模型通常应该是鲁棒的,因此理想的局部最小值应该是平坦的。两种常用的周期性调整学习的方法为:循环学习率带热重启的随机梯度下降

  • 循环学习率:让学习率在一个区间内周期性地增大和缩小。通常可以使用线性缩放来调整学习率,称为三角循环学习率(Triangular Cyclic Learning Rate)。假设每个循环周期的长度相等都为,其中前步为学习率线性增大阶段,后步为学习率线性缩小阶段。在第次迭代时,其所在的循环周期数为:

第次迭代的学习率为:

其中分别为第个周期中学习率的上界和下界,可以随着的增大而逐渐降低;的计算为:

  • 带热重启的随机梯度下降:用热重启方式来替代学习率衰减的方法。学习率每间隔一定周期后重新初始化为某个预先设定值,然后逐渐衰减。每次重启后模型参数不是从头开始优化,而是从重启前的参数基础上继续优化。

假设在梯度下降过程中重启次,第次重启在上次重启开始第个回合后进行,称为重启周期。在第次重启之前,采用余弦衰减来降低学习率。第次迭代的学习率为:

其中分别为第个周期中学习率的上界和下界,可以随着的增大而逐渐降低;为从上次重启之后的回合(Epoch)数。可以取小数,这样可以在一个回合内部进行学习率衰减。

2.2.4、AdaGrad算法

在标准的梯度下降方法中,每个参数在每次迭代时都使用相同的学习率。由于每个参数的维度上收敛速度都不相同,因此根据不同参数的收敛情况分别设置学习率。

AdaGrad(Adaptive Gradient)算法是借鉴正则化的思想,每次迭代时自适应地调整每个参数的学习率。在第迭代时,先计算每个参数梯度平方的累计值:

其中为按元素乘积,是第次迭代时的梯度。

AdaGrad算法的参数更新差值为:

其中是初始的学习率,是为了保持数值稳定性而设置的非常小的常数,一般取值范围为到。此外,这里的开平方、除、加运算都是按元素进行的操作。

在Adagrad算法中,如果某个参数的偏导数累积比较大,其学习率相对较小;相反,如果其偏导数累积较小,其学习率相对较大。但整体是随着迭代次数的增加,学习率逐渐缩小

Adagrad算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点。

2.2.5、RMSprop算法

RMSprop算法是Geoff Hinton提出的一种自适应学习率的方法,可以在有些情况下避免AdaGrad算法中学习率不断单调下降以至于过早衰减的缺点

RMSprop算法首先计算每次迭代梯度平方的指数衰减移动平均:

其中为衰减率,一般取值为0.9。

RMSprop算法的参数更新差值为:

其中是初始的学习率。

从上式可以看出,RMSProp 算法和Adagrad算法的区别在于的计算由累积方式变成了指数衰减移动平均。在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大

2.2.6、AdaDelta 算法

和RMSprop算法类似,AdaDelta算法通过梯度平方的指数衰减移动平均来调整学习率。此外,AdaDelta 算法还引入了每次参数更新差的平方的指数衰减权移动平均。

第次迭代时,每次参数更新差 , 的平方的指数衰减权移动平均为:

其中为衰减率。此时还未知,因此只能计算到。

AdaDelta算法的参数更新差值为:

其中的计算方式和RMSprop算法一样,为参数更新差的指数衰减权移动平均,这在一定程度上平抑了学习率的波动

2.3、梯度方向优化

除了调整学习率之外,还可以通过使用最近一段时间内的平均梯度来代替当前时刻的梯度来作为参数更新的方向。在小批量梯度下降中,如果每次选取样本数量比较小,损失会呈现震荡的方式下降。有效地缓解梯度下降中的震荡的方式是通过用梯度的移动平均来代替每次的实际梯度,并提高优化速度,这就是动量法

2.3.1、动量法

动量是模拟物理中的概念。一般而言,一个物体的动量指的是这个物体在它运动方向上保持运动的趋势,是物体的质量和速度的乘积

动量法(Momentum Method)是用之前积累动量来替代真正的梯度。每次迭代的梯度可以看作是加速度。

在第次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向:

其中为动量因子,通常设为0.9,为学习率。

一般而言,在迭代初期,梯度方法都比较一致,动量法会起到加速作用,可以更快地到达最优点。在迭代后期,梯度方法会取决不一致,在收敛值附近震荡,动量法会起到减速作用,增加稳定性

2.3.2、Nesterov加速梯度

Nesterov加速梯度(Nesterov Accelerated Gradient,NAG),也叫Nesterov动量法(Nesterov Momentum)是一种对动量法的改进

在动量法中,实际的参数更新方向为上一步的参数更新方向和当前梯度的叠加,可以被拆分为两步进行:

其中梯度为点上的梯度,因此在第二步更新中有些不太合理。更合理的更新方向应该为上的梯度:

2.3.3、Adam算法

自适应动量估计(Adaptive Moment Estimation,Adam)算法可以看作是动量法和RMSprop的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。

Adam算法一方面计算梯度平方的指数加权平均(和RMSprop类似),另一方面计算梯度的指数加权平均(和动量法类似)。

其中和分别为两个移动平均的衰减率,通常取值为。

可以看作是梯度的均值(一阶矩),可以看作是梯度的未减去均值的方差(二阶矩)

假设,那么在迭代初期和的值会比真实的均值和方差要小。特别是当和都接近于1时,偏差会很大。因此,需要对偏差进行修正。

Adam算法的参数更新差值为:

其中学习率通常设为0.001,并且也可以进行衰减,比如。

Adam算法是RMSProp 与动量法的结合,因此一种自然的Adam的改进方法是引入Nesterov加速梯度,称为Nadam算法。

2.3.4、梯度截断

在深层神经网络或循环神经网络中,除了梯度消失之外,梯度爆炸是影响学习效率的主要因素。在基于梯度下降的优化过程中,如果梯度突然增大,用大的梯度进行更新参数,反而会导致其远离最优点。为了避免这种情况,当梯度的模大于一定阈值时,就对梯度进行截断,称为梯度截断(gradient clipping)

一般截断的方式有以下几种:

按值截断:给定一个区间,如果一个参数的梯度小于时,就将其设为;如果大于时,就将其设为:

按模截断:按模截断是将梯度的模截断到一个给定的截断阈值,如果,保持不变,否则令:

截断阈值是一个超参数,也可以根据一段时间内的平均梯度来自动调整。实验中发现,训练过程对阈值并不十分敏感,通常一个小的阈值就可以得到很好的结果。

2.4、小结

在MNIST数据集上收敛性的比较(学习率为0.001,批量大小为128)

3、参数初始化

梯度下降法需要在开始训练时给每一个参数赋一个初始值。这个初始值的选取十分关键。在感知器和logistic 回归的训练中,我们一般将参数全部初始化为0。但是这在神经网络的训练中会存在一些问题。因为如果参数都为0,在第一遍前向计算时,所有的隐层神经元的激活值都相同。这样会导致深层神经元没有区分性。这种现象也称为对称权重现象。为了打破这个平衡,比较好的方式是对每个参数都随机初始化,这样使得不同神经元之间的区分性更好。

随机初始化参数的一个问题是如何选取随机初始化的区间。如果参数太小,一是会导致神经元的输入过小,经过多层之后信号就慢慢消失了;二是还会使得Sigmoid型激活函数丢失非线性的能力。以Logistic函数为例,在0附近基本上是近似线性的。这样多层神经网络的优势也就不存在了。如果参数取得太大,会导致输入状态过大。对于Sigmoid型激活函数来说,激活值变得饱和,从而导致梯度接近于0

一般而言,参数初始化的区间应该根据神经元的性质进行差异化的设置。如果一个神经元的输入连接很多,它的每个输入连接上的权重就应该小一些,以避免神经元的输出过大(当激活函数为ReLU时)或过饱和(当激活函数为Sigmoid 函数时)

经常使用的初始化方法有以下两种:

高斯分布初始化:参数从一个固定均值(比如0)和固定方差(比如0.01)的高斯分布进行随机初始化。

均匀分布初始化:在一个给定的区间内采用均匀分布来初始化参数。超参数的设置可以按神经元的连接数量进行自适应的调整。

初始化一个深层网络时,一个比较好的初始化策略是保持每个神经元输入和输出的方差一致。这里介绍两种参数初始化的方法。

3.1、Xavier初始化

当网络当使用Losgistic激活函数时,Xavier初始化可以根据每层的神经元数量来自动计算初始化参数的方差。

假设第层的一个隐藏层神经元,其接受前一层的个神经元的输出:

为了避免初始化参数使得激活值变得饱和,我们需要尽量使得处于激活函数的线性区间,也就是其绝对值比较小的值。这时该神经元的激活值为。

假设和的均值都为0,并且相互独立,则的均值为:

的方差为:

我们希望尽可能保持每个神经元的输入和输出的方差一致。这样设为1 比较合理,即:

同理,为了使得在反向传播中,误差信号也不被放大或缩小,需要将的方差保持为:

作为折中,同时考虑信号在前向和反向传播中都不被放大或缩小,可以设置:

在计算出参数的理想方差后,可以通过高斯分布或均匀分布来随机初始化参数。

  • 高斯分布初始化:连接权重可以按的高斯分布进行初始化。

  • 均匀分布初始化:假设随机变量在区间内均匀分布,则其方差为:

若采用区间为的均分分布初始化,并满足,则:

3.2、He初始化

当第层神经元使用ReLU激活函数时,通常有一半的神经元输出为0,因此其分布的方差也近似为使用Logistic作为激活函数时的一半(一半是指是的一半)。这样,只考虑前向传播时,参数的理想方差为:

此时可以通过高斯分布或均匀分布来随机初始化参数。

  • 高斯分布初始化:连接权重可以按的高斯分布进行初始化。

  • 均匀分布初始化:若采用区间为的均分分布初始化,则:

这种初始化方法称为He初始化

4、数据预处理

一般而言,样本的原始特征中的每一维特征由于来源以及度量单位不同,其特征取值的分布范围往往差异很大。当我们计算不同样本之间的欧氏距离时,取值范围大的特征会起到主导作用。这样,对于基于相似度比较的机器学习方法(比如最近邻分类器),必须先对样本进行预处理,将各个维度的特征归一化到同一个取值区间,并且消除不同特征之间的相关性,才能获得比较理想的结果。虽然神经网络可以通过参数的调整来适应不同特征的取值范围,但是会导致训练效率比较低

如上图所示,取值范围不同会造成在大多数位置上的梯度方向并不是最优的搜索方向。当使用梯度下降法寻求最优解时,会导致需要很多次迭代才能收敛。如果我们把数据归一化为取值范围相同,大部分位置的梯度方向近似于最优搜索方向。这样,在梯度下降求解时,每一步梯度的方向都基本指向最小值,训练效率会大大提高

经常使用的归一化方法有如下几种:

  • 缩放归一化:通过缩放将每一个特征的取值范围归一到或之间。假设有个样本,对于每一维特征:

其中和分别是特征在所有样本上的最小值和最大值。

  • 标准归一化:将每一个维特征都处理为符合标准正态分布(均值为0方差为1)。假设有个样本,对于每一维特征我们先计算它的均值和标准差:

然后,将特征减去均值,并除以标准差,得到新的特征值:

这里不能为0。如果标准差为0,说明这一维特征没有任务区分性,可以直接删掉

  • 白化:白化(Whitening)是一种重要的预处理方法,用来降低输入数据特征之间的冗余性输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相同的方差。白化的一个主要实现方式是使用主成分分析(PCA)方法去除掉各个成分之间的相关性。

标准归一化和PCA白化的比较如下:

5、逐层归一化

在深层神经网络中,中间某一层的输入是其之前的神经层的输出。因此,其之前的神经层的参数变化会导致其输入的分布发生较大的差异。在使用随机梯度下降来训练网络时,每次参数更新都会导致网络中间每一层的输入的分布发生改变。越深的层,其输入的分布会改变得越明显。就像一栋高楼,低楼层发生一个较小的偏移,都会导致高楼层较大的偏移。

从机器学习角度来看,如果某个神经层的输入分布发生了改变,那么其参数需要重新学习,这种现象叫做内部协变量偏移(Internal Covariate Shift)

关于协变量偏移,https://www.kaggle.com/pavansanagapati/covariate-shift-what-is-it中有一个很直观的图:

在机器学习中,协变量可以看作是输入。一般的机器学习算法都要求输入在训练集和测试集上的分布是相似的。如果不满足这个假设,在训练集上学习到的模型在测试集上的表现会比较差

如上所说,如果初始状态下的训练集和测试集的概率分布有一个小的差异,经过网络的层层传递也会得到两个差别很大的概率分布,此时考虑深层的网络的输入,就可能出现上图的情况。这有点类似于蝴蝶效应。

总之,为了解决内部协变量偏移问题,就要使得每一个神经层的输入的分布在训练过程中要保持一致。最简单直接的方法就是对每一个神经层都进行归一化操作,使其分布保持稳定

5.1、批量归一化

批量归一化(Batch Normalization,BN)方法是一种有效的逐层归一化方法,可以对神经网络中任意的中间层进行归一化操作。

对于一个深层神经网络,令第层的净输入为,神经元的输出为,即:

其中是激活函数,和是可学习的参数。

为了减少内部协变量偏移问题,就要使得净输入的分布一致,比如都归一化到标准正态分布。

逐层归一化需要在中间层进行操作,要求效率比较高,为了提高归一化效率,一般使用标准归一化,将净输入的每一维都归一到标准正态分布:

其中和是指当前参数下,的每一维在整个训练集上的期望和方差。因为目前主要的训练方法是基于小批量的随机梯度下降方法,所以准确地计算的期望和方差是不可行的。因此,的期望和方差通常用当前小批量样本集的均值和方差近似估计

给定一个包含个样本的小批量样本集合,第层神经元的净输入的均值和方差为:

\begin{aligned} \mu_{\mathcal{B}} &=\frac{1}{K} \sum_{k=1}^{K} \mathbf{z}^{(k, l)} \\ \sigma_{\mathcal{B}}^{2} &=\frac{1}{K} \sum_{k=1}^{K}\left(\mathbf{z}^{(k, l)}-\mu_{\mathcal{B}}\right) \odot\left(\mathbf{z}^{(k, l)}-\mu_{\mathcal{B}}\right) \end{aligned}

对净输入的标准归一化会使得其取值集中到0附近,如果使用sigmoid型激活函数时,这个取值区间刚好是接近线性变换的区间,减弱了神经网络的非线性性质。因此,为了使得归一化不对网络的表示能力造成负面影响,可以通过一个附加的缩放和平移变换改变取值区间。

\begin{aligned} \hat{\mathbf{z}}^{(l)} &=\frac{\mathbf{z}^{(l)}-\mu_{\mathcal{B}}}{\sqrt{\sigma_{\mathcal{B}}^{2}+\epsilon}} \odot \gamma+\beta \\ & \triangleq \mathrm{BN}_{\gamma, \beta}\left(\mathbf{z}^{(l)}\right) \end{aligned}

其中和分别代表缩放和平移的参数向量。从最保守的角度考虑,可以通过标准归一化的逆变换来使得归一化后的变量可以被还原为原来的值

批量归一化操作可以看作是一个特殊的神经层,加在每一层非线性激活函数之前,即:

其中因为批量归一化本身具有平移变换,因此仿射变换不再需要偏置参数。

5.2、层归一化

批量归一化是对一个中间层的单个神经元进行归一化操作,因此要求小批量样本的数量不能太小,否则难以计算单个神经元的统计信息。此外,如果一个神经元的净输入的分布在神经网络中是动态变化的,比如循环神经网络,那么就无法应用批量归一化操作。

层归一化(Layer Normalization)是和批量归一化非常类似的方法。和批量归一化不同的是,层归一化是对一个中间层的所有神经元进行归一化

对于一个深层神经网络中,令第层神经的净输入为,其均值和方差为:

其中为第层神经元的数量。

层归一化定义为:

\begin{aligned} \hat{\mathbf{z}}^{(l)} &=\frac{\mathbf{z}^{(l)}-\mu^{(l)}}{\sqrt{\sigma^{{(l)}^2}+\epsilon}} \odot \gamma+\beta \\ & \triangleq \operatorname{LN}_{\gamma, \beta}\left(\mathbf{z}^{(l)}\right) \\ \end{aligned}

其中和分别代表缩放和平移的参数向量,和维数相同。

层归一化和批量归一化整体上是十分类似的,差别在于归一化的方法不同。对于个样本的一个小批量集合,层归一化是对矩阵对每一列进行归一化,而批量归一化是对每一行进行归一化。一般而言,批量归一化是一种更好的选择。当小批量样本数量比较小时,可以选择层归一化

5.3、权重归一化

权重归一化(Weight Normalization)是对神经网络的连接权重进行归一化,通过再参数化(Reparameterization)方法,将连接权重分解为长度和方向两种参数。

假设第层神经元,我们将再参数化为:

其中 表示权重的第行,为神经元数量。新引入的参数为标量,和维数相同。

由于在神经网络中权重经常是共享的,权重数量往往比神经元数量要少,因此权重归一化的开销会比较小。

6、超参数优化

在神经网络中,除了可学习的参数之外,还存在很多超参数。这些超参数对网络性能的影响也很大。不同的机器学习任务需要往往需要不同的超参数。常见的超参数有:

  • 网络结构:包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等;

  • 优化参数:包括优化方法、学习率、小批量的样本数量等;

  • 正则化系数

超参数优化(Hyperparameter Optimization)主要存在两方面的困难:

  • 超参数优化是一个组合优化问题,无法像一般参数那样通过梯度下降方法来优化,也没有一种通用有效的优化方法。

  • 评估一组超参数配置(Configuration)的时间代价非常高,从而导致一些优化方法(比如演化算法)在超参数优化中难以应用。

对于超参数的设置,比较简单的方法有人工搜索、网格搜索和随机搜索

6.1、网格搜索

网格搜索(Grid Search)是一种通过尝试所有超参数的组合来寻址合适一组超参数配置的方法。假设总共有K 个超参数,第个超参数的可以取个值。那么总共的配置组合数量为。如果超参数是连续的,可以将超参数离散化,选择几个“经验”值。比如学习率,我们可以设置:

网格搜索根据这些超参数的不同组合分别训练一个模型,然后测试这些模型在验证集上的性能,选取一组性能最好的配置。

6.2、随机搜索

如果不同超参数对模型性能的影响有很大差异。有些超参数(比如正则化系数)对模型性能的影响有限,而有些超参数(比如学习率)对模型性能影响比较大。在这种情况下,采用网格搜索会在不重要的超参数上进行不必要的尝试。一种在实践中比较有效的改进方法是对超参数进行随机组合,然后选取一个性能最好的配置,这就是随机搜索

随机搜索在实践中更容易实现,一般会比网格搜索更加有效。

网格搜索和随机搜索都没有利用不同超参数组合之间的相关性,即如果模型的超参数组合比较类似,其模型性能也是比较接近的。因此这两种搜索方式一般都比较低效。下面我们介绍两种自适应的超参数优化方法:贝叶斯优化和动态资源分配。

6.3、贝叶斯优化

贝叶斯优化(Bayesian optimization)是一种自适应的超参数搜索方法,根据当前已经试验的超参数组合,来预测下一个可能带来最大收益的组合。一种比较比较常用的贝叶斯优化方法为时序模型优化(Sequential Model-Based Optimization,SMBO)

假设超参数优化的函数服从高斯过程,则为一个正态分布。贝叶斯优化过程是根据已有的组试验结果(为的观测值)来建模高斯过程,并计算的后验分布。

为了使得接近其真实分布,就需要对样本空间进行足够多的采样。但超参数优化中每个样本的生成成本很高,需用尽可能少的样本使得接近于真实分布。因此需要通过定义一个收益函数(acquisition function)来判断一个样本是否能够给建模提供更多的收益。收益越大,其修正的高斯过程会越接近目标函数的真实分布。

收益函数的定义有很多种方式,一个常用的是期望改善(Expected improvement,EI)函数。假设是当前已有样本中的最优值,期望改善函数为:

贝叶斯优化的缺点是高斯过程建模要计算协方差矩阵的逆,时间复杂度是,因此不能很好地处理高维情况。

6.4、动态资源分配

在超参数优化中,每组超参数配置的评估代价比较高。如果我们可以在较早的阶段就可以估计出一组配置的效果会比较差,那么我们就可以中止这组配置的评估,将更多的资源留给其它配置

这个问题可以归结为多臂赌博机问题的一个泛化问题:最优臂问题(Best-Arm Problem),即在给定有限的机会次数下,如何玩这些赌博机并找到收益最大的臂。和多臂赌博机类似,最优臂问题也是在利用和探索之间找到最佳的平衡。

由于目前神经网络的优化方法一般都采取随机梯度下降,因此我们可以通过一组超参数的学习曲线来预估这组超参数配置是否有希望得到比较好的结果。如果一组超参数配置的学习曲线不收敛或者收敛比较差,我们可以应用早期停止(Early-Stopping)策略来中止当前的训练。

动态资源分配的一种有效方法是逐次减半(Successive Halving)方法

假设要尝试组超参数配置,总共可利用的资源预算(摇臂的次数)为,我们可以通过轮逐次减半的方法来选取最优的配置,具体过程如下:

在逐次减半方法中,尝试的超参数配置数量十分关键。如果越大,得到最佳配置的机会也越大,但每组配置分到的资源就越少,这样早期的评估结果可能不准确。反之如果越小,每组超参数配置的评估会越准确,但有可能无法得到最优的配置。因此如何设置是平衡“利用-探索”的一个关键因素

7、网络正则化

正则化(Regularization)是一类通过限制模型复杂度,从而避免过拟合,提高泛化能力的方法,包括引入一些约束规则,增加先验、提前停止等

7.1、和正则化

通过加入和正则化,优化问题可以写为:

其中为损失函数,为训练样本数量,为待学习的神经网络,为其参数,为范数函数,的取值通常为代表和范数,为正则化系数。

带正则化的优化问题等价于下面带约束条件的优化问题:

\begin{array}{c}{\theta^{*}=\underset{\theta}{\arg \min } \frac{1}{N} \sum_{n=1}^{N} \mathcal{L}\left(y^{(n)}, f\left(\mathrm{x}^{(n)} ; \theta\right)\right)} \\ {\text { subject to } \ell_{p}(\theta) \leq 1}\end{array}

下图给出了不同范数约束条件下的最优化问题示例:

红线表示函数,为函数的等高线(简单起见,这里用直线表示)。

可以看出,范数的约束通常会使得最优解位于坐标轴上,从而使得最终的参数为稀疏性向量

一种折中的正则化方法是弹性网络正则化(Elastic Net Regularization),同时加入和正则化:

7.2、权重衰减

权重衰减(Weight Decay)也是一种有效的正则化手段,在每次参数更新时,引入一个衰减系数。

其中为第次更新的梯度,为学习率,为权重衰减系数,一般取值比较小,比如0.0005。在标准的随机梯度下降中,权重衰减正则化和正则化的效果相同

但是,在较为复杂的优化方法(比如Adam)中,权重衰减和正则化并不等价。

7.3、提前停止

提前停止(Early Stop)对于深层神经网络来说是一种简单有效的正则化方法。

由于深层神经网络的拟合能力非常强,因此比较容易在训练集上过拟合。在使用梯度下降法进行优化时,我们可以使用一个和训练集独立的样本集合,称为验证集,并用验证集上的错误来代替期望错误。当验证集上的错误率不再下降,就停止迭代

7.4、丢弃法

当训练一个深层神经网络时,我们可以随机丢弃一部分神经元(同时丢弃其对应的连接边)来避免过拟合,这种方法称为丢弃法(Dropout Method)。每次选择丢弃的神经元是随机的。最简单的方法是设置一个固定的概率。对每一个神经元都一个概率来判定要不要保留。对一个神经层,我们引入一个丢弃函数使得。丢弃函数的定义为:

其中是丢弃掩码(Dropout Mask),通过以概率为的伯努利分布随机生成。在训练时,激活神经元的平均数量为原来的倍。而在测试时,所有的神经元都是可以激活的,这会造成训练和测试时网络的输出不一致。为了缓解这个问题,在测试时需要将神经层的输入乘以,也相当于把不同的神经网络做了平均。丢弃率可通过验证集来选取一个最优的值。一般来讲,对于隐藏层的神经元,其丢弃率时效果最好,这对大部分的网络和任务都比较有效。当时,在训练时有一半的神经元被丢弃,只剩一半的神经元是可以激活的,随机生成的网络结构最具多样性。对于输入层的神经元,其丢弃率通常设为更接近1的数,使得输入变化不会太大。对输入层神经元进行丢弃时,相当于给数据增加噪声,以此来提高网络的鲁棒性

丢弃法一般是针对神经元进行随机丢弃,但是也可以扩展到对神经元之间的连接进行随机丢弃或每一层进行随机丢弃。下图给出了一个网络应用Dropout方法后的示例:

对于丢弃法的有效性有两个角度的解释:

  • 集成学习的解释:每做一次丢弃,相当于从原始的网络中采样得到一个子网络。如果一个神经网络有个神经元,那么总共可以采样出个子网络。每次迭代都相当于训练一个不同的子网络,这些子网络都共享原始网络的参数。那么,最终的网络可以近似看作是集成了指数级个不同网络的组合模型

  • 贝叶斯学习的解释:丢弃法也可以解释为一种贝叶斯学习的近似。用来表示要学习的神经网络,贝叶斯学习是假设参数为随机向量,并且先验分布为,贝叶斯方法的预测为:

其中为第次应用丢弃方法后的网络,其参数为对全部参数的一次采样。

在循环神经网络上应用丢弃法,不能直接对每个时刻的隐状态进行随机丢弃,这样会损害循环网络在时间维度上记忆能力。一种简单的方法是对非时间维度的连接(即非循环连接)进行随机丢失

如图所示,虚线边表示进行随机丢弃,不同的颜色表示不同的丢弃掩码。

7.5、数据增强

深层神经网络一般都需要大量的训练数据才能获得比较理想的效果。在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加数据量,提高模型鲁棒性,避免过拟合。目前,数据增强还主要应用在图像数据上,在文本等其它类型的数据还没有太好的方法

图像数据的增强主要是通过算法对图像进行转变,引入噪声等方法来增加数据的多样性。增强的方法主要有几种:

  • 旋转(Rotation):将图像按顺时针或逆时针方向随机旋转一定角度;
  • 翻转(Flip):将图像沿水平或垂直方法随机翻转一定角度;
  • 缩放(Zoom In/Out):将图像放大或缩小一定比例;
  • 平移(Shift):将图像沿水平或垂直方法平移一定步长;
  • 加噪声(Noise):加入随机噪声。

7.6、标签平滑

在数据增强中,我们可以给样本特征加入随机噪声来避免过拟合。同样,我们也可以给样本的标签引入一定的噪声。假设训练数据集中,有一些样本的标签是被错误标注的,那么最小化这些样本上的损失函数会导致过拟合。一种改善的正则化方法是标签平滑(Label Smoothing),即在输出标签中添加噪声来避免模型过拟合

一个样本的标签一般用onehot向量表示:

这种标签可以看作是硬目标(Hard Targets)。如果使用softmax分类器并使用交叉熵损失函数,最小化损失函数会使得正确类和其它类的权重差异变得很大。根据softmax函数的性质可知,如果要使得某一类的输出概率接近于1,其未归一化的得分需要远大于其它类的得分,可能会导致其权重越来越大,并导致过拟合。此外,如果样本标签是错误的,会导致更严重的过拟合现象。

为了改善这种情况,我们可以引入一个噪声对标签进行平滑,即假设样本以的概率为其它类。平滑后的标签为:

其中为标签数量,这种标签可以看作是软目标(Soft Targets)。标签平滑可以避免模型的输出过拟合到硬目标上,并且通常不会损害其分类能力。

上面的标签平滑方法是给其它个标签相同的概率,没有考虑标签之间的相关性。一种更好的做法是按照类别相关性来赋予其它标签不同的概率。

你可能感兴趣的:(网络优化与正则化)