运筹系列40:L-BFGS的pytorch版本
1. 原理简介
L是limited memory的意思。BFGS是四个数学家的名字。连续优化问题基本原理是泰勒二阶展开后,求导=0,用迭代的方法进行求解。 迭代公式很简单: f x k ′ + f x k ′ ′ ( x k + 1 − x k ) = 0 f_{x_k}+f_{x_k}(x_{k+1}-x_k)=0 fxk′+fxk′′(xk+1−xk)=0 f ′ f f′是一个向量, f ′ ′ f f′′是一个矩阵,称为Hessian阵。Hessian计算比较复杂,我们用迭代的方式计算,迭代方程改写为: x k + 1 = x k − f ′ f ′ ′ − 1 x_{k+1}=x_k-ff^{-1} xk+1=xk−f′f′′−1。我们用D来近似 f ′ ′ − 1 f^{-1} f′′−1,迭代公式为: 注意如下几点: (1)这里有2个迭代:第一个迭代计算 D D D,第二个迭代计算 f f f。为了节省时间,我们每一轮迭代都干脆让两个迭代一起进行。 (2)在深度学习时,数据量往往非常大。假设我们数据有10w维,那么每次迭代算出来的D有74.5G,内存、显存都放不下。所以我们用时间换空间,使用L-BFGS方法,将D的计算过程存储下来,需要的时候计算一下即可。 (3)为了进一步节省内存,我们只保留一定步数的计算过程。