Reference
【概述】
在 Sherman-Morrison 公式下的 BFGS 算法中,需要用到一个 $N\times N$ 的矩阵 $G_k$,当 $N$ 很大时,存储这个矩阵将十分消耗计算机的资源
以 $N=100,000$ 为例,其所需要消耗的内存空间如下:
这对一般的服务器是难以承受的,虽然考虑到矩阵 $G_k$ 是对称阵,使用对称存储的方法内存可以降低一半,但是 $10W$ 规模的数据在机器学习问题中只能算是中小规模
为减少 BFGS 算法迭代过程中的内存开销,有了 L-BFGS 算法(Limited-memory BFGS),其对矩阵 $G_k$ 进行了近似,不再存储完整的矩阵 $G_k$,而是存储计算过程中的向量序列 $\{\boldsymbol{\delta_i}\}$ 和 $\{\mathbf{y_i}\}$,在需要矩阵 $G_k$ 时,利用这两个向量序列计算来代替
同时,向量序列 $\{\boldsymbol{\delta_i}\}$ 和 $\{\mathbf{y_i}\}$,也并非每次都存储,而是根据用户机器的内存每次各自存储最新的 $m$ 个,每次计算 $G_k$ 时,都利用这最新的 $m$ 个向量序列进行计算,这样存储就由原来的 $O(N^2)$ 降低到了 $O(mN)$
【算法原理】
L-BFGS 算法的出发点是 BFGS 算法中的迭代式:
记:$\rho_k=\frac{1}{\mathbf{y_k}^T\boldsymbol{\delta_k}}$,$V_k=I-\rho_k\mathbf{y_k}\boldsymbol{\delta_k}^T$,则上式可写为:
若给定初始矩阵 $G_0=I$,则依次可得:
由此,可进行递推,有:
可见,计算 $G_{k+1}$ 需要用到向量序列 $\{(\boldsymbol{\delta_i},\mathbf{y_i})\}_{i=0}^k$,若从 $\boldsymbol{\delta_0},\mathbf{y_0}$ 开始连续地存储 $m$ 组的话,只能依次计算到 $G_m$
也就是说,如果想要求 $G_{m+1},G_{m+2},…$ 的话,就要考虑丢弃一些最早生成的向量
举例来说,如果要计算 $G_{m+1}$,就保存 $\{(\boldsymbol{\delta_i},\mathbf{y_i})\}_{i=1}^{m}$,丢弃 $\{(\boldsymbol{\delta_0},\mathbf{y_0})\}$,如果要计算 $G_{m+2}$,就保存 $\{(\boldsymbol{\delta_i},\mathbf{y_i})\}_{i=2}^{m+1}$,丢弃 $\{(\boldsymbol{\delta_i},\mathbf{y_i})\}_{i=0}^{1}$
在舍弃一些向量后,就只能近似计算了,当 $k+1>m$ 时,按照上述的 $G_{k+1}$ 可以构造近似计算公式,即:
若引入 $\hat{m}=\min\{k,m-1\}$ 则可以将上述的递推式与近似式进行合并,即:
事实上,根据 BFGS 算法流程可知,$G_k$ 的作用仅用于计算 $G_k\mathbf{g_k}$ 来获取搜索方向,因此,若能根据上式设计出一种能够快速计算 $G_k\mathbf{g_k}$ 的算法即可
【算法流程】
快速计算 $G_k\mathbf{g_k}$ 的算法流程如下:
Step 1:初始化
Step 2:后向循环
Step 3:前向循环
最后求出的 $\mathbf{r_L}$ 即为 $H_k\mathbf{g_k}$ 的值