l bfgs算法java代码_理解L-BFGS算法
理解L-BFGS算法
Mar 30, 2015 #数值优化 #无约束最优化
L-BFGS(Limited-Memory BFGS)是BFGS算法在受限内存时的一种近似算法,而BFGS是数学优化中一种无约束最优化算法。本文的目的是介绍L-BFGS算法的具体原理,在此过程中附加上相关背景知识,力求简单易懂。参考文献在文后给出。
无约束优化
无约束最优化的基本形式是,给定一个多元函数f(x)f(x),求出该函数的最小值点x∗x∗。形式化地来说,即:
x∗=argminxf(x)x∗=argminxf(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算法相关推荐
- 蝗虫算法java代码_蝗虫搜索算法 蝗虫算法:蝗虫优化算法是模拟自然界蝗虫种群捕食行为而提出的一 联合开发网 - pudn.com...
蝗虫搜索算法 所属分类:其他 开发工具:matlab 文件大小:347KB 下载次数:5 上传日期:2020-07-26 16:31:25 上 传 者:西柚不加冰 说明: 蝗虫算法:蝗虫优化算法是模 ...
- l bfgs算法java代码_数值优化:理解L-BFGS算法
译自<Numerical Optimization: Understanding L-BFGS>,本来只想作为学习CRF的补充材料,读完后发现收获很多,把许多以前零散的知识点都串起来了.对 ...
- l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法
一.BFGS算法 BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令 ,则得到: 二.BGFS算法存在的问题 在BFGS算法中.每次都要存储近似Hesse矩阵 ...
- 基于内容的推荐java代码_三种推荐算法简介:基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐...
1.推荐算法 1.1.协同过滤 协同过滤是目前应用最广泛的推荐算法,它仅仅通过了解用户与物品之间的关系进行推荐,而根本不会考虑到物品本身的属性. 可分成两类: 1.基于用户(user-based)的协 ...
- 蚁群算法java实现_简单蚁群算法 + JAVA实现蚁群算法
一 引言 蚁群算法(ant colony optimization,ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型技术.它由Marco Dorigo于1992年在他的博士论文中引入,其灵 ...
- bm25算法Java代码_搜索引擎相关度算法 -BM25 JAVA实现
bm25 是一种用来评价搜索词和文档之间相关性的算法,它是一种基于概率检索模型提出的算法. 它的出现主要是解决TF-IDF算法中 TF的影响可无限增大的不足,本质上 BM25是基于TF-IDF并做了改 ...
- 冒泡排序java代码_看动画学算法之:排序冒泡排序
点击上方的蓝字关注我吧 程序那些事 简介 排序可能是所有的算法中最最基础和最最常用的了.排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序. 排序算法有很多种,每个都有 ...
- 判断三角形java代码_打基础之LeetCode算法题第72篇:最大的三角形周长问题
一直很纠结算法的文章应该怎么写.最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来 ...
- 售票java代码_初探12306售票算法(二)-java代码实践
周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成Tic ...
最新文章
- perf报错解决:no symbols found in /bin/dash, maybe install a debug package?和was updated (is prelink enabl
- 服务器安装系统时无法创建新的分区,重装系统出现“我们无法创建新的分区,也找不到现有的分区”...
- Ajax中什么时候用同步,什么时候用异步?
- unix、linux 命令
- Huffman编码(Huffman树)
- pycharm无法导入Pillow
- 文本输入控件wx.TextCtrl
- 区分 Protobuf 中缺失值和默认值
- html cellpadding属性,HTML table标签 cellpadding 属性
- Download Microsoft Visual Studio 2010 Ultimate Trial - ISO from Official Microsoft Download Center
- 数学模型建立常用方法
- EMC Isilon存储数据恢复成功案例
- 电话聊天狂人 (34 分)
- Bmob后端云(云数据库表的具体操作)
- QT: Linux下-错误提示cannot find -lGL
- leetcode【121】Best Time to Buy and Sell Stock【c++,O(n)复杂度,时间97%,空间100%】
- 数据结构与算法--哈夫曼树及其应用
- Si基相控阵技术的相关进展1
- OA项目之部门管理的功能实现
- 原 Android自定义控件三部曲文章索引