LBFGS 简单笔记

52nlp上无约术最优化的文章:http://www.52nlp.cn/unconstrained-optimization-one ,后面提到了一个无约束最优化的C++实现http://www.chokkan.org/software/liblbfgs/。

研究这个简单的实现,算是做了一些小解释。可以参考52npl上的文章看这个程序。程序需要VC 2010编译。

 
  

sample

lbfgs.c

{

lm;

计算原函数和梯度fx ,g;

d = - g;

计算xnorm,gnorm;

判定gnorm/xnorm 是否满足条件;

计算step = 1/sqrt(d^d) ;

k = 1,end = 0;

进入for循环

{

xp = x;

gp =g;

进入line_search函数;

{

dginit = gs = gd;

finit = *f;

dgtest = ftol * dginit;

stx = sty =0; fs = fy = finit; dgx = gdy = dginit;

进入for循环

{

stmin,stmax;

x= xp + stp * d;

计算 fx,g;

dg = g^s;

ftest = finit + stp * dgtest;

++count;

判断*f <= ftest  |dg|<=g(-dginit)

return count;

}

}

计算xnorm,gnorm,调用progress 输出第一次迭代

计算gnorm/xnorm;

计算it,lm中的s,y,ys.

s = x - xp;

y = y - yp;

ys = y^s;yy =  y^y;

d = -g;

迭代计算alpha beta;

{

alpha = s^d; alpha = alpha / ys;d=d-alpha*y;

beta = y^d; beta = beta / ys ; d= d+ (alpha - beta)*s;

}

step = 1;

}

}


你可能感兴趣的:(自然语言处理)