重新发现梯度下降法--backtracking line search

一直以为梯度下降很简单的,结果最近发现我写的一个梯度下降特别慢,后来终于找到原因:step size的选择很关键,有一种叫backtracking line search的梯度下降法就非常高效,该算法描述见下图:

下面用一个简单的例子来展示,给一个无约束优化问题:

minimize y = (x-3)*(x-3)

下面是python代码,比较两种方法

# -*- coding: cp936 -*-
#optimization test, y = (x-3)^2
from matplotlib.pyplot import figure, hold, plot, show, xlabel, ylabel, legend
def f(x):
        "The function we want to minimize"
        return (x-3)**2
def f_grad(x):
        "gradient of function f"
        return 2*(x-3)
x = 0
y = f(x)
err = 1.0
maxIter = 300
curve = [y]
it = 0
step = 0.1
#下面展示的是我之前用的方法,看上去貌似还挺合理的,但是很慢
while err > 1e-4 and it < maxIter:
    it += 1
    gradient = f_grad(x)
    new_x = x - gradient * step
    new_y = f(new_x)
    new_err = abs(new_y - y)
    if new_y > y: #如果出现divergence的迹象,就减小step size
        step *= 0.8
    err, x, y = new_err, new_x, new_y
    print ‘err:‘, err, ‘, y:‘, y
    curve.append(y)

print ‘iterations: ‘, it
figure(); hold(True); plot(curve, ‘r*-‘)
xlabel(‘iterations‘); ylabel(‘objective function value‘)

#下面展示的是backtracking line search,速度很快
x = 0
y = f(x)
err = 1.0
alpha = 0.25
beta = 0.8
curve2 = [y]
it = 0

while err > 1e-4 and it < maxIter:
    it += 1
    gradient = f_grad(x)
    step = 1.0
    while f(x - step * gradient) > y - alpha * step * gradient**2:
        step *= beta
    x = x - step * gradient
    new_y = f(x)
    err = y - new_y
    y = new_y
    print ‘err:‘, err, ‘, y:‘, y
    curve2.append(y)

print ‘iterations: ‘, it
plot(curve2, ‘bo-‘)
legend([‘gradient descent I used‘, ‘backtracking line search‘])
show()

运行结果如下图:

孰优孰劣,一目了然

我的方法用了25次迭代,而backtracking line search只用了6次。(而且之前我用的方法不一定会收敛的,比如你把第一种方法的stepsize改成1,就会发现,没有收敛到最优解就停止了,这是一个bug,要注意)

这只是个toy example,在我真实使用的优化问题上,两者的效率差别更加显著,估计有10倍的样子

--

文章中截图来自:https://www.youtube.com/watch?v=nvZF-t2ltSM

(是cmu的优化课程)

时间: 2024-12-21 05:36:04

重新发现梯度下降法--backtracking line search的相关文章

回溯线搜索 Backtracking line search

机器学习中很多数值优化算法都会用到线搜索(line search).线搜索的目的是在搜索方向上找到是目标函数\(f(x)\)最小的点.然而,精确找到最小点比较耗时,由于搜索方向本来就是近似,所以用较小的代价找到最小点的近似就可以了. Backtracking Line Search(BLS)就是这么一种线搜索算法. BLS算法的思想是,在搜索方向上,先设置一个初始步长\({\alpha _0}\),如果步长太大,则缩减步长,知道合适为止. 上面的想法要解决两个问题: 1. 如何判断当前步长是否合

梯度下降法和随机梯度下降法的区别

这几天在看<统计学习方法>这本书,发现 梯度下降法 在 感知机 等机器学习算法中有很重要的应用,所以就特别查了些资料.  一.介绍       梯度下降法(gradient descent)是求解无约束最优化问题的一种常用方法,有实现简单的优点.梯度下降法是迭代算法,每一步需要求解目标函数的梯度向量.  二.应用场景      1.给定许多组数据(xi, yi),xi (向量)为输入,yi为输出.设计一个线性函数y=h(x)去拟合这些数据. 2.感知机:感知机(perceptron)为二类分类

