L-BFGS###
先介绍下BFGS算法过程
BFGS ####
Gk+1=VkTGkVk+ρkskskTρk=ykTsk1,Vk=I−ρkykskT 缺点:矩阵本身的存储大小Gk
Gk+1=(Vk−1T…V0T)G0(V0…Vk−1)+(Vk−1T…V1T)s0ρ0s0T(V1…Vk−1)+(Vk−1T…V2T)s1ρ1s1T(V2…Vk−1)+(Vk−1T…V3T)s2ρ2s2T(V3…Vk−1)+…+Vk−1Tsk−2ρk−2sk−2TVk−1+sk−1ρk−1sk−1T 从易存储的初始矩阵出发,可以迭代求出Gk。而且计算到一定步数之后,可以不用从第一步开始迭代,比如可以取从前m步开始迭代,找一个Gk0跟前m步迭代结果“差不多”就可以近似了。
所以递归公式为:
Gk+1=(Vk−1T…Vk−mT)Gk0(Vk−m…Vk−1)+(Vk−1T…Vk−m+1T)sk−mρk−msk−mT(Vk−m+1…Vk−1)+(Vk−1T…Vk−m+2T)sk−m+1ρk−m+1sk−m+1T(Vk−m+2…Vk−1)+(Vk−1T…Vk−m+3T)sk−m+2ρk−m+2sk−m+2T(Vk−m+3…Vk−1)+…+Vk−1Tsk−2ρk−2sk−2TVk−1+sk−1ρk−1sk−1T 所求方向:
Gk+1∇f=(Vk−1T…Vk−mT)Gk0(Vk−m…Vk−1)∇f+(Vk−1T…Vk−m+1T)sk−mρk−msk−mT(Vk−m+1…Vk−1)∇f+(Vk−1T…Vk−m+2T)sk−m+1ρk−m+1sk−m+1T(Vk−m+2…Vk−1)∇f+(Vk−1T…Vk−m+3T)sk−m+2ρk−m+2sk−m+2T(Vk−m+3…Vk−1)∇f+…+Vk−1Tsk−2ρk−2sk−2TVk−1∇f+sk−1ρk−1sk−1T∇f 等一等,这个式子中有大量的重复计算:
Gk+1∇f=(Vk−1T…Vk−mT)Gk0(Vk−m…Vk−1)∇f+(Vk−1T…Vk−m+1T)sk−mρk−msk−mT(Vk−m+1…Vk−1)∇f+(Vk−1T…Vk−m+2T)sk−m+1ρk−m+1sk−m+1T(Vk−m+2…Vk−1)∇f+(Vk−1T…Vk−m+3T)sk−m+2ρk−m+2sk−m+2T(Vk−m+3…Vk−1)∇f+…+Vk−1Tsk−2ρk−2sk−2TVk−1∇f+sk−1ρk−1sk−1T∇f 右侧优化:
递推:qi=Viqi+1
初始:qk=∇f
得到:$$
\begin{align}
q{k-1} &= V{k-1} \nabla f \
q{k-2} &= V{k-2} V_{k-1} \nabla f \
\ldots \
q{k-m} &= V{k-m} \ldots V{k-2} V{k-1} \nabla f
\end{align}
$$
αk−i=ρk−isk−iT(Vk−i+1Vk−i+2…Vk−2Vk−1)∇f
然后左侧优化:
递推:ri+1=Vi+1Tri+si+1αi+1=ri+si+1(αi+1−ρi+1yi+1Tri)
初始:rk−m=Vk−mTGk0(Vk−m…Vk−1)∇f+sk−mαk−m
得到$$
r{k-1} = (V{k-1}^T \ldots V{k-m}^T) G_k^0 (V{k-m} \ldots V_{k-1}) \nabla f \
(V{k-1}^T \ldots V{k-m+1}^T) s{k-m} \alpha{k-m} \
(V{k-1}^T \ldots V{k-m+2}^T) s{k-m+1} \alpha{k-m+1} \
(V{k-1}^T \ldots V{k-m+3}^T) s{k-m+2} \alpha{k-m+2} \
V{k-1}^T s{k-2} \alpha_{k-2} \
rk−1就是最后要求解的值。
L-BFGS算法过程:
Gk0 的选择:yk−1Tyk−1sk−1Tyk−1I
L-BFGS法计算方向更精美一点的排版####
看第6步,就直接计算出 Gk0 了。之前看到有些代码是传入了Gk0 。
整个L-BFGS法下降过程####
待扩展###
百度有个shooting算法 ,比LBFGS更快,对hession矩阵分块,使得特征值差不多的靠的更近。
并行化###
《Large-scale L-BFGS using MapReduce》
整个算法过程(Algorithm 1)中,第2,3,4步可以优化。
第2,4步很按数据容易拆分。
第3步拆分如下:

参考佳文####
Python L-BFGS
理解L-BFGS算法
机器学习优化算法L-BFGS及其分布式实现