深度学习中的优化算法

在一个深度学习问题中,通常会预先定义一个损失函数。有了损失函数以后,我们就可以使用优化算法试图将其最小化。在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function)

深度学习的目标在于降低泛化误差。为了降低泛化误差,除了使用优化算法降低训练误差以外,还需要注意应对过拟合

深度学习中绝大多数目标函数都很复杂。因此,很多优化问题并不存在解析解,而需要使用基于数值方法的优化算法找到近似解,即数值解。为了求得最小化目标函数的数值解,我们将通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。

1.梯度下降和随机梯度下降

1)梯度下降

目标函数的输入为向量,输出为标量。假设目标函数f:Rd→R的输入是一个d维向量x=[x1,x2,…,xd]⊤。目标函数f(x)有关x的梯度是一个由d个偏导数组成的向量:

梯度中每个偏导数元素∂f(x)/∂xi代表着f在x有关输入xi的变化率。通过梯度下降算法来不断降低目标函数f的值: 

2)随机梯度下降

在深度学习里,目标函数通常是训练数据集中有关各个样本的损失函数的平均。设fi(x)是有关索引为i的训练数据样本的损失函数,n是训练数据样本数,x是模型的参数向量,那么目标函数定义为:

目标函数在x处的梯度计算为:

 

如果使用梯度下降,每次自变量迭代的计算开销为O(n),它随着n线性增长。因此,当训练数据样本数很大时,梯度下降每次迭代的计算开销很高

随机梯度下降(stochastic gradient descent,SGD)减少每次迭代的计算开销。在随机梯度下降的每次迭代中,我们随机均匀采样的一个样本索引i∈{1,…,n},并计算梯度∇fi(x) 来迭代x:

可以看到每次迭代的计算开销从梯度下降的O(n)降到了常数O(1)。值得强调的是,随机梯度∇fi(x)是对梯度∇f(x)的无偏估计

平均来说,随机梯度是对梯度的一个良好的估计,随机梯度下降中自变量的迭代轨迹相对于梯度下降中的来说更为曲折,这是由于实验所添加的噪声使模拟的随机梯度的准确度下降。在实际中,这些噪声通常指训练数据集中的无意义的干扰。

小结:

①使用适当的学习率,沿着梯度反方向更新自变量可能降低目标函数值。梯度下降重复这一更新过程直到得到满足要求的解。

②学习率过大或过小都有问题。一个合适的学习率通常是需要通过多次实验找到的

③当训练数据集的样本较多时,梯度下降每次迭代的计算开销较大,因而随机梯度下降通常更受青睐。

2.小批量随机梯度下降

在每一次迭代中,梯度下降使用整个训练数据集计算梯度,因此它有时也被称为批量梯度下降(batch gradient descent)

随机梯度下降在每次迭代中只随机采样一个样本来计算梯度

在每轮迭代中随机均匀采样多个样本来组成一个小批量,然后使用这个小批量来计算梯度——小批量随机梯度下降。

设目标函数f(x):Rd→Rf。在迭代开始前的时间步设为0。该时间步的自变量记为x0∈Rd,通常由随机初始化得到。在接下来的每一个时间步t>0中,小批量随机梯度下降随机均匀采样一个由训练数据样本索引组成的小批量Bt。我们可以通过重复采样(sampling with replacement)或者不重复采样(sampling without replacement)得到一个小批量中的各个样本。

计算时间步t的小批量Bt上目标函数位于xt−1处的梯度gt:

(这里∣B∣代表批量大小,即小批量中样本的个数,是一个超参数

小批量随机梯度下降对自变量的迭代如下:

 基于随机采样得到的梯度的方差在迭代过程中无法减小,因此在实际中,(小批量)随机梯度下降的学习率可以在迭代过程中自我衰减。而梯度下降在迭代过程中一直使用目标函数的真实梯度,无须自我衰减学习率。

小批量随机梯度下降中每次迭代的计算开销为O(∣B∣)

批量大小为1时,该算法即为随机梯度下降

批量大小等于训练数据样本数时,该算法即为梯度下降

批量较小时,每次迭代中使用的样本少,这会导致并行处理和内存使用效率变低。这使得在计算同样数目样本的情况下比使用更大批量时所花时间更多

批量较大时,每个小批量梯度里可能含有更多的冗余信息。为了得到较好的解,批量较大时比批量较小时需要计算的样本数目可能更多,例如增大迭代周期数

实现:在PyTorch里可以通过创建optimizer实例调用优化算法

小结:

小批量随机梯度每次随机均匀采样一个小批量训练样本来计算梯度。

②在实际中,(小批量)随机梯度下降的学习率可以在迭代过程中自我衰减

③通常,小批量随机梯度在每个迭代周期的耗时介于梯度下降随机梯度下降的耗时之间

 

3.动量法

目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向仅仅取决于自变量当前位置,这可能会带来一些问题。

1)梯度下降的问题

同一位置上,目标函数在竖直方向(x2轴方向)比在水平方向(x1轴方向)的斜率的绝对值更大。因此,给定学习率,梯度下降迭代自变量时会使自变量在竖直方向比在水平方向移动幅度更大。

那么,我们需要一个较小的学习率从而避免自变量在竖直方向上越过目标函数最优解。然而,这会造成自变量在水平方向上朝最优解移动变慢

