关闭

梯度下降算法概述

标签: 深度学习
468人阅读 评论(0) 收藏 举报
分类:

梯度下降算法概述

本文是翻译的 An overview of gradient descent optimization algorithms,翻译时并不一定遵照原文的表述,主要是以将问题表达清楚为主要目的。


在常见的神经网络优化算法中,梯度下降是最受欢迎的一种。同时,每一个 state-of-art 的深度学习库都包含了各种算法梯度下降的实现(如:lasagne,caffe和keras)。但是,这些算法经常是作为一个黑箱子优化器来使用,而对于它们的优缺点的解释却提及不多。

本文主要是提供不同优化梯度下降算法表现的直观解释,来帮助你使用它们。我们首先看看各个梯度下降算法的不同变形,然后简略的总结在训练过程中的挑战。然后我们介绍最常见的优化算法,阐述在解决这些挑战时它们的出发点和在更新时如何求导的问题。我们也将简要的介绍在并行与分布式中优化梯度下降的算法和结构。最后,我们考虑有助于优化梯度下降的条件策略。

梯度下降是一种最小化目标函数J(θ)的方法,其中θRd是模型的参数。梯度下降通过目标函数对参数的梯度方向的负方向更新参数。学习率η的大小就决定了我们走向局部最小值的步长。我们按照由目标函数生成的表面的斜坡的方向直到我们到达谷底。如果你对梯度下降不熟悉,你可以找到一个优化神经网络的入门教程

梯度下降的变形
依据我们所需计算的数据的梯度,梯度下降有三种不同变形。根据数据量,我们要在参数的正确率和计算时间上做一个协调。

批量梯度下降Batch gradient descent
批量梯度下降(简称BGD)计算的是损失函数对参数θ在整个训练数据集上的导数。

θ=θηθJ(θ)

因为在每一次更新中,需要在整个数据集上计算梯度,BGD非常慢而且在内存不够用时,它很难训练。BGD也不允许在线更新。

BGD的代码可能类似这样:

for i in range(nb_epochs):
  params_grad = evaluate_gradient(loss_function, data, params)
  params = params - learning_rate * params_grad

对于一个预定义的epoch,我们先计算损失函数对参数向量params在整个数据集上的梯度向量weights_grad。优秀的深度学习库都提供了高效的自动求导。如果你自己去计算导数,那么梯度检验是个不错的选择(这儿有些好的建议)

然后我们使用梯度更新参数,当然还有学习率,这决定了我们更新的力度。BGD保证了对于凸函数的全局最小和对于非凸的局部最小。

随机梯度下降 Stochastic gradient descent

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:154169次
    • 积分:2267
    • 等级:
    • 排名:第17185名
    • 原创:69篇
    • 转载:10篇
    • 译文:8篇
    • 评论:54条
    文章分类
    最新评论