数据科学和机器学习中的优化理论与算法(下)
数据科学和机器学习当前越来越热,其中涉及的优化知识颇多。很多人在做机器学习或者数据科学时,对其中和优化相关的数学基础,包括随机梯度下降、ADMM、KKT 条件,拉格朗日乘数法、对偶问题等,不太了解,一知半解地用,用着用着就出错了。
本文希望从基础知识的角度,尽可能全地对最简单的优化理论和算法做一个小结。内容涵盖以下几个方面:优化简介、无约束优化、线搜索方法、信赖域方法、共轭梯度方法、拟牛顿方法、最小二乘问题、非线性方程、约束优化理论、非线性约束优化算法、二次规划、罚方法…
通过本文档的学习,相信你会掌握数据科学和机器学习中用到的优化基础知识,以后再遇到优化问题,就不会再困惑了。
建议收藏,方便时时查阅。
共轭梯度方法
线性共轭梯度方法
共轭梯度(Conjugate Gradient,简称 CG)方法,最开始在十九世纪五十年代被 Hestenes 和 Stiefel 提出用来迭代地带正定系数的线性方程组。假设
A
A
A 对称正定,我们要求解,
A
x
=
b
A x=b
Ax=b
这也可以被等价写为极小化下面的一个凸问题:
min
ϕ
(
x
)
≡
1
2
x
T
A
x
−
b
T
x
\min \phi(x) \equiv \frac{1}{2} x^{T} A x-b^{T} x
minϕ(x)≡21xTAx−bTx
ϕ
\phi
ϕ的梯度也就等于线性系统的残差,
∇
ϕ
(
x
)
=
A
x
−
b
≡
r
(
x
)
\nabla \phi(x)=A x-b \equiv r(x)
∇ϕ(x)=Ax−b≡r(x)
在迭代到
x
=
x
k
x=x_{k}
x=xk,当前步的残差也可以写为:
r
k
=
A
x
k
−
b
r_{k}=A x_{k}-b
rk=Axk−b。
共轭方向法
给一个定义,如果对于一个非零向量集
{
p
0
,
p
1
,
⋯
,
p
t
}
\left\{p_{0}, p_{1}, \cdots, p_{t}\right\}
{p0,p1,⋯,pt},对于正定矩阵
A
A
A 满足,
p
i
T
A
p
j
=
0
,
for all
i
≠
j
p_{i}^{T} A p_{j}=0, \quad \text { for all } i \neq j
piTApj=0, for all i=j
我们就说这个向量集是共轭的,其实也就是在
A
A
A 意义下的一个正交。
共轭方向之间是相互独立的,任何一个向量可以写成它们之间的一个线性组合
x
=
∑
i
=
1
n
α
i
p
i
x=\sum_{i=1}^{n} \alpha^{i} p_{i}
x=∑i=1nαipi,代入到极小化函数
ϕ
\phi
ϕ 中,可得,
ϕ
(
x
)
=
∑
i
=
1
n
(
α
i
)
2
2
p
i
T
A
p
i
−
α
i
p
i
T
b
\phi(x)=\sum_{i=1}^{n} \frac{\left(\alpha^{i}\right)^{2}}{2} p_{i}^{T} A p_{i}-\alpha^{i} p_{i}^{T} b
ϕ(x)=i=1∑n2(αi)2piTApi−αipiTb
要极小化
ϕ
\phi
ϕ,显然有,
α
i
=
p
i
T
b
p
i
T
A
p
i
\alpha^{i}=\frac{p_{i}^{T} b}{p_{i}^{T} A p_{i}}
αi=piTApipiTb
也就是说,只要知道了共轭方向,就可以通过他们的线性组合,将最优解表达出来。细细地思考,将这些共轭方向做线性组合,无非就是从原点出发,一次沿一个共轭方向去走一定的步长。那么,不从原点出发,而从某个
x
0
x_0
x0 出发,每次也依次沿着共轭方向走,是否也能走到一个最优值点呢?答案是肯定的。
考虑下述的共轭方向方法,给定初值点
x
0
∈
ℜ
n
x_{0} \in \Re^{n}
x0∈ℜn 和一个共轭方向集合
{
p
0
,
p
1
,
⋯
,
p
n
−
1
}
\left\{p_{0}, p_{1}, \cdots, p_{n-1}\right\}
{p0,p1,⋯,pn−1},让我们按如下方式进行迭代
x
k
+
1
=
x
k
+
α
k
p
k
x_{k+1}=x_{k}+\alpha_{k} p_{k}
xk+1=xk+αkpk
这里的
α
k
\alpha_k
αk 其实是二次函数
ϕ
\phi
ϕ 沿着
x
k
+
α
p
k
x_{k}+\alpha p_{k}
xk+αpk 方向的一维极小值,显示地给出表达,就是
α
k
=
−
r
k
T
p
k
p
k
T
A
p
k
\alpha_{k}=-\frac{r_{k}^{T} p_{k}}{p_{k}^{T} A p_{k}}
αk=−pkTApkrkTpk
有相关定理表明,以上迭代过程收敛到最优解
x
∗
x^*
x∗,并且具有n步终止性。以上方法,就是传说中的共轭方向法。
那么,问题来了,如何给出一组共轭方向呢?一个容易想到的是,直接取矩阵 A A A 的 n 个彼此正交的特征向量作为共轭方向。问题在于,实现构造共轭方向,计算量太大,从而可以考虑在迭代中产生。事实上,迭代地去产生和利用共轭方向,就是共轭梯度方法。
共轭梯度法
共轭梯度法在迭代中生成共轭方向,只需要用到前一点出的搜索方向,在内存和计算的开销上,也尤为经济。共轭方向的产生,是将当前步的共轭方向,写成当前步的残差和前一步的共轭方向(搜索方向)的线性组合,
p
k
=
−
r
k
+
β
k
p
k
−
1
p_{k}=-r_{k}+\beta_{k} p_{k-1}
pk=−rk+βkpk−1
由共轭梯度的定义
p
k
p_k
pk 必须满足
p
k
−
1
T
A
p
k
=
0
p_{k-1}^{T} A p_{k}=0
pk−1TApk=0,易得,
β
k
=
r
k
T
A
p
k
−
1
p
k
−
1
T
A
p
k
−
1
\beta_{k}=\frac{r_{k}^{T} A p_{k-1}}{p_{k-1}^{T} A p_{k-1}}
βk=pk−1TApk−1rkTApk−1
选择
p
0
p_0
p0 是负梯度方向,并且依次执行沿各个共轭梯度方向一维的极小化过程,就是所说的共轭梯度方法。算法流程如下图。
CG 算法具有 n 步终止性,它也是也给 Krylov 子空间方法。为了写成更加经济的程序,我们可以对上述算法的某些变量表达进行化简。
首先,我们得不加证明地引用残差和共轭梯度的的正交性质。
r
k
T
r
i
=
0
,
∀
i
≠
k
r_{k}^{T} r_{i}=0, \quad \forall i\neq k
rkTri=0,∀i=k
r
k
T
p
i
=
0
,
∀
i
≠
k
r_{k}^{T} p_{i}=0, \quad \forall i\neq k
rkTpi=0,∀i=k
那么,根据
r
k
T
p
k
=
r
k
T
(
−
r
k
+
β
k
p
k
−
1
)
=
−
r
k
T
r
k
r_{k}^{T} p_{k}=r_{k}^{T}\left(-r_{k}+\beta_{k} p_{k-1}\right)=-r_{k}^{T} r_{k}
rkTpk=rkT(−rk+βkpk−1)=−rkTrk
以及
r
k
+
1
=
A
x
k
+
1
−
b
=
A
(
x
k
+
α
k
p
k
)
−
b
=
r
k
+
α
k
A
p
k
r_{k+1}=A x_{k+1}-b=A\left(x_{k}+\alpha_{k} p_{k}\right)-b=r_{k}+\alpha_{k} A p_{k}
rk+1=Axk+1−b=A(xk+αkpk)−b=rk+αkApk
我们可以得到,
α
k
=
−
r
k
T
p
k
p
k
T
A
p
k
=
r
k
T
r
k
p
k
T
A
p
k
\alpha_{k}=-\frac{r_{k}^{T} p_{k}}{p_{k}^{T} A p_{k}}=\frac{r_{k}^{T} r_{k}}{p_{k}^{T} A p_{k}}
αk=−pkTApkrkTpk=pkTApkrkTrk
和
β
k
+
1
=
r
k
+
1
T
A
p
k
p
k
T
A
p
k
=
r
k
+
1
T
(
r
k
+
1
−
r
k
)
p
k
T
(
r
k
+
1
−
r
k
)
=
r
k
+
1
T
r
k
+
1
r
k
T
r
k
\beta_{k+1}=\frac{r_{k+1}^{T} A p_{k}}{p_{k}^{T} A p_{k}}=\frac{r_{k+1}^{T}\left(r_{k+1}-r_{k}\right)}{p_{k}^{T}\left(r_{k+1}-r_{k}\right)}=\frac{r_{k+1}^{T} r_{k+1}}{r_{k}^{T} r_{k}}
βk+1=pkTApkrk+1TApk=pkT(rk+1−rk)rk+1T(rk+1−rk)=rkTrkrk+1Trk+1
那么,我们就可以得到一个 CG 算法的实用形式,编程参考这个来写,就是极好了。如图。
定理表明,如果
A
A
A 有
r
r
r 个不同的特征值,那么 CG 算法至多迭代
r
r
r 步终止。线性 CG 方法的收敛速度为,
∥
x
k
−
x
∗
∥
A
≤
2
(
κ
(
A
)
−
1
κ
(
A
)
+
1
)
k
∥
x
0
−
x
∗
∥
A
\left\|x_{k}-x^{*}\right\|_{A} \leq 2\left(\frac{\sqrt{\kappa(A)}-1}{\sqrt{\kappa(A)}+1}\right)^{k}\left\|x_{0}-x^{*}\right\|_{A}
∥xk−x∗∥A≤2(κ(A)+1κ(A)−1)k∥x0−x∗∥A
这里的
κ
(
A
)
=
∥
A
∥
2
∥
A
−
1
∥
2
=
λ
n
λ
1
\kappa(A)=\|A\|_{2}\left\|A^{-1}\right\|_{2}=\frac{\lambda_{n}}{\lambda_{1}}
κ(A)=∥A∥2∥∥A−1∥∥2=λ1λn。
从收敛率上可以看得出,当
A
A
A 的最大最小特征值差距比较大的时候,收敛就会很慢,怎么办?可以用预优方法,也就有了 PCG。所谓的预条件(Preconditioning)CG 方法,就是对变量先做一个变换,
x
^
=
C
x
\hat{x}=C x
x^=Cx,极小化问题变为
ϕ
^
(
x
^
)
=
1
2
x
^
T
(
C
−
T
A
C
−
1
)
x
^
−
(
C
−
T
b
)
T
x
^
\hat{\phi}(\hat{x})=\frac{1}{2} \hat{x}^{T}\left(C^{-T} A C^{-1}\right)\hat{x}-\left(C^{-T} b\right)^{T} \hat{x}
ϕ^(x^)=21x^T(C−TAC−1)x^−(C−Tb)Tx^
等价于求解
(
C
−
T
A
C
−
1
)
x
^
=
C
−
T
b
\left(C^{-T} A C^{-1}\right) \hat{x}=C^{-T} b
(C−TAC−1)x^=C−Tb
我们希望能找到一个合适的
C
C
C,使得
C
−
T
A
C
−
1
C^{-T} A C^{-1}
C−TAC−1 的条件数比较小,这就是预条件 CG 方法。
非线性共轭梯度方法
非线性共轭梯度方法用来求解非线性问题:
min
f
(
x
)
\min f(x)
minf(x)
非线性 CG 基本上就是仿这线性 CG 来的。因为我们没有了矩阵
A
A
A,所以原有 CG 的
α
k
\alpha_k
αk 的表达就没法用了,我们用原有思想,使用最小化
ϕ
\phi
ϕ 沿着
p
k
p_k
pk 对应的步长作为
α
k
\alpha_k
αk。另外,残差
r
r
r,在非线性 CG 中也没有了,我们用
f
f
f 的梯度来替代,于是,就有了如图所示的非线性 CG 方法,根据
β
\beta
β 的选择,此时也叫 FR 方法。
在相同的框架下,我们修改
β
k
+
1
\beta_{k+1}
βk+1,就可以得到不同的非线性 CG 方法。
PR 方法:
β
k
+
1
P
R
=
∇
f
k
+
1
T
(
∇
f
k
+
1
−
∇
f
k
)
∥
∇
f
k
∥
2
\beta_{k+1}^{P R}=\frac{\nabla f_{k+1}^{T}\left(\nabla f_{k+1}-\nabla f_{k}\right)}{\left\|\nabla f_{k}\right\|^{2}}
βk+1PR=∥∇fk∥2∇fk+1T(∇fk+1−∇fk)
DY 方法(戴-袁):
β
k
+
1
D
Y
=
∇
f
k
+
1
T
∇
f
k
+
1
(
∇
f
k
+
1
−
∇
f
k
)
T
p
k
\beta_{k+1}^{D Y}=\frac{\nabla f_{k+1}^{T} \nabla f_{k+1}}{\left(\nabla f_{k+1}-\nabla f_{k}\right)^{T} p_{k}}
βk+1DY=(∇fk+1−∇fk)Tpk∇fk+1T∇fk+1
HS 方法:
β
k
+
1
H
S
=
∇
f
k
+
1
T
(
∇
f
k
+
1
−
∇
f
k
)
(
∇
f
k
+
1
−
∇
f
k
)
T
p
k
\beta_{k+1}^{H S}=\frac{\nabla f_{k+1}^{T}\left(\nabla f_{k+1}-\nabla f_{k}\right)}{\left(\nabla f_{k+1}-\nabla f_{k}\right)^{T} p_{k}}
βk+1HS=(∇fk+1−∇fk)Tpk∇fk+1T(∇fk+1−∇fk)
观察可发现,这四种方法只不过是两个分子和两个分母不同的组合而已。
当然,这当中还有一些别的有趣的问题,包括重启动、二次终止性、全局收敛性和信赖域子问题的截断 CG 方法等等,由于时间关系,就不再多说。
拟牛顿方法
拟牛顿和割线方程
拟牛顿法是一种以牛顿法为基础设计的,求解非线性方程组或连续的最优化问题函数的零点或极大、极小值的算法。当牛顿法中所要求计算的雅可比矩阵或 Hessian 矩阵难以甚至无法计算时,拟牛顿法便可派上用场。
考虑模型问题
m
k
(
p
)
=
f
k
+
∇
f
k
T
p
+
1
2
p
T
B
k
p
m_{k}(p)=f_{k}+\nabla f_{k}^{T} p+\frac{1}{2} p^{T} B_{k} p
mk(p)=fk+∇fkTp+21pTBkp
最小化之,可得拟牛顿步长:
p
k
=
−
B
k
−
1
∇
f
k
p_{k}=-B_{k}^{-1} \nabla f_{k}
pk=−Bk−1∇fk
那么,新的迭代为:
x
k
+
1
=
x
k
+
α
k
p
k
x_{k+1}=x_{k}+\alpha_{k} p_{k}
xk+1=xk+αkpk
问题是,这里的
α
k
\alpha_k
αk 和
B
k
B_k
Bk如何选取?一般来说,对于 Hessian,以下这种近似关系是要满足的。
∇
2
f
k
+
1
(
x
k
+
1
−
x
k
)
≈
∇
f
k
+
1
−
∇
f
k
\nabla^{2} f_{k+1}\left(x_{k+1}-x_{k}\right) \approx \nabla f_{k+1}-\nabla f_{k}
∇2fk+1(xk+1−xk)≈∇fk+1−∇fk
因为
B
k
B_k
Bk是 Hessian 的逼近,所以需要满足"割线方程":
B
k
+
1
s
k
=
y
k
B_{k+1} s_{k}=y_{k}
Bk+1sk=yk
这里
s
k
=
x
k
+
1
−
x
k
=
α
k
p
k
,
y
k
=
∇
f
k
+
1
−
∇
f
k
s_{k}=x_{k+1}-x_{k}=\alpha_{k} p_{k}, \quad y_{k}=\nabla f_{k+1}-\nabla f_{k}
sk=xk+1−xk=αkpk,yk=∇fk+1−∇fk。事实上,只要满足曲率条件
s
k
T
y
k
>
0
s_{k}^{T} y_{k}>0
skTyk>0,那么割线方程总是会被满足的,而曲率条件总是被Wolfe或者强Wolfe条件所保证。
割线方程的解是不唯一的,因为未知数太多了。所以要确定 B k B_k Bk,我们还需要一些额外的条件,不同的附加条件,就对应了不同的方法。
DFP 方法
我们在割线方程的约束框架下,求解子问题:
min
B
∥
B
−
B
k
∥
s.t.
B
=
B
T
,
B
s
k
=
y
k
\begin{array}{ll} {\min _{B}} & {\left\|B-B_{k}\right\|} \\ {\text { s.t. }} & {B=B^{T}, \quad B s_{k}=y_{k}} \end{array}
minB s.t. ∥B−Bk∥B=BT,Bsk=yk
得到了
B
k
B_k
Bk 的迭代:
B
k
+
1
=
(
I
−
γ
k
y
k
s
k
T
)
B
k
(
I
−
γ
k
y
k
s
k
T
)
+
γ
k
y
k
y
k
T
γ
k
=
1
/
y
k
T
s
k
\begin{array}{c} {B_{k+1}=\left(I-\gamma_{k} y_{k} s_{k}^{T}\right) B_{k}\left(I-\gamma_{k} y_{k} s_{k}^{T}\right)+\gamma_{k} y_{k} y_{k}^{T}} \\ {\gamma_{k}=1 / y_{k}^{T} s_{k}} \end{array}
Bk+1=(I−γkykskT)Bk(I−γkykskT)+γkykykTγk=1/ykTsk
显然,在应用拟牛顿方法时,我们没有知道用到
B
k
B_k
Bk,而是用到它的逆
H
k
=
B
k
−
1
H_k = B_k^{-1}
Hk=Bk−1,利用关系(Sherman-Morrison-Woodbury公式):
(
A
+
a
b
T
)
−
1
=
A
−
1
−
A
−
1
a
b
T
A
−
1
1
+
b
T
A
−
1
a
\left(A+a b^{T}\right)^{-1}=A^{-1}-\frac{A^{-1} a b^{T} A^{-1}}{1+b^{T} A^{-1} a}
(A+abT)−1=A−1−1+bTA−1aA−1abTA−1
我们可以由
B
k
B_k
Bk 的迭代得到
H
k
H_k
Hk 的迭代:
H
k
+
1
=
H
k
−
H
k
y
k
y
k
T
H
k
y
k
T
H
k
y
k
+
s
k
s
k
T
y
k
T
s
k
H_{k+1}=H_{k}-\frac{H_{k} y_{k} y_{k}^{T} H_{k}}{y_{k}^{T} H_{k} y_{k}}+\frac{s_{k} s_{k}^{T}}{y_{k}^{T} s_{k}}
Hk+1=Hk−ykTHkykHkykykTHk+ykTskskskT
将这个迭代套到拟牛顿方法中,就叫DFP方法。
BFGS 方法
直接求解
B
k
B_k
Bk 逆
H
k
H_k
Hk 的子问题:
min
H
∥
H
−
H
k
∥
s.t.
H
=
H
T
,
H
y
k
=
s
k
\begin{array}{ll} {\min _{H}} & {\left\|H-H_{k}\right\|} \\ {\text { s.t. }} & {H=H^{T},Hy_{k}=s_{k}} \end{array}
minH s.t. ∥H−Hk∥H=HT,Hyk=sk
直接得到
H
k
=
B
k
−
1
H_k = B_k^{-1}
Hk=Bk−1 的迭代,称为 BFGS 方法:
H
k
+
1
=
(
I
−
γ
k
s
k
y
k
T
)
H
k
(
I
−
γ
k
s
k
y
k
T
)
+
γ
k
s
k
s
k
T
γ
k
=
1
/
y
k
T
s
k
\begin{array}{c} {H_{k+1}=\left(I-\gamma_{k} s_{k} y_{k}^{T}\right) H_{k}\left(I-\gamma_{k} s_{k} y_{k}^{T}\right)+\gamma_{k} s_{k} s_{k}^{T}} \\ {\gamma_{k}=1 / y_{k}^{T} s_{k}} \end{array}
Hk+1=(I−γkskykT)Hk(I−γkskykT)+γkskskTγk=1/ykTsk
对称-秩一方法
当然,还有其他的一些 H k H_k Hk 更新方式,如图。
其中的对称-秩一(SR1)方法和 Broyden 族方法都比较有名,秩一更新依然能保证 B k B_k Bk 和 H k H_k Hk 的对称性以及能保持对割线方程的满足,不同的是,SR1 更新,不再保证其正定性。数值效果依然很好,具体的推导就不说了。
步长的选取
步长 α k \alpha_k αk 如何选取?只要保证 Wolfe 条件,就能保证其收敛性。取精确线搜索步长时,其值为 1。
只列出 BFGS 基本框架如图。
在迭代的过程中,我们不需要显性地去求 B k B_k Bk,我们用到的只是它的逆,所以,我们可以用其逆 H k H_k Hk 的迭代公式进行搜索迭代。给一个简单的代码示例:
clc
clear
f = @(t)t(1)^2+2*t(2)^2;
x0 = [10,10]';
epsilon = 0.001;
H0 = eye(2);
method = 'BFGS';%DFP
x = quasi_Newton(f,x0,epsilon,H0,method);
function [xk,k] = quasi_Newton(f,x0,epsilon,H0,method)
%使用:quasi_Newton(f,x0,method)
if nargin < 3
help mfilename;
end
k = 0;
syms t1 t2;
t = [t1,t2]';
fs = f(t);
dfs = gradient(fs);
df = matlabFunction(dfs);
df = @(x) df(x(1),x(2));
df0 = df(x0);
normdf = sqrt(df0'*df0);
H = H0;
xk = x0;
dfk = df0;
while normdf > epsilon
p = -H*dfk;
alpha = cal_alpha(H,dfk);
xk1 = xk + alpha*p;
dfk1 = df(xk1);
sk = xk1 - xk;
yk = dfk1 - dfk;
eval(['H = ' method '(H,sk,yk);']);
%H = BFGS(H,sk,yk);
k = k + 1;
xk = xk1;
dfk = dfk1;
normdf = sqrt(dfk'*dfk);
xk
end
end
function alpha = cal_alpha(H,dfk)
%alpha = dfk'*H*dfk/(dfk'*H'*dfk);
alpha = 1;
end
function H = BFGS(H,sk,yk)
gammak = 1/(yk'*sk);
skykT = sk * yk';
skskT = sk * sk';
E = eye(2);
H = (E-gammak*skykT)*H*(E-gammak*skykT) + gammak*skskT;
end
function H = DFP(H,sk,yk)
Hyk = H*yk;
ykTsk = yk'*sk;
skskT = sk * sk';
H = H - (Hyk*yk'*H)/(yk'*Hyk) + skskT/ykTsk;
end
其他内容
关于拟牛顿方法,还有狠多有趣的内容,包括但不仅限于其二次终止性、非对称 Rank-1 方法、BFGS 收敛率、BFGS 和 CG 的一个关系等,下面简要提两个。
BB 方法
在牛顿方法中,我们取
B
k
B_k
Bk 矩阵为单位矩阵,就得到了 BB 方法:
x
k
+
1
=
x
k
−
D
k
−
1
g
k
x_{k+1}=x_{k}-D_{k}^{-1} g_{k}
xk+1=xk−Dk−1gk
其中,
D
k
≡
α
k
I
D_{k} \equiv \alpha_{k} I
Dk≡αkI,这本质上也是梯度下降方法。步长的选取要让
D
k
D_k
Dk 尽可能地满足割线方程
B
k
s
k
−
1
=
y
k
−
1
B_{k} s_{k-1}=y_{k-1}
Bksk−1=yk−1,求解
min
D
=
α
I
∥
D
s
k
−
1
−
y
k
−
1
∥
2
\min _{D=\alpha I}\left\|D s_{k-1}-y_{k-1}\right\|_{2}
D=αImin∥Dsk−1−yk−1∥2
可得,所谓的BB步长,
α
k
B
B
=
s
k
−
1
T
s
k
−
1
s
k
−
1
T
y
k
−
1
\alpha_{k}^{B B}=\frac{s_{k-1}^{T} s_{k-1}}{s_{k-1}^{T} y_{k-1}}
αkBB=sk−1Tyk−1sk−1Tsk−1
对于凸函数
f
(
x
)
=
1
2
x
T
H
x
+
b
T
x
f(x)=\frac{1}{2} x^{T} H x+b^{T} x
f(x)=21xTHx+bTx,BB 步长就是
α
k
B
B
=
g
k
−
1
T
H
g
k
−
1
g
k
−
1
T
g
k
−
1
=
1
α
k
−
1
S
D
\alpha_{k}^{B B}=\frac{g_{k-1}^{T} H g_{k-1}}{g_{k-1}^{T} g_{k-1}}=\frac{1}{\alpha_{k-1}^{S D}}
αkBB=gk−1Tgk−1gk−1THgk−1=αk−1SD1
有限内存 BFGS 方法(L-BFGS)
对于大规模问题,BFGS 方法因其逼近矩阵 B k B_k Bk 和 H k H_k Hk 都是稠密的,那么必然消耗比较大。为了解决这个问题,工程上用得比较多的是有限内存(Limited-Memory)的 BFGS 方法,简称 L-BFGS。L-BFGS 的想法比较简单,就是在 H k H_k Hk 迭代的时候,我们只用到最近几步的曲率信息,而把之前的信息丢弃,然后来执行 BFGS 过程。也就是说,反正 BFGS 算着算着,误差累积,导致 H k H_k Hk 反正都差了精度,还不如丢弃了,重新从初值开始。这样还能降低 H k g k H_kg_k Hkgk 的计算量。L-BFGS 方法用得比较多。
最小二乘问题
问题描述
最小二乘问题,描述的是求解形如
min
f
(
x
)
=
1
2
∑
j
=
1
m
r
j
2
(
x
)
\min \quad f(x)=\frac{1}{2} \sum_{j=1}^{m} r_{j}^{2}(x)
minf(x)=21j=1∑mrj2(x)
的问题。
如果把
r
(
x
)
r(x)
r(x) 写成
r
(
x
)
=
(
r
1
(
x
)
,
r
2
(
x
)
,
⋯
,
r
m
(
x
)
)
T
r(x)=\left(r_{1}(x), r_{2}(x), \cdots, r_{m}(x)\right)^{T}
r(x)=(r1(x),r2(x),⋯,rm(x))T
那么最小二乘问题可以简洁地写为:
f
(
x
)
=
1
2
∥
r
(
x
)
∥
2
2
f(x)=\frac{1}{2}\|r(x)\|_{2}^{2}
f(x)=21∥r(x)∥22。
导数
r
r
r 雅克比矩阵的雅克比矩阵定义为:
J
(
x
)
=
[
∂
r
j
∂
x
i
]
=
[
∇
r
1
(
x
)
T
∇
r
2
(
x
)
T
⋮
∇
r
m
(
x
)
T
]
J(x)=\left[\frac{\partial r_{j}}{\partial x_{i}}\right]=\left[\begin{array}{c} {\nabla r_{1}(x)^{T}} \\ {\nabla r_{2}(x)^{T}} \\ {\vdots} \\ {\nabla r_{m}(x)^{T}} \end{array}\right]
J(x)=[∂xi∂rj]=⎣⎢⎢⎢⎡∇r1(x)T∇r2(x)T⋮∇rm(x)T⎦⎥⎥⎥⎤
如果
f
=
1
2
∑
j
=
1
m
r
j
2
(
x
)
=
1
2
∥
r
(
x
)
∥
2
f=\frac{1}{2} \sum_{j=1}^{m} r_{j}^{2}(x)=\frac{1}{2}\|r(x)\|^{2}
f=21j=1∑mrj2(x)=21∥r(x)∥2
那么梯度和 Hessian 矩阵可以表达为:
∇
f
(
x
)
=
∑
j
=
1
m
r
j
(
x
)
∇
r
j
(
x
)
=
J
(
x
)
T
r
(
x
)
∇
2
f
(
x
)
=
∑
j
=
1
m
∇
r
j
(
x
)
∇
r
j
(
x
)
T
+
∑
j
=
1
m
r
j
(
x
)
∇
2
r
j
(
x
)
=
J
(
x
)
T
J
(
x
)
+
∑
j
=
1
m
r
j
(
x
)
∇
2
r
j
(
x
)
\begin{aligned} \nabla f(x) &=\sum_{j=1}^{m} r_{j}(x) \nabla r_{j}(x)=J(x)^{T} r(x) \\ \nabla^{2} f(x) &=\sum_{j=1}^{m} \nabla r_{j}(x) \nabla r_{j}(x)^{T}+\sum_{j=1}^{m} r_{j}(x) \nabla^{2} r_{j}(x) \\ &=J(x)^{T} J(x)+\sum_{j=1}^{m} r_{j}(x) \nabla^{2} r_{j}(x) \end{aligned}
∇f(x)∇2f(x)=j=1∑mrj(x)∇rj(x)=J(x)Tr(x)=j=1∑m∇rj(x)∇rj(x)T+j=1∑mrj(x)∇2rj(x)=J(x)TJ(x)+j=1∑mrj(x)∇2rj(x)
线性最小二乘问题
对于线性最小二乘问题,
f
(
x
)
=
1
2
∥
J
x
−
y
∥
2
2
f(x)=\frac{1}{2}\|J x-y\|_{2}^{2}
f(x)=21∥Jx−y∥22
f
f
f 的一阶导和二阶导为:
∇
f
(
x
)
=
J
T
(
J
x
−
y
)
,
∇
2
f
(
x
)
=
J
T
J
\nabla f(x)=J^{T}(J x-y), \quad \nabla^{2} f(x)=J^{T} J
∇f(x)=JT(Jx−y),∇2f(x)=JTJ。极小值点要满足一阶必要性条件
∇
f
(
x
∗
)
=
0
\nabla f\left(x^{*}\right)=0
∇f(x∗)=0,那么原问题就等价于求解所谓的正规方程:
J
T
J
x
∗
=
J
T
y
J^{T} J x^{*}=J^{T} y
JTJx∗=JTy
J
T
J
J^{T} J
JTJ 是半正定的厄米特矩阵,如果
J
J
J 是列满秩的,那么
J
T
J
J^{T} J
JTJ 就是正定的,上述方程组的解存在唯一。
除了直接解法,求解最小二乘问题的算法还有 Cholesky 分解,QR 分解、SVD 分解、迭代逼近等等,这里就是不说了。
非线性最小二乘问题
求解非线性最小二乘问题有高斯-牛顿法、Levenberg-Marquardt 方法和截断 CG 方法,以及对应于大残差问题的方法的等等,时间关系,等到下一次再来补充。
非线性方程
这部分想表达的内容有牛顿方法扩展及其优缺点、非精确牛顿方法、Broyden 方法、评价函数等等,下次有空再来补充。
约束优化理论
拉格朗日条件和 KKT
x
x
x 对应的积极集是指等式约束指标集和不等式约束指标集中取到等式的那些指标的并:
A
(
x
)
=
E
∪
{
i
∈
I
∣
c
i
(
x
)
=
0
}
\mathcal{A}(x)=\mathcal{E} \cup\left\{i \in \mathcal{I} | c_{i}(x)=0\right\}
A(x)=E∪{i∈I∣ci(x)=0}
LICQ(linear independence constraint qualication)条件满足是说,积极约束梯度集合
{
∇
c
i
(
x
)
,
i
∈
A
(
x
)
}
\left\{\nabla c_{i}(x), i \in \mathcal{A}(x)\right\}
{∇ci(x),i∈A(x)}
是线性独立的。
定义一般约束优化问题的拉格朗日函数为:
L
(
x
,
λ
)
=
f
(
x
)
−
∑
i
∈
E
∪
I
λ
i
c
i
(
x
)
\mathcal{L}(x, \lambda)=f(x)-\sum_{i \in \mathcal{E} \cup \mathcal{I}} \lambda_{i} c_{i}(x)
L(x,λ)=f(x)−i∈E∪I∑λici(x)
假设
x
∗
x^*
x∗ 是问题
(
1
)
(1)
(1) 局部解,并且在
x
∗
x^*
x∗ 点LICQ条件成立。那么存在一个拉格朗日乘子向量
λ
∗
,
\lambda^{*},
λ∗,,它的分量表示为
λ
i
∗
,
i
∈
E
∪
I
\lambda_{i}^{*}, i \in \mathcal{E} \cup \mathcal{I}
λi∗,i∈E∪I,使以下几个条件在
(
x
∗
,
λ
∗
)
\left(x^{*}, \lambda^{*}\right)
(x∗,λ∗) 点处成立,
∇
x
L
(
x
∗
,
λ
∗
)
=
0
,
c
i
(
x
∗
)
=
0
,
∀
i
∈
E
c
i
(
x
∗
)
≥
0
,
∀
i
∈
I
λ
i
∗
≥
0
,
∀
i
∈
I
λ
i
∗
c
i
(
x
∗
)
=
0
,
∀
i
∈
E
∪
I
\begin{aligned} \nabla_{x} \mathcal{L}\left(x^{*}, \lambda^{*}\right)&=&0,&\\ c_{i}\left(x^{*}\right) &=& 0, & \forall i \in \mathcal{E}\\ c_{i}\left(x^{*}\right) & \geq & 0, & \forall i \in \mathcal{I} \\ \lambda_{i}^{*} & \geq & 0, & \forall i \in \mathcal{I} \\ \lambda_{i}^{*} c_{i}\left(x^{*}\right) &=& 0, & \forall i \in \mathcal{E} \cup \mathcal{I} \end{aligned}
∇xL(x∗,λ∗)ci(x∗)ci(x∗)λi∗λi∗ci(x∗)==≥≥=0,0,0,0,0,∀i∈E∀i∈I∀i∈I∀i∈E∪I
这几个条件就叫做著名的 Karush-Kuhn-Tucker 条件,简称 KKT 条件,这个方程系统,一般称为 KKT 系统。第一个条件是拉个朗日乘数法的要求,即极小化目标函数,极大化约束函数,极值点处对于各个变量的偏导为零。第二第三个条件分别为等式约束和不等式约束。以上三个条件都比较好记,都是已有的知识。后面两个条件,是对不等式约束而言的,叫做严格互补条件。一言以蔽之,就是对不等式约束指标对应的
λ
i
\lambda_i
λi 必须大等于零,且
λ
i
\lambda_i
λi 和
c
i
c_i
ci 之间必须有一个为零。互补性条件是对不等式约束而言的,没有不等式约束,就没有互补性条件。
对偶问题
考虑一个目标函数和约束函数是凹的凸优化问题,
min
x
∈
R
n
f
(
x
)
s.t.
c
(
x
)
≥
0
\min _{x \in \mathbb{R}^{n}} f(x) \quad \text { s.t. } \quad c(x) \geq 0
x∈Rnminf(x) s.t. c(x)≥0
它的对偶问题是,
max
λ
∈
R
m
q
(
λ
)
s.t.
λ
≥
0
\max _{\lambda \in \mathbb{R}^{m}} q(\lambda) \quad \text { s.t. } \quad \lambda \geq 0
λ∈Rmmaxq(λ) s.t. λ≥0
这里
q
(
λ
)
≡
inf
x
L
(
x
,
λ
)
q(\lambda) \equiv \inf _{x} \mathcal{L}(x, \lambda)
q(λ)≡infxL(x,λ)。对偶问题可以用来推导增广拉格朗日(augmented Lagrangian)方法。
其它
留一些关键词,等忙完手头的活儿,再来补充:局部解、孤立解、光滑性、单不等式约束、两不等式约束、线性化可行方向、切锥、稳定锥、wolfe 对偶…
非线性约束优化算法
积极集方法
求解非线性规划问题的一个挑战在于求解不等式约束。一个重要的逼近解的方法,就是积极集方法。
-
从一个初始的工作集 W \mathcal{W} W 开始,作为最优积极集 A ∗ \mathcal{A}^* A∗,所谓的最优积极集就是最优值对应的等式约束的指标集。
-
然后求解这样一个问题:工作集中对应的约束取到等式约束。
-
检查是否存在一个拉格朗日乘子使得上述问题的解是原问题的解。如果不是,我们改变工作集,重复以上过程。
其他内容
求解非线性约束优化,除了积极集方法还有内点法,消元法等等,在这里就不讲了。当然,这一节本该还有一些其他内容,比如硬约束、软约束、滤子等等,这里也不说。
二次规划
序列二次规划
我们考虑一个等式约束问题,
min
f
(
x
)
s.t.
c
(
x
)
=
0
\begin{aligned} &\min \quad f(x)\\ &\text { s.t. } \quad c(x)=0 \end{aligned}
minf(x) s.t. c(x)=0
这里
f
:
R
n
→
R
f: \mathbb{R}^{n} \rightarrow \mathbb{R}
f:Rn→R 并且
c
=
(
c
1
,
…
,
c
m
)
T
c=\left(c_{1}, \ldots, c_{m}\right)^{T}
c=(c1,…,cm)T,
c
i
:
R
n
→
R
c_{i}: \mathbb{R}^{n} \rightarrow \mathbb{R}
ci:Rn→R 是光滑函数。
我们知道这个问题的拉格朗日函数是:
L
(
x
,
λ
)
=
f
(
x
)
−
λ
T
c
(
x
)
\mathcal{L}(x, \lambda)=f(x)-\lambda^{T} c(x)
L(x,λ)=f(x)−λTc(x)
我们使用
A
(
x
)
A(x)
A(x) 去表示约束的雅克比矩阵,
A
(
x
)
T
=
[
∇
c
1
(
x
)
,
∇
c
2
(
x
)
,
⋯
,
∇
c
m
(
x
)
]
A(x)^{T}=\left[\nabla c_{1}(x), \nabla c_{2}(x), \cdots, \nabla c_{m}(x)\right]
A(x)T=[∇c1(x),∇c2(x),⋯,∇cm(x)]
由 KKT 条件,可得,
F
(
x
,
λ
)
=
[
∇
f
(
x
)
−
A
(
x
)
T
λ
c
(
x
)
]
=
0
F(x, \lambda)=\left[\begin{array}{c} {\nabla f(x)-A(x)^{T} \lambda} \\ {c(x)} \end{array}\right]=0
F(x,λ)=[∇f(x)−A(x)Tλc(x)]=0
接下来我们可以使用牛顿方法来求解这个非线性方程。
F
F
F 关于
x
x
x 和
λ
\lambda
λ 的雅克比矩阵是,
F
′
(
x
,
λ
)
=
[
∇
x
x
2
L
(
x
,
λ
)
−
A
(
x
)
T
A
(
x
)
0
]
F^{\prime}(x, \lambda)=\left[\begin{array}{cc} {\nabla_{x x}^{2} \mathcal{L}(x, \lambda)} & {-A(x)^{T}} \\ {A(x)} & {0} \end{array}\right]
F′(x,λ)=[∇xx2L(x,λ)A(x)−A(x)T0]
那么牛顿迭代就是:
[
x
k
+
1
λ
k
+
1
]
=
[
x
k
λ
k
]
+
[
p
k
p
λ
]
\left[\begin{array}{c} {x_{k+1}} \\ {\lambda_{k+1}} \end{array}\right]=\left[\begin{array}{l} {x_{k}} \\ {\lambda_{k}} \end{array}\right]+\left[\begin{array}{l} {p_{k}} \\ {p_{\lambda}} \end{array}\right]
[xk+1λk+1]=[xkλk]+[pkpλ]
这里的
p
k
p_k
pk 和
p
λ
p_\lambda
pλ 是求解下面的牛顿-KKT 系统得到:
[
∇
x
x
2
L
k
−
A
k
T
A
k
0
]
[
p
k
p
λ
]
=
[
−
∇
f
k
+
A
k
T
λ
k
−
c
k
]
\left[\begin{array}{cc} {\nabla_{x x}^{2} \mathcal{L}_{k}} & {-A_{k}^{T}} \\ {A_{k}} & {0} \end{array}\right]\left[\begin{array}{l} {p_{k}} \\ {p_{\lambda}} \end{array}\right]=\left[\begin{array}{c} {-\nabla f_{k}+A_{k}^{T} \lambda_{k}} \\ {-c_{k}} \end{array}\right]
[∇xx2LkAk−AkT0][pkpλ]=[−∇fk+AkTλk−ck]
这个方法一般就叫做牛顿-拉格朗日方法,对于 KKT 矩阵是非奇异的情况下还是很好用的。它具有二次收敛性。
我们可以换一个视角来看上面的牛顿迭代。假设我们在迭代过程中定义二次规划问题:
min
p
f
k
+
∇
f
k
T
p
+
1
2
p
T
∇
x
x
2
L
k
p
s.t.
A
k
p
+
c
k
=
0
\begin{array}{ll} {\min _{p}} & {f_{k}+\nabla f_{k}^{T} p+\frac{1}{2} p^{T} \nabla_{x x}^{2} \mathcal{L}_{k} p} \\ {\text { s.t. }} & {A_{k} p+c_{k}=0} \end{array}
minp s.t. fk+∇fkTp+21pT∇xx2LkpAkp+ck=0
在一些假设满足的条件下(LICQ),这个问题有一个唯一的解
(
p
k
,
l
k
)
\left(p_{k}, l_{k}\right)
(pk,lk),满足,
∇
x
x
2
L
k
p
k
+
∇
f
k
−
A
k
T
l
k
=
0
A
k
p
k
+
c
k
=
0
\begin{aligned} \nabla_{x x}^{2} \mathcal{L}_{k} p_{k}+\nabla f_{k}-A_{k}^{T} l_{k} &=0 \\ A_{k} p_{k}+c_{k} &=0 \end{aligned}
∇xx2Lkpk+∇fk−AkTlkAkpk+ck=0=0
仔细观察和对比,我们貌似可以发现,求解这个问题,好像就是在求解前面的牛顿-拉格朗日迭代的方向。将上面求牛顿方向系统的第一式的等式两边同时减去
A
k
T
λ
k
A_{k}^{T} \lambda_{k}
AkTλk,就得到
[
∇
x
x
2
L
k
−
A
k
T
A
k
0
]
[
p
k
λ
k
+
1
]
=
[
−
∇
f
k
−
c
k
]
\left[\begin{array}{cc} {\nabla_{x x}^{2} \mathcal{L}_{k}} & {-A_{k}^{T}} \\ {A_{k}} & {0} \end{array}\right]\left[\begin{array}{c} {p_{k}} \\ {\lambda_{k+1}} \end{array}\right]=\left[\begin{array}{c} {-\nabla f_{k}} \\ {-c_{k}} \end{array}\right]
[∇xx2LkAk−AkT0][pkλk+1]=[−∇fk−ck]
对比中,我们可以发现,在迭代中,我们只要求解这个问题,并令
l
k
=
λ
k
+
1
=
p
λ
+
λ
k
l_k=\lambda_{k+1}=p_\lambda+\lambda_k
lk=λk+1=pλ+λk,也就解决了牛顿迭代求方向问题,上面的二次迭代问题也就迎刃而解了。这也就是所谓的序列二次规划(SQP)方法,贴一个算法框架,如图。
二次规划的内点法
可行域指的是满足不等式和等式约束的那些点的集合。内点法也叫障碍法,保证迭代的点始终在可行域当中,而跑出不等式约束定义的高高的"围墙障碍",故叫它内点法。
考虑一个带不等式约束的凸二次规划问题:
min
x
q
(
x
)
≡
1
2
x
T
G
x
+
x
T
c
s.t.
A
x
≥
b
\begin{array}{ll} {\min _{x}} & {q(x) \equiv \frac{1}{2} x^{T} G x+x^{T} c} \\ {\text {s.t.}} & {A x \geq b} \end{array}
minxs.t.q(x)≡21xTGx+xTcAx≥b
这里的
G
G
G 是对称半正定的,
A
A
A 是
m
×
n
m\times n
m×n 的。这个问题的 KKT 系统可以用松弛的方式写出,即
G
x
−
A
T
λ
+
c
=
0
A
x
−
y
−
b
=
0
y
i
λ
i
=
0
,
i
=
1
,
2
,
⋯
,
m
(
y
,
λ
)
≥
0
\begin{aligned} G x-A^{T} \lambda+c &=0 \\ A x-y-b &=0 \\ y_{i} \lambda_{i} &=0, \quad i=1,2, \cdots, m \\ (y, \lambda) & \geq 0 \end{aligned}
Gx−ATλ+cAx−y−byiλi(y,λ)=0=0=0,i=1,2,⋯,m≥0
我们可以求解这个KKT系统来得到原问题的解。给定一个当前的迭代
(
x
,
y
,
λ
)
(x, y, \lambda)
(x,y,λ),它满足
(
y
,
λ
)
>
0
(y, \lambda)>0
(y,λ)>0,我们定义一个互补性度量,
μ
=
y
T
λ
m
\mu=\frac{y^{T} \lambda}{m}
μ=myTλ
我们想使用原-对偶方法,考虑扰动的 KKT 系统:
F
(
x
,
y
,
λ
,
σ
,
μ
)
=
[
G
x
−
A
T
λ
+
c
A
x
−
y
−
b
Y
Λ
e
−
σ
μ
e
]
=
0
F(x, y, \lambda, \sigma, \mu)=\left[\begin{array}{c} {G x-A^{T} \lambda+c} \\ {A x-y-b} \\ {\mathcal{Y} \Lambda e-\sigma \mu e} \end{array}\right]=0
F(x,y,λ,σ,μ)=⎣⎡Gx−ATλ+cAx−y−bYΛe−σμe⎦⎤=0
这里
Y
=
diag
(
y
1
,
⋯
,
y
m
)
,
Λ
=
diag
(
λ
1
,
⋯
,
λ
m
)
,
e
=
(
1
,
⋯
,
1
)
T
\mathcal{Y}=\operatorname{diag}\left(y_{1}, \cdots, y_{m}\right), \Lambda=\operatorname{diag}\left(\lambda_{1}, \cdots, \lambda_{m}\right), e=(1, \cdots, 1)^{T}
Y=diag(y1,⋯,ym),Λ=diag(λ1,⋯,λm),e=(1,⋯,1)T
并且
σ
∈
[
0
,
1
]
\sigma \in[0,1]
σ∈[0,1]。固定
μ
\mu
μ 对上述系统使用牛顿方法,我们可以得到线性系统,
[
G
0
−
A
T
A
−
I
0
0
Λ
Y
]
[
Δ
x
Δ
y
Δ
λ
]
=
[
−
(
G
x
−
A
T
λ
+
c
)
−
(
A
x
−
y
−
b
)
−
Λ
y
e
+
σ
μ
e
]
\left[\begin{array}{ccc}{G} & {0} & {-A^{T}} \\ {A} & {-I} & {0} \\ {0} & {\Lambda} & {\mathcal{Y}}\end{array}\right]\left[\begin{array}{c}{\Delta x} \\ {\Delta y} \\ {\Delta \lambda}\end{array}\right]=\left[\begin{array}{c}{-\left(G x-A^{T} \lambda+c\right)} \\ {-(A x-y-b)} \\ {-\Lambda y e+\sigma \mu e}\end{array}\right]
⎣⎡GA00−IΛ−AT0Y⎦⎤⎣⎡ΔxΔyΔλ⎦⎤=⎣⎡−(Gx−ATλ+c)−(Ax−y−b)−Λye+σμe⎦⎤
我们能得到下一步迭代,通过设置
(
x
+
,
y
+
,
λ
+
)
=
(
x
,
y
,
λ
)
+
α
(
Δ
x
,
Δ
y
,
Δ
λ
)
\left(x^{+}, y^{+}, \lambda^{+}\right)=(x, y, \lambda)+\alpha(\Delta x, \Delta y, \Delta \lambda)
(x+,y+,λ+)=(x,y,λ)+α(Δx,Δy,Δλ)
这里
α
\alpha
α 的选择使得不等式约束
(
y
+
,
λ
+
)
>
0
\left(y^{+}, \lambda^{+}\right)>0
(y+,λ+)>0 被满足,且尽可能地满足更多的条件。
其它
等式约束二次规划:对称无限期分解、shur补方法、零空间方法、Krylov方法(GMRES、QMR、LSQR)、CG 方法。
不等式约束:积极集方法,梯度投影方法,内点法。
有界约束优化。
梯度投影方法。
罚方法
l 1 l_1 l1和二次罚方法
惩罚函数法是求解有约束的最优化问题的一种算法。惩罚函数法的要旨是将一个有约束的最优化问题转化为一系列的无约束问题,这些无约束问题由原问题及罚函数,再加上惩罚因子组成。而且,这些无约束问题的解会收敛于所求问题的解。
一般的约束优化问题是:
min
x
∈
R
n
f
(
x
)
subject to
c
i
(
x
)
=
0
,
i
∈
E
=
{
1
,
…
,
m
e
}
c
i
(
x
)
≥
0
,
i
∈
I
=
{
m
e
+
1
,
…
,
m
}
\begin{array}{cl} {\min _{x \in \mathbb{R}^{n}}} & {f(x)} \\ {\text { subject to }} & {c_{i}(x)=0, \quad i \in \mathcal{E}=\left\{1, \ldots, m_{e}\right\}} \\ {} & {c_{i}(x) \geq 0, \quad i \in \mathcal{I}=\left\{m_{e}+1, \ldots, m\right\}} \end{array}
minx∈Rn subject to f(x)ci(x)=0,i∈E={1,…,me}ci(x)≥0,i∈I={me+1,…,m}
怎么构造罚函数?
l
1
l_1
l1 罚函数定义为:
ϕ
1
(
x
;
μ
)
=
f
(
x
)
+
μ
∑
i
∈
E
∣
c
i
(
x
)
∣
+
μ
∑
i
∈
I
∣
c
i
(
x
)
∣
−
\phi_{1}(x ; \mu)=f(x)+\mu \sum_{i \in \mathcal{E}}\left|c_{i}(x)\right|+\mu \sum_{i \in \mathcal{I}}\left|c_{i}(x)\right|^{-}
ϕ1(x;μ)=f(x)+μi∈E∑∣ci(x)∣+μi∈I∑∣ci(x)∣−
这里
[
z
]
−
=
max
{
0
,
−
z
}
[z]^{-}=\max \{0,-z\}
[z]−=max{0,−z},
μ
\mu
μ 是罚因子。除了
l
1
l_1
l1 罚方法,还有二次罚方法。考虑等式约束问题,
min
x
f
(
x
)
s.t.
c
i
(
x
)
=
0
,
i
∈
E
\min _{x} f(x) \quad \text{s.t.} c_{i}(x)=0, \quad i \in \mathcal{E}
xminf(x)s.t.ci(x)=0,i∈E
那么它的罚函数就可以写为,
Q
(
x
;
μ
)
≡
f
(
x
)
+
μ
2
c
i
2
(
x
)
Q(x ; \mu) \equiv f(x)+\frac{\mu}{2} c_{i}^{2}(x)
Q(x;μ)≡f(x)+2μci2(x)
一般的二次罚函数方法是,对于一般的约束问题,
min
x
f
(
x
)
s.t.
c
i
(
x
)
=
0
,
i
∈
E
;
c
i
(
x
)
≥
0
,
i
∈
I
\min _{x} f(x) \quad \text { s.t. } c_{i}(x)=0, i \in \mathcal{E} ; c_{i}(x) \geq 0, i \in \mathcal{I}
xminf(x) s.t. ci(x)=0,i∈E;ci(x)≥0,i∈I
它的二次罚函数定义为,
Q
(
x
;
μ
)
≡
f
(
x
)
+
μ
2
c
i
2
(
x
)
+
μ
2
∑
i
∈
I
(
[
c
i
(
x
)
]
−
)
2
Q(x ; \mu) \equiv f(x)+\frac{\mu}{2} c_{i}^{2}(x)+\frac{\mu}{2} \sum_{i \in \mathcal{I}}\left(\left[c_{i}(x)\right]^{-}\right)^{2}
Q(x;μ)≡f(x)+2μci2(x)+2μi∈I∑([ci(x)]−)2
这里
[
y
]
−
:
=
max
(
−
y
,
0
)
[y]^{-}:=\max (-y, 0)
[y]−:=max(−y,0)。
增广拉格朗日乘子法
增广拉格朗日法(Augmented Lagrange Method,简称ALM)是对二次惩罚法的一种改进。为了用无约束的目标函数替代原约束问题,二次惩罚法要求二次惩罚项的系数趋近于无穷(对约束的偏离给予很高的惩罚),但是这种要求会使得替代的目标函数的 Hessian 矩阵趋近于无穷(病态)。这使得替代函数的优化变得很困难,尤其是在最优点的附近。目标函数的行为很诡异,用二阶的泰勒公式逼近的话只有在非常小的区域内有效,因此收敛速度非常的慢。通过牛顿方程来计算下降方向会由于 Hessian 矩阵的病态性而变得很不准确。
为了解决这个问题,在二次惩罚的基础上引入了线性逼近的部分。个人感觉这种方法可以这样感性的理解:线性项和二次惩罚项实际是对约束偏离的一种惩罚,只不过他们有各自的针对性,二次项比较适合惩罚大的偏离,而小的偏离,只有当其系数很大时才起作用。相反,线性项比较适合小的偏离,而大的偏离二次项比它要好。那么这样的互补就能够使得在二次项系数比较小的情况下依然适用。而理论上恰恰可以验证这一点。细心的人就会发现,为什么不直接用拉格朗日乘子法求呢?这就是ALM算法巧妙的地方,因为多出一个二次惩罚项会使得算法的收敛速度很快。而且增广拉格朗日乘子法比拉格朗日乘子法普适性更好,需要的条件更加温和,比如不要求原函数是强凸的,甚至可以是非凸的。而且原函数在趋近于无穷的条件下,拉格朗日乘子法就无能为力了,可以用增广拉格朗日乘子法。究其原因,是因为二次惩罚项具有很好的矫正作用,在原函数非凸的情况下,只要满足一定的条件(二次惩罚项系数足够大),增广拉格朗日函数在最优点处的二阶导是正定的,因此具有严格的局部极小值。
增广拉格朗日方法其实是拉格朗日乘数法和二次罚方法的一个结合,比如,对于等式约束问题,增广拉格朗日函数写为:
L
A
(
x
,
λ
;
μ
)
≡
f
(
x
)
−
∑
i
∈
E
λ
i
c
i
(
x
)
+
μ
2
∑
i
∈
E
c
i
2
(
x
)
\mathcal{L}_{A}(x, \lambda ; \mu) \equiv f(x)-\sum_{i \in \mathcal{E}} \lambda_{i} c_{i}(x)+\frac{\mu}{2} \sum_{i \in \mathcal{E}} c_{i}^{2}(x)
LA(x,λ;μ)≡f(x)−i∈E∑λici(x)+2μi∈E∑ci2(x)
交替方向乘子法(ADMM)
网上的一些资料根本就没有把ADMM的来龙去脉说清楚,发现只是一个地方简单写了一下流程,别的地方就各种抄,共轭函数,对偶梯度上升什么的,都没讲清楚,给跪了。下面我来讲讲在机器学习中用得很多的ADMM方法到底是何方神圣。
共轭函数
给定函数
f
:
R
n
→
R
f: \mathbb{R}^{n} \rightarrow \mathbb{R}
f:Rn→R,那么函数
f
∗
(
y
)
=
max
x
(
y
T
x
−
f
(
x
)
)
f^{*}(y)=\max _{x}( y^{T} x-f(x))
f∗(y)=xmax(yTx−f(x))
就叫做它的共轭函数。其实一个更直观的理解是:对一个固定的
y
y
y,将
y
T
x
y^Tx
yTx 看成是一条斜率为
y
y
y 的直线,它和
f
(
x
)
f(x)
f(x) 关于
x
x
x 的距离的最大值,就是
f
∗
(
y
)
f^*(y)
f∗(y)。百度百科有关于这个直观说法的一个解释,看看就明白了。
关于共轭函数有几点重要的说明:
-
不管 f f f 凸不凸,它的共轭函数总是一个凸函数。
-
如果 f f f 是闭凸的(闭指定义域是闭的),那么 f ∗ ∗ = f f^{**}=f f∗∗=f。
-
如果 f f f 是严格凸的,那么
∇ f ∗ ( y ) = argmin z ( f ( z ) − y T z ) \nabla f^{*}(y)=\underset{z}{\operatorname{argmin}} (f(z)-y^{T} z) ∇f∗(y)=zargmin(f(z)−yTz) -
共轭总是频频出现在对偶规划中,因为极小问题总是容易凑出一个共轭: − f ∗ ( y ) = min x ( f ( x ) − y T x ) -f^{*}(y)=\min _{x} (f(x)-y^{T} x) −f∗(y)=minx(f(x)−yTx)。
关于 f ∗ f^* f∗ 的凸性,这篇博客给了一个比较直观的图示说明,下面我从数学上,不太严格地做个简单证明。以一维的情况说明。
假设
f
f
f 是一个凸函数,下面都不妨考虑函数的最值都不再边界处取到。
max
x
(
y
x
−
f
(
x
)
)
\max _{x} (yx-f(x))
maxx(yx−f(x)) 的极值点在
f
x
′
(
x
)
=
y
f'_x(x)=y
fx′(x)=y 处取到,定义
g
:
=
(
f
x
′
)
−
1
g:=(f'_x)^{-1}
g:=(fx′)−1,那么
x
=
g
(
y
)
x=g(y)
x=g(y) 可能会是一堆点。则有
f
∗
(
y
)
=
max
x
(
y
x
−
f
(
x
)
)
=
y
g
(
x
)
−
f
(
g
(
y
)
)
f^*(y)=\max _{x}(yx-f(x))=yg(x)-f(g(y))
f∗(y)=xmax(yx−f(x))=yg(x)−f(g(y))
进而
(
f
∗
(
y
)
)
y
′
=
g
(
y
)
+
y
g
y
′
(
y
)
−
f
x
′
(
g
(
y
)
)
g
y
′
(
y
)
=
g
(
y
)
(f^*(y))'_y = g(y)+yg'_y(y)-f'_x(g(y))g'_y(y) = g(y)
(f∗(y))y′=g(y)+ygy′(y)−fx′(g(y))gy′(y)=g(y)
那么
(
f
∗
(
y
)
)
y
′
′
y
=
g
y
′
(
y
)
=
(
(
f
x
′
)
−
1
)
y
′
≥
0
(f^*(y))''_yy=g'_y(y)=((f'_x)^{-1})'_y \geq 0
(f∗(y))y′′y=gy′(y)=((fx′)−1)y′≥0
故而,
f
∗
f^*
f∗ 是凸的。
关于
f
∗
∗
=
f
f^{**}=f
f∗∗=f,也是容易证明的。我们假设
f
f
f 是闭凸的。
max
y
(
z
y
−
f
∗
(
y
)
)
\max _y(zy-f^*(y))
maxy(zy−f∗(y)) 的值在
g
(
y
)
=
z
g(y)=z
g(y)=z 处取到,那么
f
∗
∗
(
z
)
=
max
y
(
z
y
−
f
∗
(
y
)
)
=
f
(
g
(
g
−
1
(
z
)
)
)
=
f
(
z
)
f^{**}(z) = \max_y(zy-f^{*}(y))=f(g(g^{-1}(z)))=f(z)
f∗∗(z)=ymax(zy−f∗(y))=f(g(g−1(z)))=f(z)
z
z
z 换成
x
x
x 就是
f
(
x
)
f(x)
f(x)。
第三条非常重要,它说明了共轭函数的梯度,其实就是共轭函数取到极大值对应的 x x x 值,它从 ( f ∗ ( y ) ) y ′ = g ( y ) (f*(y))'_y = g(y) (f∗(y))y′=g(y) 就可以看出来。
对偶梯度上升法
有了上知识的铺垫,我们就可以说清楚对偶上升方法了。以考虑等式约束问题为例(一般约束问题也是类似的流程),假设
f
(
x
)
f(x)
f(x) 是严格凸的,我们考虑问题:
min
x
f
(
x
)
subject to
A
x
=
b
\min _{x} f(x) \text { subject to } A x=b
xminf(x) subject to Ax=b
它的拉格朗日对偶问题是:
max
u
min
x
(
f
(
x
)
+
u
T
(
A
x
−
b
)
)
\max _{u}\min _{x} (f(x)+u^T(Ax-b))
umaxxmin(f(x)+uT(Ax−b))
有理论表明,若原问题和对偶问题满足强对偶条件,即对偶函数关于
u
u
u 的最大值等价于原优化问题关于
x
x
x 的最小。那么原问题和对偶问题对于
x
x
x 是同解的。也就是说只要找到使得对偶问题对应最大的
u
u
u,其对应的
x
x
x 就是原优化问题的解,那么我们就解决了原始优化问题。
所以,下面我们来求解这个对偶问题。先把和
x
x
x 无关的变量提出
min
x
\min _x
minx,再想办法凑出
f
∗
f^*
f∗,因为我们要用到对偶的性质。
KaTeX parse error: No such environment: split at position 7: \begin{̲s̲p̲l̲i̲t̲}̲ \max _u \min…
那么对偶问题就成了
max
u
−
f
∗
(
−
A
T
u
)
−
b
T
u
\max _{u}-f^{*}\left(-A^{T} u\right)-b^{T} u
umax−f∗(−ATu)−bTu
这里
f
∗
f^*
f∗ 是
f
f
f 的共轭,这里
max
u
\max _u
maxu 后面不加括号,表示它管着下面的所有,下同,不再重述。定义
g
(
u
)
=
−
f
∗
(
−
A
T
u
)
−
b
T
u
g(u)=-f^{*}\left(-A^{T} u\right)-b^{T} u
g(u)=−f∗(−ATu)−bTu,我们希望能极大化
g
(
u
)
g(u)
g(u),一个简单的想法是沿着
g
(
u
)
g(u)
g(u) 梯度上升的方向去走。注意到,
∂
g
(
u
)
=
A
∂
f
∗
(
−
A
T
u
)
−
b
\partial g(u)=A \partial f^{*}\left(-A^{T} u\right)-b
∂g(u)=A∂f∗(−ATu)−b
因此,利用共轭的性质,
∂
g
(
u
)
=
A
x
−
b
where
x
∈
argmin
z
f
(
z
)
+
u
T
A
z
\partial g(u)=A x-b \text { where } x \in \underset{z}{\operatorname{argmin}} f(z)+u^{T} A z
∂g(u)=Ax−b where x∈zargminf(z)+uTAz
因为
f
f
f 是严格凸的,
f
∗
f^*
f∗ 是可微的,那么,就有了所谓的对偶梯度上升方法。从一个对偶初值
u
(
0
)
u^{(0)}
u(0) 开始,重复以下过程:
x
(
k
)
=
argmin
x
f
(
x
)
+
(
u
(
k
−
1
)
)
T
A
x
u
(
k
)
=
u
(
k
−
1
)
+
t
k
(
A
x
(
k
)
−
b
)
\begin{aligned} &x^{(k)}=\underset{x}{\operatorname{argmin}} f(x)+\left(u^{(k-1)}\right)^{T} A x\\ &u^{(k)}=u^{(k-1)}+t_{k}\left(A x^{(k)}-b\right) \end{aligned}
x(k)=xargminf(x)+(u(k−1))TAxu(k)=u(k−1)+tk(Ax(k)−b)
这里的步长
t
k
t_k
tk 使用标准的方式选取的。近端梯度和加速可以应用到这个过程中进行优化。
交替方向乘子法
交替方向乘子法(ADMM)是一种求解具有可分离的凸优化问题的重要方法,由于处理速度快,收敛性能好,ADMM算法在统计学习、机器学习等领域有着广泛应用。ADMM算法一般用于解决如下的凸优化问题:
min
x
,
y
f
(
x
)
+
g
(
y
)
subject to
A
x
+
B
y
=
c
\min _{x, y} f(x)+g(y) \text { subject to } A x+B y=c
x,yminf(x)+g(y) subject to Ax+By=c
其中的
f
f
f 和
g
g
g 都是凸函数。
它的增广拉格朗日函数如下:
L
p
(
x
,
y
,
λ
)
=
f
(
x
)
+
g
(
y
)
+
λ
T
(
A
x
+
B
y
−
c
)
+
(
ρ
/
2
)
∥
A
x
+
B
y
−
c
∥
2
2
,
ρ
>
0
L_{p}(x, y, \lambda)=f(x)+g(y)+\lambda^{T}(A x+B y-c)+(\rho / 2)\|A x+B y-c\|_{2}^{2}, \rho>0
Lp(x,y,λ)=f(x)+g(y)+λT(Ax+By−c)+(ρ/2)∥Ax+By−c∥22,ρ>0
ADMM算法求解思想和推导同梯度上升法,最后重复迭代以下过程:
x
k
+
1
:
=
arg
min
x
L
p
(
x
,
y
,
λ
)
x
k
+
1
:
=
arg
min
y
L
p
(
x
,
y
,
λ
)
λ
k
+
1
:
=
λ
k
+
ρ
(
A
x
k
+
1
+
B
y
k
+
1
−
c
)
\begin{aligned} x^{k+1} &:=\arg \min _x L_{p}(x, y, \lambda) \\ x^{k+1} &:=\arg \min _y L_{p}(x, y, \lambda) \\ \lambda^{k+1} &:=\lambda^{k}+\rho\left(A x^{k+1}+B y^{k+1}-c\right) \end{aligned}
xk+1xk+1λk+1:=argxminLp(x,y,λ):=argyminLp(x,y,λ):=λk+ρ(Axk+1+Byk+1−c)
上述迭代可以进行简化。
-
第一步简化,通过公式 ∥ a + b ∥ 2 2 = ∥ a ∥ 2 2 + ∥ b ∥ 2 2 + 2 a T b \|a+b\|_{2}^{2}=\|a\|_{2}^{2}+\|b\|_{2}^{2}+2 a^{T} b ∥a+b∥22=∥a∥22+∥b∥22+2aTb,替换掉拉格朗日函数中的线性项 λ T ( A x + B y − c ) \lambda^{T}(A x+B y-c) λT(Ax+By−c) 和二次项 ρ / 2 ∥ A x + B y − c ∥ 2 2 \rho/2\|A x+B y-c\|_{2}^{2} ρ/2∥Ax+By−c∥22,可以得到
λ T ( A x + B y − c ) + ρ / 2 ∥ A x + B y − c ∥ 2 2 = ρ / 2 ∥ A x + B y − c + λ / ρ ∥ 2 2 − ρ / 2 ∥ λ / ρ ∥ 2 2 \lambda^{T}(A x+B y-c)+\rho/2\|A x+B y-c\|_{2}^{2}=\rho / 2\|A x+B y-c+\lambda/\rho\|_{2}^{2}-\rho / 2\|\lambda / \rho\|_{2}^{2} λT(Ax+By−c)+ρ/2∥Ax+By−c∥22=ρ/2∥Ax+By−c+λ/ρ∥22−ρ/2∥λ/ρ∥22
那么ADMM的过程可以化简如下:
x k + 1 : = arg min x ( f ( x ) + ρ / 2 ∥ A x + B y k − c + λ k / ρ ∥ 2 2 y k + 1 : = arg min y ( g ( y ) + ρ / 2 ∥ A x k + 1 + B y − c + λ k / ρ ∥ 2 2 λ k + 1 : = λ k + ρ ( A x k + 1 + B y k + 1 − c ) \begin{aligned} x^{k+1} &:={\arg \min _x}\left(f(x)+\rho / 2\left\|A x+B y^{k}-c+\lambda^{k} / \rho\right\|_{2}^{2}\right.\\ y^{k+1} &:={\arg \min _y}\left(g(y)+\rho / 2\left\|A x^{k+1}+B y-c+\lambda^{k} / \rho\right\|_{2}^{2}\right.\\ \lambda^{k+1} &:=\lambda^{k}+\rho\left(A x^{k+1}+B y^{k+1}-c\right) \end{aligned} xk+1yk+1λk+1:=argxmin(f(x)+ρ/2∥∥Ax+Byk−c+λk/ρ∥∥22:=argymin(g(y)+ρ/2∥∥Axk+1+By−c+λk/ρ∥∥22:=λk+ρ(Axk+1+Byk+1−c) -
第二步化简,零缩放对偶变量 u = λ / ρ u = \lambda/\rho u=λ/ρ,于是ADMM过程可化简为:
x k + 1 : = arg min ( f ( x ) + ρ / 2 ∥ A x + B y k − c + u k ∥ 2 2 y k + 1 : = arg min ( g ( y ) + ρ / 2 ∥ A x k + 1 + B y − c + u k ∥ 2 2 u k + 1 : = u k + ( A x k + 1 + B y k + 1 − c ) \begin{aligned} x^{k+1} &:={\arg \min}\left(f(x)+\rho / 2\left\|A x+B y^{k}-c+u^{k}\right\|_{2}^{2}\right.\\ y^{k+1} &:={\arg \min}\left(g(y)+\rho / 2\left\|A x^{k+1}+B y-c+u^{k}\right\|_{2}^{2}\right.\\ u^{k+1} &:=u^{k}+\left(A x^{k+1}+B y^{k+1}-c\right) \end{aligned} xk+1yk+1uk+1:=argmin(f(x)+ρ/2∥∥Ax+Byk−c+uk∥∥22:=argmin(g(y)+ρ/2∥∥Axk+1+By−c+uk∥∥22:=uk+(Axk+1+Byk+1−c)
ADMM相当于把一个大的问题分成了两个子问题,缩小了问题的规模,分而治之。
[help me with MathJax]