深度学习实战演练

第三章(1.5)关于tensorflow优化器 optimize

2019-01-13  本文已影响2人  _两只橙_

一、简介

在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是Adam,为什么呢?

下面是 TensorFlow 中的优化器:


这里写图片描述

详情参见:https://www.tensorflow.org/api_guides/python/train

keras中也有SGD,RMSprop,Adagrad,Adadelta,Adam等,详情:https://keras.io/optimizers/

我们可以发现除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢?

二、优化器算法简述

首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD

这三种形式的区别就是取决于我们用多少数据来计算目标函数的梯度,

这样的话自然就涉及到一个trade-off,即参数更新的准确率和运行时间。

1. Batch gradient descent

for i in range(nb_epochs):

  params_grad = evaluate_gradient(loss_function, data, params)

  params = params - learning_rate * params_grad

Batch gradient descent对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。

2. Stochastic gradient descent

for i in range(nb_epochs):

  np.random.shuffle(data)

  for example in data:

    params_grad = evaluate_gradient(loss_function, example, params)

    params = params - learning_rate * params_grad
这里写图片描述

3. Mini-batch gradient descent

for i in range(nb_epochs):

  np.random.shuffle(data)

  for batch in get_batches(data, batch_size=50):

    params_grad = evaluate_gradient(loss_function, batch, params)

    params = params - learning_rate * params_grad
  1. learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。
    (有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点)
  2. 此外,这种方法是对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。
  3. 另外,对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。
    鞍点就是:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。

例如下图这个二维图形,像个马鞍:在x-轴方向往上曲,在y-轴方向往下曲,鞍点就是(0,0)

这里写图片描述

为了应对上述这三点挑战,于是就有了下面这些算法。

4. Momentum

5. Nesterov accelerated gradient

6. Adagrad

这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了SGD的鲁棒性,例如识别Youtube视频里面的猫,训练GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。

7. Adadelta

这个算法是对Adagrad的改进,和 Adagrad相比,就是分母的 G 换成了过去的梯度平方的衰减平均值:

这个分母相当于梯度的均方根root mean squared (RMS),所以可以用RMS简写:

其中 E 的计算公式如下,t 时刻的依赖于前一时刻的平均和当前的梯度:

8. RMSprop

RMSpropGeoff Hinton提出的一种自适应学习率方法。

RMSpropAdadelta 都是为了解决 Adagrad学习率急剧下降问题的,

9. Adam

这个算法是另一种计算每个参数的自适应学习率的方法。

除了像 AdadeltaRMSprop一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:

如果 mtvt被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,

通过计算偏差校正后的mtvt来抵消这些偏差:

10.效果比较

下面看一下几种算法在鞍点和等高线上的表现:

这里写图片描述 这里写图片描述

上面两种情况都可以看出,Adagrad, Adadelta, RMSprop 几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。

由图可知自适应学习率方法即Adagrad, Adadelta, RMSprop, Adam在这种情景下会更合适而且收敛性更好。

三、如何选择

关注我的技术公众号,每天推送优质文章
关注我的音乐公众号,工作之余放松自己
微信扫一扫下方二维码即可关注:


音乐公众号
技术公众号
上一篇 下一篇

猜你喜欢

热点阅读