2)动量法

动量法的提出是为了解决梯度下降的上述问题。

设时间步t的自变量为xt,学习率为ηt,动量法对每次迭代的步骤做如下修改:

动量超参数γ满足0≤γ<1。当γ=0时,动量法等价于小批量随机梯度下降

指数加权移动平均(数学推导省略)

在实际中,我们常常将yt看作是对最近1/(1−γ)个时间步的xt值的加权平均。

相比于小批量随机梯度下降,动量法每个时间步的自变量更新量近似于将最近1/(1−γ)个时间步的普通更新量(即学习率乘以梯度)做了指数加权移动平均后再除以1−γ。所以,在动量法中,自变量在各个方向上的移动幅度不仅取决当前梯度,还取决于过去的各个梯度在各个方向上是否一致。这样,我们就可以使用较大的学习率,从而使自变量向最优解更快移动。

简洁实现——在PyTorch中,通过参数momentum指定动量超参数即可使用动量法

小结:

动量法使用了指数加权移动平均的思想。它将过去时间步的梯度做了加权平均,且权重按时间步指数衰减。

动量法使得相邻时间步的自变量更新在方向上更加一致

 

4.AdaGrad算法

之前优化算法,目标函数自变量的每一个元素相同时间步使用同一个学习率来自我迭代

动量法里我们看到当x1和x2的梯度值有较大差别时,需要选择足够小的学习率使得自变量在梯度值较大的维度上不发散。但这样会导致自变量在梯度值较小的维度上迭代过慢。动量法依赖指数加权移动平均使得自变量的更新方向更加一致,从而降低发散的可能

AdaGrad算法,它根据自变量在每个维度的梯度值的大小调整各个维度上的学习率从而避免统一的学习率难以适应所有维度的问题

1)算法

⊙是按元素相乘

开方、除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率

2)特点

需要强调的是,小批量随机梯度按元素平方的累加变量st出现在学习率的分母项中。

如果目标函数有关自变量中某个元素的偏导数一直都较大,那么该元素的学习率将下降较快;反之,如果目标函数有关自变量中某个元素的偏导数一直都较小,那么该元素的学习率将下降较慢。然而,由于st一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。所以,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解

简洁实现——在PyTorch中,通过名称为Adagrad的优化器方法

 

小结:

①AdaGrad算法在迭代过程不断调整学习率,并让目标函数自变量每个元素分别拥有自己的学习率

②使用AdaGrad算法时,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)

5.RMSProp算法

AdaGrad算法中提到,因为调整学习率时分母上的变量st一直在累加按元素平方的小批量随机梯度,所以目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。因此,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法迭代后期由于学习率过小,可能较难找到一个有用的解

——为了解决这一问题,RMSProp算法对AdaGrad算法做了一点小小的修改

1)算法

不同于AdaGrad算法里状态变量st是截至时间步t所有小批量随机梯度gt按元素平方和,RMSProp算法将这些梯度按元素平方做指数加权移动平均

因为RMSProp算法的状态变量st是对平方项gt⊙gt的指数加权移动平均,所以可以看作是最近1/(1−γ)个时间步的小批量随机梯度平方项的加权平均。如此一来,自变量每个元素的学习率在迭代过程中就不再一直降低(或不变)

2)简洁实现

——在PyTorch中,通过名称为RMSprop的优化器方法(超参数γ通过alpha指定)

小结:RMSProp算法和AdaGrad算法的不同在于,RMSProp算法使用了小批量随机梯度按元素平方的指数加权移动平均来调整学习率

 

6.AdaDelta算法

AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进

有趣的是,AdaDelta算法没有学习率这一超参数

1)算法

AdaDelta算法也像RMSProp算法一样,使用了小批量随机梯度gt按元素平方的指数加权移动平均变量st。

与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量Δxt,其元素同样在时间步0时被初始化为0。

深度学习中的优化算法_第1张图片 

AdaDelta算法跟RMSProp算法的不同之处在于使用√Δxt−1替代学习率η

2. 简洁实现

——在PyTorch中,通过名称为Adadelta的优化器方法(超参数γ通过rho指定)

小结:AdaDelta算法没有学习率超参数,它通过使用有关自变量更新量平方的指数加权移动平均的项替代RMSProp算法中的学习率

 

7.Adam算法

Adam算法RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均 

Adam算法可以看做是RMSProp算法与动量法的结合

1)算法

Adam算法使用了动量变量vt和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量st,并在时间步0将它们中每个元素初始化为0。

需要注意的是,当t较小时,过去各时间步小批量随机梯度权值之和会较小。为了消除这样的影响,对于任意时间步t,我们可以将vt再除以1−βt1 ,从而使过去各时间步小批量随机梯度权值之和为1。这也叫作偏差修正。 

和AdaGrad算法、RMSProp算法以及AdaDelta算法一样,目标函数自变量中每个元素都分别拥有自己的学习率,最后,使用g′迭代自变量:

 

2)简洁实现

——在PyTorch中,通过名称为Adam的优化器方法

小结:

Adam算法在RMSProp算法的基础上小批量随机梯度也做了指数加权移动平均

Adam算法使用了偏差修正

 

你可能感兴趣的:(Deep,Learning,深度学习,人工智能)