摘自《动手学习深度学习》
这里的优化指最小化基于训练数据集的损失函数,目标在于降低训练误差(DL还需关注泛化误差,需要考虑过拟合,这里暂不讨论)
目录
随机梯度下降(stochastic gradient descent,SGD)
意义
深度学习中大多数目标函数都不存在解析解,需要使用基于数值方法的优化算法找到数值解(近似解)。一般会通过优化算法有限次迭代模型参数来尽可能降低损失函数的值
优化的挑战
1、局部极小值
当目标函数的梯度为0时,可能只是局部极小值而非全局
2、鞍点
梯度为0还可能出现在鞍点
梯度下降
给定连续可导函数 和 绝对值足够小的数ϵ,有如下近似:
找到一个常数 η>0,使 足够小,则可将ϵ替换为
,得到
若导数 ,则
,所以
所以若通过下式迭代x:,,f(x)的值可能会降低
梯度下降法:选定一个初始值x 和 η>0,用上式迭代直到某停止条件( 足够小或迭代次数达上限)
正数η通常叫学习率,是需要人为设定的超参数
η 太小,导致x更新缓慢从而需要更多的迭代才能得到较好的解
η 太大,可能会过大从而使前面提到的一阶泰勒展开公式不再成立
多维梯度下降
目标函数 ,输入是d维向量:
,f(x) 关于x的梯度由d个偏导数组成:
每个偏导数 代表f 在向量x的元素xi上的变化率。
f 沿单位向量 u(∥u∥=1) 的变化率(方向导数):
因为: ,当 θ=π 时,方向导数取到最小值,因此多维度下的梯度下降算法迭代:
随机梯度下降(stochastic gradient descent,SGD)
通常损失函数是每个样本损失函数的平均:,梯度为:
当样本容量很大时,开销随n线性增长
为降低开销,随机梯度下降每次随机均匀采样一个样本sample_i,并计算梯度来迭代参数: (注意这里的x 是f的参数,不是输入样本),使得计算开销从梯度下降的O(n)降到了常数O(1)
随机梯度是对梯度
的无偏估计:
小批量随机梯度下降
每次迭代样本数介于梯度下降和随机梯度下降之间,随机均匀采样多个样本来组成一个小批量,然后使用这个小批量来计算梯度
目标函数 ,迭代时间步(timestep)初始化为0,该时间步的参数为
,通常随机初始化。在每一步t>0,随机均匀采样小批量样板,其下标构成
,可重复采样或不重复采样。
计算时间步t ,样本 的目标函数在参数
处的梯度
:
|B| 表示小批量的样本数,是超参数
小批量随机梯度gt也是对梯度 的无偏估计
给定学习率ηt(>0),小批量随机梯度下降对自变量(参数)的迭代:
学习率衰减
(小批量)随机梯度下降的学习率可以在迭代过程中自我衰减 ,a=−1或者−0.5;或
,α=0.95
- 批量较小时,每次迭代中使用的样本少,这会导致并行处理和内存使用效率变低
- 当批量较大时,每个小批量梯度里可能含有更多的冗余信息。为了得到较好的解,批量较大时比批量较小时需要计算的样本数目可能更多
动量法
梯度下降朝目标函数在当前位置下降最快的方向迭代,可能带来的问题;
设输入为 :,目标函数为:
,基于此函数梯度下降,学习率为 0.4,此时参数迭代的轨迹:
可见目标函数在竖直方向 比在水平方向上
斜率绝对值更大(等高线更密),因此给定学习率,梯度下降迭代时会使自变量在
方向比在
方向移动幅度更大
-
较小的学习率,避免自变量在竖直方向上越过目标函数最优解,但造成自变量在水平方向上朝最优解移动变慢。
-
较大的学习率,自变量在竖直方向不断越过最优解并逐渐发散
动量法的提出正是为了解决此问题
设时间步 t 的自变量为 ,学习率为
时间步0,创建速度变量 ,元素初始化为0
时间步 ,动量法每次迭代:
动量超参数 满足
,当
时,动量法等价于小批量梯度下降。
可见动量法在竖直方向上的移动更加平滑,且在水平方向上更快逼近最优解
指数加权移动平均
给定超参数 ,令当前时间步t的变量
是上一时间步 t - 1的变量
和当前时间步的另一变量
的线性组合:
对 展开,
令 ,则
,因为:
所以当 时有:
,如
若将 视作较小的数,则可近似忽略所有含
和比
更高阶的系数的项。
如当 时,
实际中常将 看作是对最近
个时间步的
值的加权平均。如当
时,
可看做 对最近20个时间步的
值的加权平均。当
时,
可看做对最近10个时间步的
值的加权平均,离当前时间步t 越近的
值获得的权重越大(越接近1)
理解动量法
对动量法的速度变量做变形
速度变量 实际上对序列
做了指数加权移动平均。
相比于小批量随机梯度下降,动量法在每个时间步的自变量更新量近似于将前者对应的最近个时间步的更新量做了指数加权移动平均后再除以
。所以动量法中自变量在各个方向上的移动幅度不仅取决于当前梯度,还取决于过去的各个梯度在各个方向上是否一致。这样就可以使用较大的学习率使自变量向最优解更快移动
AdaGrad算法
前面的优化算法中,同一时间步损失函数的每个自变量都采用相同的学习率,例如自变量 :
当自变量梯度相差较大时,相同学习率可能导致梯度小的自变量学习较慢、或梯度大的自变量发散;
动量法依靠指数加权移动平均使得自变量更新的方向趋向一致
AdaGrad 则根据自变量每个元素的梯度值大小调整各自的学习率
算法
使用一个小批量随机梯度按元素平方的累加变量
,初始化时间步0的
的元素为0。
时间步t,将 按元素平方后累加到
,⊙是按元素相乘
自变量x的每个元素学习率按照元素调整为:
η是学习率,ϵ是为了维持数值稳定性而添加的常数,如10^−6;按元素运算使得x的每个元素拥有自己的学习率。
- 因为
出现在分母,所以学习率会一直下降,偏导数大的元素下降的快,偏导数小的反之。
- 当学习率在迭代早期降得较快且当前解依然不佳时,后期由于学习率过小,可能较难找到一个有用的解
RMSProp算法
AdaGrad算法因为学习率分母中 一直累加,所以在迭代过程中学习率一直降低。RMSProp 对此做了点修改
计算 时,RMSProp使用
自变量元素迭代计算同AdaGrad:
为学习率,
是维持数值稳定性而添加的常数如
因为RMSProp算法的状态变量 是对平方项
的指数加权移动平均,可以看作最近
个时间步的小批量随机梯度平方项的加权平均。所以自变量每个元素的学习率在迭代过程中就不再一直降低(或不变)
AdaDelta算法
AdaDelta 也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进,但没有学习率这一超参数
也使用了小批量随机梯度按元素平方的指数加权移动平均变量
,在时间步0的元素初始化为0。
给定超参数0≤ρ<1(对应RMSProp算法中的γ),在时间步t>0,同RMSProp算法一样计算
维护一个额外的状态变量 ,其元素在时间步0初始化为0。
使用 来计算自变量的变化量
ϵ是为了维持数值稳定性而添加的常数,如10^−5
然后更新自变量:
使用 来记录自变量变化量
按元素平方的指数加权移动平均
可见,如不考虑ϵ的影响,AdaDelta算法与RMSProp算法的不同之处在于使用与相互影响的
来替代超参数η
Adam算法
在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均
使用了动量变量 和指数加权移动平均变量
,并在时间步0将它们中每个元素初始化为0。
给定超参数(建议设为0.9),时间步
的动量变量
即小批量随机梯度
的指数加权移动平均:
同RMSProp算法,给定超参数(建议设为0.999), 将小批量随机梯度按元素平方后的项
做指数加权移动平均得到
:
由于将和
中的元素都初始化为0, 在时间步
我们得到
将过去各时间步小批量随机梯度的权值相加,得到
当 较小时,过去各时间步小批量随机梯度权值之和
会较小。例如,当
时,
。为了消除这样的影响,对于任意时间步
,可将
再除以
,从而使过去各时间步小批量随机梯度权值之和为1。这也叫偏差修正。
对变量 和
均作偏差修正:
然后使用以上偏差修正后的变量和
,将模型参数中每个元素的学习率通过按元素运算重新调整:
其中 是学习率,
是为了维持数值稳定性而添加的常数,如
。
和AdaGrad算法、RMSProp算法以及AdaDelta算法一样,目标函数自变量中每个元素都分别拥有自己的学习率。
最后,使用迭代自变量: