L-BFGS优化算法基本原理

L-BFGS优化算法基本原理

L-BFGS优化算法

   一般的机器学习问题往往归结于对一个对数极大似然函数 L ( Λ ) L(\Lambda) L(Λ)的优化问题,这里的 Λ = ( λ 1 , … , λ n ) T \Lambda = (\lambda_{1}, \dots, \lambda_{n} )^{T} Λ=(λ1,,λn)T为概率模型中的需要被估计的参数。
  接下来的讨论假设你已经了解牛顿法的基本原理,牛顿法之所以获得了更快的速度,是因为它利用了目标函数的二阶泰勒展开式中的Hessian矩阵。其迭代过程中的更新算法为
x n + 1 = x n − α H n − 1 g n x_{n+1}=x_{n}-\alpha \bold{H}_{n}^{-1}\bold{g}_{n} xn+1=xnαHn1gn
这里 H n − 1 \bold{H}_{n}^{-1} Hn1为Hessian矩阵, g n \bold{g}_{n} gn为梯度向量, α \alpha α为步长。

牛顿法至少存在两个问题,

  1. 对于存在梯度的函数来说未必存在Hessian矩阵,或者Hessian矩阵的计算过于复杂。
  2. 在机器学习问题中,需要优化的向量 Λ \Lambda Λ维度往往达到50000以上,如此存储Hessian矩阵至少需要 N ( N + 1 ) / 2 N(N+1)/2 N(N+1)/2=12亿,且对Hessian求逆矩阵的工作量过于庞大。

  为了解决问题一,数学家们提出了拟牛顿法,基本思路是利用优化过程中的变量自身和它的梯度信息估计Hessian矩阵。首先来看在估计过程中Hessian矩阵必须满足的两个条件。

正割条件(Secant Condition)

  给定凸的目标函数 f ( x ) f(x) f(x),其在 x n x_{n} xn处二阶泰勒近似展开式为
f ( x n + Δ x ) ≈ f ( x n ) + Δ x T ∇ f ( x n ) + 1 2 Δ x T ∇ 2 f ( x n ) Δ x f(x_{n}+\Delta x) \approx f(x_{n})+\Delta x^T\nabla f(x_{n})+\frac{1}{2}\Delta x^T \nabla ^{2}f(x_{n})\Delta x f(xn+Δx)f(xn)+ΔxTf(xn)+21ΔxT2f(xn)Δx
这里的 x n x_{n} xn表示优化算法第n次迭代得到的解,它满足 l i m n → ∞ x n = x ∗ \bold{lim}_{n\rightarrow \infty}x_{n}=x^* limnxn=x x ∗ x^* x为全局最优解。 Δ x \Delta x Δx给出了优化方向, x n + 1 = x n + Δ x x_{n+1}=x_{n}+\Delta x xn+1=xn+Δx。为了方便书写,我们引入以下符号
g n = ∇ f ( x n ) , H n = ∇ 2 f ( x n ) , h n + 1 ( x n + 1 ) = f ( x n + 1 ) \bold{g}_{n}=\nabla f(x_{n}),\bold{H}_{n}=\nabla ^2f(x_{n}),h_{n+1}(x_{n+1})=f(x_{n+1}) gn=f(xn)Hn=2f(xn)hn+1(xn+1)=f(xn+1)
Secant Condition约束使得上述泰勒展开式对于 x n x_{n} xn的梯度与 f ( x ) f(x) f(x)对于 x n x_{n} xn的梯度相等,于是得到如下条件,
∇ h n + 1 ( x n + 1 ) = g n + 1 ∇ h n ( x n ) = g n \nabla h_{n+1}(x_{n+1})=\bold{g}_{n+1} \\ \nabla h_{n}(x_{n})=\bold{g}_{n} hn+1(xn+1)=gn+1hn(xn)=gn
上面两式做差,根据微分中值定理,得到下面的secant condition
H n + 1 ( x n + 1 − x n ) = g n + 1 − g n \bold{H}_{n+1}(x_{n+1}-x_{n})=\bold{g}_{n+1}-\bold{g}_{n} Hn+1(xn+1xn)=gn+1gn
引入下面的符号,
s n + 1 = x n + 1 − x n , y n + 1 = g n + 1 − g n s_{n+1}=x_{n+1}-x_{n},y_{n+1}=\bold{g}_{n+1}-\bold{g}_{n} sn+1=xn+1xn,yn+1=gn+1gn
于是得到了正割条件的最终形式,避免了对Hessian的求逆操作
H n + 1 − 1 y n + 1 = s n + 1 \bold{H}^{-1}_{n+1}y_{n+1}=s_{n+1} Hn+11yn+1=sn+1

对称条件

  由二阶偏导数的性质,Hessian矩阵显然要满足对称性,即 H n − T = H n \bold{H}_{n}^{-T}=\bold{H}_{n} HnT=Hn

BFGS算法

  有了上面两个约束条件,我们减少了Hessian矩阵的一些自由度,secant condition提供了N个约束,而确定一个Hessian矩阵需要 N ( N + 1 ) / 2 N(N+1)/2 N(N+1)/2个约束条件,因而我们仍然需要一些条件,于是便有了BFGS算法,B,F,G,S分别为四个数学家名字的首字母,该算法将Hessian矩阵的估计问题转化为约束优化问题,他们假设在迭代过程中,Hessian尽可能的连续变换,即前后两次迭代的Frobenius范数变化不大,数学化的描述如下,
min ⁡ H − 1 ∣ ∣ H − 1 − H n − 1 ∣ ∣ 2 s . t . H − 1 y n = s n H − T = H − 1 \min_{\bold{H}^{-1}}||\bold{H}^{-1}-\bold{H}_{n-1}||_{2} \\ \bold{s.t.}\quad \quad \quad \quad \quad \quad \quad \\ \bold{H}^{-1}y_{n}=s_{n}\\ \bold{H}^{-T}=\bold{H}^{-1} H1minH1Hn12s.t.H1yn=snHT=H1
经过一系列繁琐的求解(以Lagrange乘子法为出发点),得到如下的解,这里不给出证明,有兴趣的读者可以查询相关论文,直接给出求解结果如下
H n − 1 = ( I − ρ n y n s n T ) H n − 1 − 1 ( I − ρ n s n y n T ) + ρ n s n s n T \bold{H}_{n}^{-1}=\left( I-\rho _{n} y_{n}s_{n}^T \right)\bold{H}_{n-1}^{-1}(I-\rho _{n}s_{n}y_{n}^T)+\rho_{n}s_{n}s_{n}^T Hn1=(IρnynsnT)Hn11(IρnsnynT)+ρnsnsnT
其中, ρ n = ( s n T y n ) − 1 \rho_{n}=(s_{n}^Ty_{n})^{-1} ρn=(snTyn)1

  至此,我们解决了Hessian逆矩阵的估计问题,但我们仍然未解决Hessian庞大的内存占用问题,L-BFGS算法在BFGS的基础上解决了BFGS算法的内存占用问题。

L-BFGS算法基本原理

L-BFGS算法即limited BFGS算法(有限内存算法)。我们首先定义一个新的符号,
V n = I − ρ n s n y n T \bold{V}_{n}=I-\rho_{n}s_{n}y_{n}^T Vn=IρnsnynT
则Hessian的更新表达式可以简化为
H n − 1 = V n T H n − 1 − 1 V n + ρ n s n s n T = V n T ( V n − 1 T H n − 2 − 1 V n − 1 + ρ n − 1 s n − 1 s n − 1 T ) V n + ρ n s n s n T = … ≈ V n T … V n − m + 1 T H 0 V n − m + 1 … V n + ρ n − m + 1 V n T … V n − m + 2 T s n − m + 2 s n − m + 2 T V n − m + 2 … V n + ⋯ + ρ n s n s s T \begin{aligned} \bold{H}_{n}^{-1}&=\bold{V_{n}}^T\bold{H}_{n-1}^{-1}\bold{V}_{n}+\rho_{n}s_{n}s_{n}^T \\ &=\bold{V}_{n}^{T}(\bold{V}_{n-1}^T\bold{H}_{n-2}^{-1}\bold{V}_{n-1}+\rho_{n-1}s_{n-1}s_{n-1}^T)\bold{V}_{n}+\rho_{n}s_{n}s_{n}^T \\ &= \dots \\ &\approx \bold{V}_{n}^T\dots \bold{V}_{n-m+1}^T\bold{H}_{0}\bold{V}_{n-m+1}\dots\bold{V}_{n} \\ &\quad + \rho_{n-m+1}\bold{V}_{n}^T\dots \bold{V}_{n-m+2}^Ts_{n-m+2}s_{n-m+2}^T\bold{V}_{n-m+2}\dots\bold{V}_{n} \\ &\quad + \dots +\rho_{n}s_{n}s_{s}^T \end{aligned} Hn1=VnTHn11Vn+ρnsnsnT=VnT(Vn1THn21Vn1+ρn1sn1sn1T)Vn+ρnsnsnT=VnTVnm+1TH0Vnm+1Vn+ρnm+1VnTVnm+2Tsnm+2snm+2TVnm+2Vn++ρnsnssT
这里初始的Hessian矩阵 H 0 \bold{H}_{0} H0一般用单位矩阵代替,因此,L-BFGS算法在迭代过程中只需要保存前m次的 s n s_{n} sn y n y_{n} yn即可,空间复杂度为 O ( m N ) O(mN) O(mN),远小于BFGS算法的 O ( N 2 ) O(N^2) O(N2)

[参考文档]
[1]: https://www.hankcs.com/ml/l-bfgs.html
[2]: https://www.cnblogs.com/zyfd/p/10120036.html

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值