BFGS
step 1.
根据泰勒公式,省略掉高阶项:
f(x)≈f(xk+1)+∇f(xk+1)⋅(x−xk+1)+12⋅(x−xk+1)T⋅∇2f(xk+1)⋅(x−xk+1)
再两边取导数得
∇f(x)=∇f(x+1)+Hk+1(x−xk+1)
此时,取x=xk,并设∇f(xk)=gk,∇2f(xk)=Hk
有gk+1−gk=Hk+1⋅(xk+1−xk),设gk+1−gk=yk,xk+1−xk=Sk
则有
yk=Hk+1⋅Sk(1)
step 2.
用Bk表示海森矩阵Hk的近似,用Dk表示H−k1(海森矩阵的逆)的近似
Bk+1=Bk+ΔBk
设∇Bk=αuuT+βvvT ,其中u和v是n维向量
又由(1)得 yk=Bk+1⋅Sk
所以
yk=Bk⋅Sk+αuuTSk+βvvTSk
yk=Bk⋅Sk+αuTSku+βvTSkv (之所以能这么换位置,是因为uTSk是一个数,而不是一个矩阵或向量)
令
⎧⎩⎨⎪⎪⎪⎪⎪⎪αuTSk=1βvTSk=1u=ykv=BkSk}这样设是为了将Bk+1能用yk和Sk表示
可以解得
α=1yTkSk
β=−1vTSk=−1STkBTkSk
所以
ΔBk=ykyTkyTkSk−BkSkSTkBTKSTKBTKSk(2)
后面转自:
作者: peghoty
出处: http://blog.csdn.net/itplus/article/details/21897443



L-BFGS
所谓L-BFGS是对BFGS进行了空间优化:
这是由于向量维数n到达了一定数量级,n×n的矩阵需要相当大的内存。
L-BFGS算法并没有直接存储整个矩阵,而是在需要用到时,根据若干个n维向量来计算。
由于计算的结果需要用到之前每一次迭代/循环中的结果, L-BFGS算法只保存了最近的m次迭代的结果,所以L-BFGS算法又做了近似。