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−αHn−1gn
这里
H
n
−
1
\bold{H}_{n}^{-1}
Hn−1为Hessian矩阵,
g
n
\bold{g}_{n}
gn为梯度向量,
α
\alpha
α为步长。
牛顿法至少存在两个问题,
- 对于存在梯度的函数来说未必存在Hessian矩阵,或者Hessian矩阵的计算过于复杂。
- 在机器学习问题中,需要优化的向量 Λ \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)+ΔxT∇f(xn)+21ΔxT∇2f(xn)Δx
这里的
x
n
x_{n}
xn表示优化算法第n次迭代得到的解,它满足
l
i
m
n
→
∞
x
n
=
x
∗
\bold{lim}_{n\rightarrow \infty}x_{n}=x^*
limn→∞xn=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+1∇hn(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+1−xn)=gn+1−gn
引入下面的符号,
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+1−xn,yn+1=gn+1−gn
于是得到了正割条件的最终形式,避免了对Hessian的求逆操作
H
n
+
1
−
1
y
n
+
1
=
s
n
+
1
\bold{H}^{-1}_{n+1}y_{n+1}=s_{n+1}
Hn+1−1yn+1=sn+1
对称条件
由二阶偏导数的性质,Hessian矩阵显然要满足对称性,即 H n − T = H n \bold{H}_{n}^{-T}=\bold{H}_{n} Hn−T=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}
H−1min∣∣H−1−Hn−1∣∣2s.t.H−1yn=snH−T=H−1
经过一系列繁琐的求解(以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
Hn−1=(I−ρnynsnT)Hn−1−1(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}
Hn−1=VnTHn−1−1Vn+ρnsnsnT=VnT(Vn−1THn−2−1Vn−1+ρn−1sn−1sn−1T)Vn+ρnsnsnT=…≈VnT…Vn−m+1TH0Vn−m+1…Vn+ρn−m+1VnT…Vn−m+2Tsn−m+2sn−m+2TVn−m+2…Vn+⋯+ρ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