算法概述
- 动量法:梯度转化为速度
- AdaGrad:每个参数反比于历史梯度平方总和的平方根
- RMSProp:AdaGrad的升级(将梯度积累替换为滑动平均)
- Adadelta:AdaGrad的升级(在RMSProp的基础上维护了一个额外的状态变量,用于替换学习率参数)
- Adam:动量 + RMSProp + 偏差修正
算法可视化
深度学习各种算法可视化1.gif深度学习各种算法可视化2.gif
动量算法(Momentum)
- 使用意义(梯度下降存在问题)
在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度方向更新自变量。然而,自变量的迭代方向仅仅取决于自变量当前位置可能会带来一定的问题
梯度下降的问题
图片.png图片.png
- 算法介绍
动量法几乎总是比标准的梯度下降法速度更快,算法的主要思想是计算梯度的指数加权平均,然后使用这个梯度来更新权重(上图中,你希望纵轴可以学习慢一点,不希望出现这些震荡,横轴上,你希望加快学习速度)
13228477-524615b4bedb2017.png
- 参数选择(一般)
上述公式说明了带有动量的梯度下降法是如何更新参数的,不再单纯的使用梯度,而是使用梯度的指数加权平均,式中为学习率,为动量参数,最常用的取值为,意味着计算前次迭代的梯度的平均值,而且效果很好,是非常稳健的参数值
AdaGrad 算法(每个变量有自己的节奏)
- 算法介绍
AdaGrad算法独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根,学习率单调递减,训练后期学习率非常小
- 算法特点(适用于凸函数,但不适用于非凸函数)
如果目标函数有关自变量中某个元素的偏导数一直都较大,那么该元素的学习率()将下降较快(在最后更新参数向量时除以一个很大的数字,所以会降低这个维度方向上的训练进度,这个方向的梯度可能是震荡的,希望震荡小一点);反之,某个元素的偏导数一直较小,则该元素的学习率下降较慢(更新参数向量时除以一个很小的数字,从而加速了在小梯度维度上的学习速度)
上图可知,在方向上的梯度要大于在方向上的梯度,AdaGrad 算法使得的学习率下降较快,在方向上的变化相对平缓
- 算法缺陷
由于一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直降低导致 有效学习率过早和过量的减小,可能较难找到一个有用的解
不适用于非凸函数,当到达一个局部极值点时,会困在这里,使得训练过程无法再进行下去
RMSProp 算法
- 算法介绍
RMSProp 算法是针对 Adagrad 算法的缺陷进行修改,改变梯度积累为指数加权移动平均
Adagrad 算法旨在应用于凸问题[1]时快速收敛
RMSProp 算法使用指数衰减平均以丢弃遥远过去的历史
- 算法特点
RMSProp 的状态变量可以看作是最近 个时间步的小批量随机梯度平方项的加权平均,自变量每个元素的学习率在迭代过程中不再一直降低(如此一来,一直具有较大梯度的元素的学习率依然下降较快,但不会无止境的下降,致使没办法得到局部最优解)
Adadelta 算法
- 算法介绍
Adadelta 算法也同RMSProp 算法一样,使用了按元素平方的指数加权移动平均变量
但除此之外,Adadelta 算法还维护一个额外的状态变量,其同样在初始化时被初始为,我们使用它来计算自变量的变化量
使用来记录自变量变化量按元素平方的指数加权移动平均,用于下次计算
最后接着更新自变量
- 算法特点
可以看出,Adadelta 算法和RMSProp 算法的主要差别在于使用了来代替了超参数
Adam 算法
- 算法介绍
在 Adam 算法中,动量直接并入了梯度一阶矩(指数加权)的估计,将动量加入RMSProp最直观的的方法是将动量应用于缩放后的梯度。其次, Adam 算法包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计,因此在训练初期没有很高的偏置。Adam 算法通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改
- 算法特点
Adam 算法可以看作是 动量法(Momentum) 和 RMSProp 算法的结合,使用了动量变量
和RMSProp中小批量随机梯度逐元素平方的指数加权移动平均变量
在时间步将它们初始化为,另外还加入了偏差修正
- 参数选取
学习率建议选取
给定超参数建议选取
给定超参数建议选取
-
凸、非凸问题:凸问题指的是顺着梯度方向走到底一定是最优解(多数为传统机器学习问题);非凸问题指的是顺着梯度方向走到底只能保证是局部最优解而非全局最优解(大部分深度学习问题都是非凸的) ↩
网友评论