文章出处:http://blog.sina.com.cn/s/blog_5980285201018m6r.html
LBFGS算法
CRF++中与L-BFGS相关的代码都存放在lbfgs.h和lbfgs.cpp中
其中mcsrch函数用于线性搜索,找到给定搜索方向后合适的步长
lbfgs_optimize函数实现了L-BFGS算法。
LBFGS算法的理论相关的最重要的论文:
[Jorge Nocedal; updating quasi-newton matrices with limited storage
是一个拟牛顿算法,它是70年代以来无约束最优化领域最佳的算法
其他的无约束最优化算法包括:最速下降法、牛顿法、共轭梯度法、DFP算法、BFGS算法等。
也可以参照下边这篇文章来了解一下:(这篇文章讲到了CRF++中LBFGS算法的几乎所有细节)
http://blog.pfan.cn/miaowei/52948.html(CRF++详解)
直接读CRF++代码还是稍微有些恶心,参照以下几个链接中的文章读一下
http://code.google.com/p/bungee-view/source/browse/trunk/lbfgs/edu/cmu/cs/bungee/lbfgs/Mcsrch.java?r=108(mcsrch函数的java版本,注释稍微多一些)
http://blog.csdn.net/settingsun1225/article/details/6142739(LBFGS算法使用,讲的是其他版本的LBFGS算法细节)
这篇文章详细介绍了w_ 这个变量的内部数据存储情况:
C THE WORK VECTOR W IS DIVIDED AS FOLLOWS:
C ---------------------------------------
C THE FIRST N LOCATIONS ARE USED TO STORE THE GRADIENT AND
C OTHER TEMPORARY INFORMATION.
C LOCATIONS (N+1)...(N+M) STORE THE SCALARS RHO.
C LOCATIONS (N+M+1)...(N+2M) STORE THE NUMBERS ALPHA USED
C IN THE FORMULA THAT COMPUTES H*G.
C LOCATIONS (N+2M+1)...(N+2M+NM) STORE THE LAST M SEARCH
C STEPS.
C LOCATIONS (N+2M+NM+1)...(N+2M+2NM) STORE THE LAST M
C GRADIENT DIFFERENCES.
C
C THE SEARCH STEPS AND GRADIENT DIFFERENCES ARE STORED IN A
C CIRCULAR ORDER CONTROLLED BY THE PARAMETER POINT.
有了这些帮助读LBFGS的C++版本就变得轻松加愉快了!