Line Search and Quasi-Newton Methods 线性搜索与拟牛顿法

Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(Steepest Descent),可用于寻找函数的局部最小值.梯度下降的思路为,函数值在梯度反方向下降是最快的,只要沿着函数的梯度反方向移动足够小的距离到一个新的点,那么函数值必定是非递增的,如图1所示. 梯度下降思想的数学表述如下: b=a−α∇F(a)⇒f(a)≥f(b)(1)(1)b=a−α∇F

FISTA的由来:从梯度下降法到ISTA &amp; FISTA

前言: FISTA(A fast iterative shrinkage-thresholding algorithm)是一种快速的迭代阈值收缩算法(ISTA).FISTA和ISTA都是基于梯度下降的思想,在迭代过程中进行了更为聪明(smarter)的选择,从而达到更快的迭代速度.理论证明:FISTA和ISTA的迭代收敛速度分别为O(1/k2)和O(1/k). 本篇博文先从解决优化问题的传统方法"梯度下降"开始,然后引入ISTA,再上升为FISTA,最后在到其应用(主要在图像的去模糊方

浅析梯度下降法

上段时间学习caffe,caffe的solver优化方法中涉及到梯度下降法.当时对梯度下降法的概念和原理都很模糊,就专门去学习了下,现在把自己的理解记录下来,一方面加深印象,一方面也方便随时查阅.如果有理解错误的地方,希望看到的予以指正,谢谢. 一.什么是梯度?梯度和方向导数的关系是什么?(简述,需要详细了解的可以自行搜索) 方向导数:对于一个函数f,在其定义域内存在一点k,我们把函数f在点k上任一方向的导数,叫做方向导数. 梯度:经过数学推理可以证明,函数f在k点的梯度方向,等于函数f在k点方

常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)

我们每个人都会在我们的生活或者工作中遇到各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题"在一定成本下,如何使利润最大化"等.最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素(的量),以使某一(或某些)指标达到最优的一些学科的总称.随着学习的深入,博主越来越发现最优化方法的重要性,学习和工作中遇到的大多问题都可以建模成一种最优化模型进行求解,比如我们现在学习的机器学习算法,大部分的机器学习算法的本质都是建立优化模型,通过最优化方法对目标函数(或损失函数)进行优

20-深谋远虑与想到做到——两种梯度下降法

生活中往往有两种人:一种喜欢谋定而后动,比较有全局观:另一种见机行事,根据外界环境不断调整自己的行为.命运给他们的馈赠也是不同的,前者可能大器晚成,后者容易惊喜不断,然而可能左右摇摆.不能说两种处事态度有什么优劣:思虑过多可能错失良机,贸然行动也可能事倍功半,总之"成功"这件事一半靠命运.顾城的诗中说:命运不是风,来回吹,命运是大地,走到哪你都在命运中.而我们能做的是发挥主观能动性,从而改变条件概率(指事件A在另外一个事件B已经发生条件下的发生概率.表示为:P(A|B),读作"

线性回归与梯度下降法

前言 最近在看斯坦福的<机器学习>的公开课,这个课程是2009年的,有点老了,不过讲的还是很好的,廓清了一些我以前关于机器学习懵懂的地方.我的一位老师曾经说过: 什么叫理解?理解就是你能把同一个事情用自己的语言表达出来,并且能让别人听得懂. 本着这样的原则,同时也为了证明自己是”理解”的,于是决定打算在学习<机器学习>公开课的时候,写一些系列文章类巩固学到的东西.机器学习中的很多内容都是和数学推导相关的,而我本人的数学功底并不扎实,所以文章也许会写得比较慢.另外,这个系列的文章大体

用随机梯度下降法(SGD)做线性拟合

1.综述 scikit-learn的线性回归模型都是通过最小化成本函数来计算参数的,通过矩阵乘法和求逆运算来计算参数.当变量很多的时候计算量会非常大,因此我们改用梯度下降法,批量梯度下降法每次迭代都用所有样本,快速收敛但性能不高,随机梯度下降法每次用一个样本调整参数,逐渐逼近,效率高,本节我们来利用随机梯度下降法做拟合. 2.随机梯度下降法 梯度下降就好比从一个凹凸不平的山顶快速下到山脚下,每一步都会根据当前的坡度来找一个能最快下来的方向.随机梯度下降英文是Stochastic gradient