- 6
- 0
- 约1.75万字
- 约 10页
- 2019-04-06 发布于天津
- 举报
梯度下降优化算法综述
译者:一只鸟的天空
该文翻译自An overview of gradient descent optimization algorithms。
总所周知,梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方
法。几乎当前每一个先进的(state-of-the-art)机器学习库或者深度学习库都会包括梯度下降算法的不同变种实
现。但是,它们就像一个黑盒优化器,很难得到它们优缺点的实际解释。
这篇文章旨在提供梯度下降算法中的不同变种的介绍,帮助使用者根据具体需要进行使用。
这篇文章首先介绍梯度下降算法的三种框架,然后介绍它们所存在的问题与挑战,接着介绍一些如何进行改进
来解决这些问题,随后,介绍如何在并行环境中或者分布式环境中使用梯度下降算法。最后,指出一些有利于
梯度下降的策略。
梯度下降算法是通过沿着目标函数J(θ)参数θ ∈ R的梯度(一阶导数)相反方向−∇ J(θ)来不断更新模型参数
θ
来到达目标函数的极小值点(收敛),更新步长为η。详细的介绍参见:梯度下降。
三种梯度下降优化框架
有三种梯度下降算法框架,它们不同之处在于每次学习(更新模型参数)使用的样本个数,每次更新使用不同的
样本会导致每次学习的准确性和学习时间不同。
全量梯度下降(Batch gradient descent)
每次使用全量的训练集样本来更新模型参数,即:
θ = θ − η ⋅ ∇ J(θ)
θ
其代码如下:
for i in range(epochs):
params_grad = evaluate_gradient(loss_function,data,params)
params = params - learning_rate * params_grad
epochs 是用户输入的最大迭代次数。通过上诉代码可以看出,每次使用全部训练集样本计算损失函数
loss_function的梯度params_grad,然后使用学习速率learning_rate朝着梯度相反方向去更新模型的每个参数
params。一般各现有的一些机器学习库都提供了梯度计算api。如果想自己亲手写代码计算,那么需要在程序
调试过程中验证梯度计算是否正确,具体验证方法可以参见:这里。
全量梯度下降每次学习都使用整个训练集,因此其优点在于每次更新都会朝着正确的方向进行,最后能够保证
收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点),但是其缺点在于每次学习时间
过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新。
随机梯度下降(Stochastic gradient descent)
随机梯度下降算法每次从训练集中随机选择一个样本来进行学习,即:
θ = θ − η ⋅ ∇ J(θ; x ; y )
θ i i
批量梯度下降算法每次都会使用全部训练样本,因此这些计算是冗余的,因为每次都使用完全相同的样本集。
而随机梯度下降算法每次只随机选择一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行
在线更新。
其代码如下:
for i in range(epochs):
np.random.shuffle(data)
for example in data:
params_grad = evaluate_gradient(loss_function,example,params)
params = params - learning_rate * params_grad
随机梯度下降最大的缺点在于每次更新可能并不会按照正确的方向进行,因此可以带来优化波动(扰动),如下
图:
图1 SGD扰动来源
不过从另一个方面来看,随机梯度下降所带来的波动有个好处就是,对于类似盆地区域(即很多局部极小值
点)那么这个波动的特点可能会使得优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样
便可能对于非凸函数,最终收敛于一个较
原创力文档

文档评论(0)