理解L-BFGS算法

Mar 30, 2015   #数值优化  #无约束最优化

L-BFGS(Limited-Memory BFGS)是BFGS算法在受限内存时的一种近似算法,而BFGS是数学优化中一种无约束最优化算法。本文的目的是介绍L-BFGS算法的具体原理,在此过程中附加上相关背景知识,力求简单易懂。参考文献在文后给出。

无约束优化

无约束最优化的基本形式是,给定一个多元函数f(x)f(x),求出该函数的最小值点x∗x∗。形式化地来说,即:

x∗=argminxf(x)x∗=arg⁡minxf(x)

一般称f(x)f(x)为目标函数,x∗x∗为最优解。在本文中,假定目标函数都是凸函数。由凸函数的性质,可知其局部最优解必定为全局最优解,因此保证接下来介绍的算法必定收敛到局部最优解附近。

牛顿法

在使用计算机求解一个优化问题时,通常使用迭代方法。即我们的算法不断迭代,产生一个序列x1,x2…xkx1,x2…xk,若该序列能收敛到x∗x∗,则算法是有效的。

由于目标函数(假设为凸函数)存在最小值,若上述序列为递减序列,则最后会收敛到x∗x∗(不同的算法,收敛速度有差异)。

假设现在已经有点xnxn,如何构造xn+1xn+1,使得f(xn)

牛顿法的基本思想是,在离点xnxn足够近的距离,f(x)f(x)可以近似看作一个二次函数。即,在xnxn附近使用f(x)f(x)的二次近似来寻找比xnxn处函数值更小的点。

由泰勒公式,将f(x)f(x)在固定点xnxn处展开,则有:

f(xn+Δx)≈f(xn)+ΔxT∇f(xn)+12ΔxT(∇2f(xn))Δxf(xn+Δx)≈f(xn)+ΔxT∇f(xn)+12ΔxT(∇2f(xn))Δx

其中,∇f(xn)∇f(xn)和∇2f(xn)∇2f(xn)分别为目标函数在点xnxn处的梯度和Hessian矩阵。当||Δx||→0||Δx||→0时,上面的近似展开式是成立的。

为了简化符号,我们记

hn(Δx)=f(xn+Δx)=f(xn)+ΔxTgn+12ΔxTHnΔxhn(Δx)=f(xn+Δx)=f(xn)+ΔxTgn+12ΔxTHnΔx

其中gngn和HnHn分别表示目标函数在点xnxn处的梯度和Hessian矩阵。假设,我们取xn+1=xn+Δxxn+1=xn+Δx,为了找到比xnxn处目标函数值更小的点,我们可以取f(xn+Δx)f(xn+Δx)的最小值点作为xn+1xn+1。

因此,当前任务转化为只要找到使hn(Δx)hn(Δx)最小的点ΔxΔx即可。由于HnHn为正定矩阵(凸函数任一点的Hessian矩阵为半正定),hn(Δx)hn(Δx)也是凸函数,其极小值点即为最小值点。

由下列公式,解出hn(Δx)hn(Δx)最小值点Δx∗Δx∗

∂hn(Δx)∂Δx=gn+HnΔx=0∂hn(Δx)∂Δx=gn+HnΔx=0

Δx∗=−H−1ngnΔx∗=−Hn−1gn

