在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢? 下面是 TensorFlow 中的优化器, 在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: 我们可以发现除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下: 本文将梳理:
优化器算法简述?首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD,
梯度更新规则:
缺点: 我们会事先定义一个迭代次数 epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning rate 决定了我们每一步迈多大。 Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
梯度更新规则: 缺点: BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。 当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。
梯度更新规则: 超参数设定值: 缺点: ①learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。 ②有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。此外,这种方法是对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。 ③另外,对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。 鞍点:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。 为了应对上面的三点挑战就有了下面这些算法。 [应对挑战 1]
SGD 在 的情况下容易被困住, 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值: 梯度更新规则: 当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。 加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
超参数设定值: 缺点:
梯度更新规则: 超参数设定值: 仍然取值 0.9 左右。
效果比较: 蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。 NAG 可以使 RNN 在很多任务上有更好的表现。 目前为止,我们可以做到,在更新梯度时顺应 loss function 的梯度来调整速度,并且对 SGD 进行加速。 我们还希望可以根据参数的重要性而对不同的参数进行不同程度的更新。 [应对挑战 2]
这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。 梯度更新规则:
其中为:t 时刻参数 的梯度;是个对角矩阵, (i,i) 元素就是 t 时刻参数 的梯度的平方和。 Adagrad 的优点是减少了学习率的手动调节 超参数设定值: 缺点:
这个算法是对 Adagrad 的改进, 和 Adagrad 相比,就是分母的换成了过去的梯度平方的衰减平均值。
这个分母相当于梯度的均方根 root mean squared (RMS) ,所以可以用 RMS 简写:
其中 E 的计算公式如下,t 时刻的依赖于前一时刻的平均和当前的梯度:
梯度更新规则: 此外,还将学习率 换成了 ,这样的话,我们甚至都不需要提前设定学习率了: 超参数设定值:
RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。 RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的。 梯度更新规则:
超参数设定值:
这个算法是另一种计算每个参数的自适应学习率的方法。目前在DL领域,是最常见的优化器。 除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 的指数衰减平均值: 如果 和 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正, 梯度更新规则:
超参数设定值: 实践表明,Adam 比其他适应性学习方法效果要好。 效果比较?下面看一下几种算法在鞍点和等高线上的表现: 由图可知自适应学习率方法即 Adagrad, Adadelta, RMSprop, Adam 在这种情景下会更合适而且收敛性更好。 如何选择?如果数据是稀疏的,就用自适应方法,即 Adagrad, Adadelta, RMSprop, Adam。 RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。 Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum。 随着梯度变的稀疏,Adam 比 RMSprop 效果会好。 整体来讲,Adam 是最好的选择。 很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。 如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。 参考:http:///optimizing-gradient-descent/index.html#fn:24 |
|
来自: 昵称59761374 > 《待分类》