TEL::0898-88889999

网站公告:

诚信为本:市场永远在变,诚信永远不变。

盛煌注册

  • 主营项目标题六
  • 主营项目标题五
  • 主营项目标题四
  • 主营项目标题三
  • 主营项目标题二
  • 主营项目标题一

盛煌动态

当前位置: 首页 > 盛煌动态

深度学习TensorFlow优化器的选择_1

发布时间:2024-04-22 13:58:32 点击量:

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

下面是 TensorFlow 中的优化器,
https://www.tensorflow.org/api_guides/python/train
这里写图片描述

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

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

在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下:
https://arxiv.org/pdf/1609.04747.pdf

本文将梳理:

  • 每个算法的梯度更新规则和缺点
  • 为了应对这个不足而提出的下一个算法
  • 超参数的一般设定值
  • 几种算法的效果比较
  • 选择哪种算法

首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD,
这三种形式的区别就是取决于我们用多少数据来计算目标函数的梯度,
这样的话自然就涉及到一个 trade-off,即参数更新的准确率和运行时间。

   
   
   
  • 1
  • 2

梯度更新规则:
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:

θ=θ−α∇θJ(θ)” role=”presentation” style=”text-align: center; position: relative;”>θ=θ?α?θJ(θ)θ=θ?α?θJ(θ)

缺点:
由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型

我们会事先定义一个迭代次数 epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning rate 决定了我们每一步迈多大。

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

   
   
   
  • 1
  • 2

梯度更新规则:
和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新, 对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余, 而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。

缺点:
SGD 因为更新比较频繁,会造成 cost function 有严重的震荡,此外SGD对噪声比较敏感。

这里写图片描述

BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。

当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。

   
   
   
  • 1
  • 2

梯度更新规则:
MBGD 每一次利用一小批样本,即 n 个样本进行计算, 这样它可以降低参数更新时的方差,收敛更稳定, 另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的Batch。

超参数设定值:
n 一般取值在 50~200

缺点:
Mini-batch gradient descent 不能保证很好的收敛性,

①learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。

②有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。此外,这种方法是对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新

③另外,对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。

鞍点:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。
例如这个二维图形,像个马鞍:在x-轴方向往上曲,在y-轴方向往下曲,鞍点就是(0,0)

这里写图片描述

为了应对上面的三点挑战就有了下面这些算法。

[应对挑战 1]

   
   
   
  • 1
  • 2

SGD 在 ravines” role=”presentation” style=”position: relative;”>ravinesravines就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:

这里写图片描述

梯度更新规则:
Momentum 通过加入 γvt−1” role=”presentation” style=”position: relative;”>γvt?1

平台注册入口