由此,我们就确定了下一个点xn+1xn+1的位置。实践上,通常取Δx∗Δx∗作为搜索方向,即取xn+1=xn−α(H−1ngn)xn+1=xn−α(Hn−1gn),使用一维搜索,找到合适的αα使得,f(xn+1f(xn+1比f(x)f(x)尽可能小。

下面是算法的伪代码:

NewtonRaphson(f,x0):For n=0,1,… (until converged):Compute gn and H−1n for xnd=H−1ngnα=minα≥0f(xn−αd)xn+1←xn−αdNewtonRaphson(f,x0):For n=0,1,… (until converged):Compute gn and Hn−1 for xnd=Hn−1gnα=minα≥0f(xn−αd)xn+1←xn−αd

αα即步长(step-size)的确定可以使用line search算法中的任何一种,其中最简单的方法是backtracking line search。

牛顿法的不足

上述的牛顿迭代法最大的问题是需要计算Hessian矩阵的逆。首先,当维度很高时(百万或千万级),此时计算Hessian矩阵的逆几乎是不可能的(存储都很难)。再者,有些函数很难给出Hessian矩阵的解析式。因此,实践上牛顿法很少用在大型的优化问题上。但幸运的是,我们不一定需要一个精确的H−1nHn−1,一个对其的近似,也可以是我们找到目标函数的递减方向。

拟牛顿法

基本思想

先看一下拟牛顿法的基本框架

QuasiNewton(f,x0,H−10,QuasiUpdate):For n=0,1,… (until converged):// Compute search direction and step-size d=H−1ngnα←minα≥0f(xn−αd)xn+1←xn−αd// Store the input and gradient deltas gn+1←∇f(xn+1)sn+1←xn+1−xnyn+1←gn+1−gn// Update inverse hessian H−1n+1←QuasiUpdate(H−1n,sn+1,yn+1)QuasiNewton(f,x0,H0−1,QuasiUpdate):For n=0,1,… (until converged):// Compute search direction and step-size d=Hn−1gnα←minα≥0f(xn−αd)xn+1←xn−αd// Store the input and gradient deltas gn+1←∇f(xn+1)sn+1←xn+1−xnyn+1←gn+1−gn// Update inverse hessian Hn+1−1←QuasiUpdate(Hn−1,sn+1,yn+1)

初始时,给了一个参数H−10H0−1,之后每一次迭代通过QuasiUpdateQuasiUpdate方法加上输入变量与梯度的差值(snsn和ynyn)作为参数,产生出下一个H−1H−1的估计。

可以发现,若QuasiUpdateQuasiUpdate每次都返回单位矩阵,则拟牛顿法退化为梯度下降方法(每一次都沿着梯度方向搜索)。

若QuasiUpdateQuasiUpdate能够返回∇2f(xn+1)∇2f(xn+1),则拟牛顿法与牛顿法就等价了。

从上述伪代码中可以看出,拟牛顿法仅仅需要函数值和梯度信息,并不需要二阶导信息。

QuasiUpdate & BFGS

有了上面的算法框架之后,下面的问题就是QuasiUpdate函数如何实现?

由中值定理,我们知道

(gn−gn−1)=Hn(xn−xn−1)(gn−gn−1)=Hn(xn−xn−1)

因此

H−1nyn=snHn−1yn=sn

同时,Hessian矩阵是对称矩阵。在这两个条件的基础上,我们希望HnHn相对于Hn−1Hn−1的变化并不大。形式化地讲,即

minH−1s.t. ∥H−1−H−1n−1∥2H−1yn=snH−1 is symmetric minH−1‖H−1−Hn−1−1‖2s.t. H−1yn=snH−1 is symmetric

H−1n+1=(I−ρnynsTn)H−1n(I−ρnsnyTn)+ρnsnsTnHn+1−1=(I−ρnynsnT)Hn−1(I−ρnsnynT)+ρnsnsnT

其中ρn=(yTnsn)−1ρn=(ynTsn)−1。

这种更新方式,被称为Broyden–Fletcher–Goldfarb–Shanno (BFGS)更新,由其发明者命名。

值得注意的是,为了计算H−1n+1Hn+1−1,我们只需保存H−10H0−1以及{sn−1sn−1},{yn−1yn−1}序列即可。下面是计算H−1ndHn−1d的伪代码。

BFGSMultiply(H−10,{sk},{yk},d):r←d// Compute right productfor i=n,…,1:αi←ρisTirr←r−αiyi// Compute centerr←H−10r// Compute left productfor i=1,…,n:β←ρiyTirr←r+(αn−i+1−β)sireturn rBFGSMultiply(H0−1,{sk},{yk},d):r←d// Compute right productfor i=n,…,1:αi←ρisiTrr←r−αiyi// Compute centerr←H0−1r// Compute left productfor i=1,…,n:β←ρiyiTrr←r+(αn−i+1−β)sireturn r

L-BFGS

BFGS虽然不需要计算Hessian矩阵了,但是保存snsn、ynyn的历史记录仍需要消耗大量的内存。L-BFGS,即限定内存的BFGS算法,其BFGSMultiply仅使用最近的若干次snsn、ynyn记录。由最近的m次输入变量和梯度变量的差值,和初始的H−10H0−1,近似算出当前的H−1ndHn−1d。

一般来说,取m<10即可。由此,L-BFGS可以被用来求解大型的无约束优化问题(Machine Learning中的很多问题都可以用其求解,如Logistic Regress等)。

关于L-BFGS的实现,有机会专门开一篇来讲。可以参考breeze的实现。

参考

关于数值优化的书强烈推荐 Practical Methods of Optimization 。

l bfgs算法java代码_理解L-BFGS算法相关推荐

  1. 蝗虫算法java代码_蝗虫搜索算法 蝗虫算法:蝗虫优化算法是模拟自然界蝗虫种群捕食行为而提出的一 联合开发网 - pudn.com...

    蝗虫搜索算法 所属分类:其他 开发工具:matlab 文件大小:347KB 下载次数:5 上传日期:2020-07-26 16:31:25 上 传 者:西柚不加冰 说明:  蝗虫算法:蝗虫优化算法是模 ...

  2. l bfgs算法java代码_数值优化:理解L-BFGS算法

    译自<Numerical Optimization: Understanding L-BFGS>,本来只想作为学习CRF的补充材料,读完后发现收获很多,把许多以前零散的知识点都串起来了.对 ...

  3. l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法

    一.BFGS算法 BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令 ,则得到: 二.BGFS算法存在的问题 在BFGS算法中.每次都要存储近似Hesse矩阵 ...

  4. 基于内容的推荐java代码_三种推荐算法简介:基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐...

    1.推荐算法 1.1.协同过滤 协同过滤是目前应用最广泛的推荐算法,它仅仅通过了解用户与物品之间的关系进行推荐,而根本不会考虑到物品本身的属性. 可分成两类: 1.基于用户(user-based)的协 ...

  5. 蚁群算法java实现_简单蚁群算法 + JAVA实现蚁群算法

    一 引言 蚁群算法(ant colony optimization,ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型技术.它由Marco Dorigo于1992年在他的博士论文中引入,其灵 ...

  6. bm25算法Java代码_搜索引擎相关度算法 -BM25 JAVA实现

    bm25 是一种用来评价搜索词和文档之间相关性的算法,它是一种基于概率检索模型提出的算法. 它的出现主要是解决TF-IDF算法中 TF的影响可无限增大的不足,本质上 BM25是基于TF-IDF并做了改 ...

  7. 冒泡排序java代码_看动画学算法之:排序冒泡排序

    点击上方的蓝字关注我吧 程序那些事 简介 排序可能是所有的算法中最最基础和最最常用的了.排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序. 排序算法有很多种,每个都有 ...

  8. 判断三角形java代码_打基础之LeetCode算法题第72篇:最大的三角形周长问题

    一直很纠结算法的文章应该怎么写.最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来 ...

  9. 售票java代码_初探12306售票算法(二)-java代码实践

    周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成Tic ...

最新文章

  1. perf报错解决:no symbols found in /bin/dash, maybe install a debug package?和was updated (is prelink enabl
  2. 服务器安装系统时无法创建新的分区,重装系统出现“我们无法创建新的分区,也找不到现有的分区”...
  3. Ajax中什么时候用同步,什么时候用异步?
  4. unix、linux 命令
  5. Huffman编码(Huffman树)
  6. pycharm无法导入Pillow
  7. 文本输入控件wx.TextCtrl
  8. 区分 Protobuf 中缺失值和默认值
  9. html cellpadding属性,HTML table标签 cellpadding 属性
  10. Download Microsoft Visual Studio 2010 Ultimate Trial - ISO from Official Microsoft Download Center
  11. 数学模型建立常用方法
  12. EMC Isilon存储数据恢复成功案例
  13. 电话聊天狂人 (34 分)
  14. Bmob后端云(云数据库表的具体操作)
  15. QT: Linux下-错误提示cannot find -lGL
  16. leetcode【121】Best Time to Buy and Sell Stock【c++,O(n)复杂度,时间97%,空间100%】
  17. 数据结构与算法--哈夫曼树及其应用
  18. Si基相控阵技术的相关进展1
  19. OA项目之部门管理的功能实现
  20. 原 Android自定义控件三部曲文章索引

热门文章

  1. emqttd 服务器搭建及测试方法
  2. java 输出流转输入流
  3. Java之根据入栈顺序是否能得到出栈顺序
  4. 软件工程 习题三 课后作业
  5. ESP8266(Nodemcu)的I2C通信
  6. 信息技术丨计算机程序计算
  7. 互联网+风口直吹传统银行能否漫步起舞
  8. java获取ajax传值,java取ajax传值
  9. mybatis-generator使用详解(含Example类)
  10. 用开放和流动反抗熵增,生态建设终极哲学——保险生态建设