总目录
一、 凸优化基础(Convex Optimization basics)
二、 一阶梯度方法(First-order methods)
- 梯度下降(Gradient Descent)
- 次梯度(Subgradients)
- 近端梯度法(Proximal Gradient Descent)
- 随机梯度下降(Stochastic gradient descent)
三、对偶
- 线性规划中的对偶(Duality in linear programs)
- 凸优化中的对偶(Duality in General Programs)
- KKT条件(Karush-Kuhn-Tucker Conditions)
- 对偶的应用及拓展(Duality Uses and Correspondences)
- 对偶方法(Dual Methods)
- 交替方向乘子法(Alternating Direction Method of Multipliers)
近端梯度法(Proximal Gradient Descent)
在凸优化问题中,对于可微分的目标函数,我们可以通过梯度下降法(gradient descent)迭代求解最优解,而对于不可微分的目标函数,通过引入次梯度(subgradient)也可以迭代求解最优解,然而比起梯度下降法,次梯度法的速度比较缓慢。为此,针对于一些整体不可微分但却可以分解的目标函数来说,我们可以使用一种更快的算法——近端梯度法。
1. 可分解的目标函数
考虑一个目标函数可以分解为如下形式的两个函数:
f
(
x
)
=
g
(
x
)
+
h
(
x
)
(1)
f(x)=g(x)+h(x) \tag{1}
f(x)=g(x)+h(x)(1)
其中, g ( x ) g(x) g(x)是凸函数且是可微分的, h ( x ) h(x) h(x)也是凸函数但可能不可微分。使用近端梯度下降,可以实现 O ( 1 / ϵ ) O(1/\epsilon) O(1/ϵ)的收敛率( ϵ = f ( x ( k ) ) − f ( x ∗ ) \epsilon=f(x^{(k)})-f(x^*) ϵ=f(x(k))−f(x∗),即当前迭代结果与最优解之间的偏差)。通过对近端梯度法加速,可以达到 O ( 1 / ϵ ) O(1/\sqrt\epsilon) O(1/ϵ)收敛速率。
2. 梯度下降法回顾
对于一个可微分的凸函数
f
(
z
)
f(z)
f(z),假设起始点在
x
x
x,则可以做二阶泰勒展开:
f
(
z
)
≈
f
(
x
)
+
∇
f
(
x
)
T
(
z
−
x
)
+
1
2
∇
2
f
(
x
)
∥
z
−
x
∥
2
2
(2)
f(z)\approx f(x)+\nabla f(x)^T(z-x)+\frac{1}{2}\nabla^2f(x)\|z-x\|^2_2 \tag{2}
f(z)≈f(x)+∇f(x)T(z−x)+21∇2f(x)∥z−x∥22(2)
通过替换
∇
2
f
(
x
)
=
1
t
I
\nabla^2f(x)=\frac{1}{t}I
∇2f(x)=t1I,可以得到
f
(
z
)
≈
f
(
x
)
+
∇
f
(
x
)
T
(
z
−
x
)
+
1
2
t
∥
z
−
x
∥
2
2
(3)
f(z)\approx f(x)+\nabla f(x)^T(z-x)+\frac{1}{2t}\|z-x\|^2_2 \tag{3}
f(z)≈f(x)+∇f(x)T(z−x)+2t1∥z−x∥22(3)
最小化上述二次近似
x
+
=
arg
min
z
f
(
x
)
+
∇
f
(
x
)
T
(
z
−
x
)
+
1
2
t
∥
z
−
x
∥
2
2
(4)
x^+=\arg\min_zf(x)+\nabla f(x)^T(z-x)+\frac{1}{2t}\|z-x\|^2_2 \tag{4}
x+=argzminf(x)+∇f(x)T(z−x)+2t1∥z−x∥22(4)
可以得到下一个点的位置
z
=
x
+
=
x
−
t
∇
f
(
x
)
(5)
z=x^+=x-t\nabla f(x) \tag{5}
z=x+=x−t∇f(x)(5)
这就是我们常见的梯度下降的迭代更新策略。
3. 近端投影
如果
f
f
f不可微,但可以分解为上述的两个函数
g
g
g和
h
h
h,则我们仍然可以使用平滑部分
g
g
g的二次近似来定义向最小值走的一步:
x
+
=
arg
min
a
g
(
z
)
+
h
(
z
)
≈
arg
min
z
g
(
x
)
+
∇
g
(
x
)
T
(
z
−
x
)
+
1
2
t
∥
z
−
x
∥
2
2
+
h
(
z
)
(6)
\begin{aligned} x^+&=\arg\min_a g(z)+h(z) \\ &\approx \arg\min_z g(x)+\nabla g(x)^T(z-x)+\frac{1}{2t}\|z-x\|^2_2+h(z) \tag{6} \end{aligned}
x+=argaming(z)+h(z)≈argzming(x)+∇g(x)T(z−x)+2t1∥z−x∥22+h(z)(6)
式(6)可以写成:
x
+
=
arg
min
z
1
2
t
∥
z
−
(
x
−
t
∇
g
(
x
)
)
∥
2
2
+
h
(
z
)
:
=
p
r
o
x
h
,
t
(
x
−
t
∇
g
(
x
)
)
(7)
x^+=\arg\min_z\frac{1}{2t}\|z-(x-t\nabla g(x))\|^2_2+h(z):=prox_{h,t}(x-t\nabla g(x)) \tag{7}
x+=argzmin2t1∥z−(x−t∇g(x))∥22+h(z):=proxh,t(x−t∇g(x))(7)
其中,近端函数
p
r
o
x
prox
prox定义为
p
r
o
x
h
,
t
(
x
)
=
arg
min
z
1
2
t
∥
z
−
x
∥
2
2
+
h
(
z
)
(8)
prox_{h,t}(x)=\arg\min_z\frac{1}{2t}\|z-x\|^2_2+h(z) \tag{8}
proxh,t(x)=argzmin2t1∥z−x∥22+h(z)(8)
4. 近端梯度下降
使用近端函数,我们可以定义一个迭代过程,叫做迭代梯度下降。其过程如下:
首先,选择一个初始点
x
(
0
)
x^{(0)}
x(0),然后重复:
x
(
i
)
=
p
r
o
x
h
,
t
i
(
x
(
i
−
1
)
−
t
i
∇
g
(
x
(
i
−
1
)
)
)
,
i
=
1
,
2
,
3
,
.
.
.
(9)
x^{(i)}=prox_{h,t_i}(x^{(i-1)}-t_i\nabla g(x^{(i-1)})), i=1,2,3,... \tag{9}
x(i)=proxh,ti(x(i−1)−ti∇g(x(i−1))),i=1,2,3,...(9)
使用该方法有几个优点:
- 对于许多 h h h函数,其近端投影 p r o x h , t prox_{h,t} proxh,t有解析解;
- p r o x t prox_{t} proxt仅仅依赖于 h h h,因此可以被用于不同的 g g g函数;
- g g g可以是任意复杂的函数,只要我们能计算其梯度;
4.1 例子:迭代软阈值算法(ISTA)
考虑下面lasso问题:
min
β
∈
R
p
1
2
∥
y
−
X
β
∥
2
2
+
λ
∥
β
∥
1
(10)
\min_{\beta \in \mathcal{R}^p}\frac{1}{2}\|y-X\beta\|^2_2+\lambda\|\beta\|_1 \tag{10}
β∈Rpmin21∥y−Xβ∥22+λ∥β∥1(10)
令
g
(
β
)
=
1
2
∥
y
−
X
β
∥
2
2
g(\beta)=\frac{1}{2}\|y-X\beta\|^2_2
g(β)=21∥y−Xβ∥22,
h
(
β
)
=
∥
β
∥
1
h(\beta)=\|\beta\|_1
h(β)=∥β∥1。对于目标函数的近端映射可以用软阈值法来计算:
p
r
o
x
h
,
t
(
β
)
=
arg
min
z
1
2
t
∥
β
−
z
∥
2
2
+
λ
∥
z
∥
1
=
S
λ
t
(
β
)
(11)
prox_{h,t}(\beta)=\arg\min_z \frac{1}{2t}\|\beta-z\|^2_2+\lambda\|z\|_1=S_{\lambda t}(\beta) \tag{11}
proxh,t(β)=argzmin2t1∥β−z∥22+λ∥z∥1=Sλt(β)(11)
其中,
S
λ
t
(
β
)
S_{\lambda t}(\beta)
Sλt(β)有解析解,相当于软阈值算子:
[
S
λ
t
]
i
=
{
β
i
−
λ
t
,
β
i
>
λ
t
0
,
−
λ
t
≤
β
i
≤
λ
t
β
i
+
λ
t
,
β
i
<
−
λ
t
(12)
[S_{\lambda t}]_i=\left\{ \begin{aligned} \beta_i-\lambda t, && \beta_i>\lambda t \\ 0, && -\lambda t\leq \beta_i \leq \lambda t\\ \beta_i+\lambda t, && \beta_i < -\lambda t \end{aligned} \right. \tag{12}
[Sλt]i=⎩⎪⎨⎪⎧βi−λt,0,βi+λt,βi>λt−λt≤βi≤λtβi<−λt(12)
而
g
(
β
)
g(\beta)
g(β)的梯度为
X
T
(
X
β
−
y
)
X^T(X\beta-y)
XT(Xβ−y),因此,我们可以得到近端梯度下降更新策略:
β
+
=
S
λ
t
(
β
−
t
X
T
(
X
β
−
y
)
)
(13)
\beta^+=S_{\lambda t}(\beta-tX^T(X\beta-y)) \tag{13}
β+=Sλt(β−tXT(Xβ−y))(13)
5. 特殊情况
近端梯度下降相当于梯度下降法的一种推广,因此也被称为复合梯度下降(composite gradient descent)或者广义梯度下降(generalized gradient descent)。下面几个特殊的情况可以看出为什么称之为广义梯度下降。
5.1 梯度下降
当
h
(
x
)
=
0
h(x)=0
h(x)=0时,近端映射函数变为:
p
r
o
x
t
(
x
)
=
arg
min
z
1
2
t
∥
x
−
z
∥
2
2
=
x
(14)
prox_t(x)=\arg\min_z\frac{1}{2t}\|x-z\|^2_2=x \tag{14}
proxt(x)=argzmin2t1∥x−z∥22=x(14)
因此,更新策略变为
x
(
k
)
=
x
(
k
−
1
)
−
t
k
∇
g
(
x
(
k
−
1
)
)
,
k
=
1
,
2
,
3
,
.
.
.
(15)
x^{(k)}=x^{(k-1)}-t_k\nabla g(x^{(k-1)}), k=1,2,3,... \tag{15}
x(k)=x(k−1)−tk∇g(x(k−1)),k=1,2,3,...(15)
即正常的梯度下降法。
5.2 投影梯度下降
当
h
(
x
)
=
I
c
h(x)=I_c
h(x)=Ic,
I
c
I_c
Ic为集合
C
C
C的指示函数时,近端映射函数变为:
p
r
o
x
t
(
x
)
=
arg
min
z
1
2
t
∥
x
−
z
∥
2
2
+
I
c
=
arg
min
z
∈
C
1
2
t
∥
x
−
z
∥
2
2
=
P
C
(
x
)
(16)
\begin{aligned} prox_t(x) &= \arg\min_z\frac{1}{2t}\|x-z\|^2_2+I_c \\ &=\arg\min_{z\in C}\frac{1}{2t}\|x-z\|^2_2 \\ &=P_C(x) \end{aligned} \tag{16}
proxt(x)=argzmin2t1∥x−z∥22+Ic=argz∈Cmin2t1∥x−z∥22=PC(x)(16)
其中,
P
C
(
x
)
P_C(x)
PC(x)表示集合
C
C
C上的投影算子。
因此,更新策略变为
x
(
k
)
=
P
c
(
x
(
k
−
1
)
−
t
k
∇
g
(
x
(
k
−
1
)
)
)
,
k
=
1
,
2
,
3
,
.
.
.
(17)
x^{(k)}=P_c(x^{(k-1)}-t_k\nabla g(x^{(k-1)})), k=1,2,3,... \tag{17}
x(k)=Pc(x(k−1)−tk∇g(x(k−1))),k=1,2,3,...(17)
即为投影梯度下降法。其先使用正常的梯度更新策略,然后将得到的 x x x投影回集合 C C C中。
5.3 近端最小化算法
当
g
(
x
)
=
0
g(x)=0
g(x)=0时,更新策略变为:
x
(
k
)
=
arg
min
z
1
2
t
∥
x
(
k
−
1
)
−
z
∥
2
2
+
h
(
z
)
,
k
=
1
,
2
,
3
,
.
.
.
(18)
x^{(k)} = \arg\min_z\frac{1}{2t}\|x^{(k-1)}-z\|^2_2+h(z), k=1,2,3,... \tag{18}
x(k)=argzmin2t1∥x(k−1)−z∥22+h(z),k=1,2,3,...(18)
其叫做近端最小化算法(proximal minimization algorithm)。其比次梯度方法快,但仅仅适用于近端算子是闭合形式的情况。
6. 加速的近端梯度法
加速的近端梯度法选择1初始点 x ( 0 ) = x ( − 1 ) ∈ R n x^{(0)}=x^{(-1)}\in\mathcal{R}^n x(0)=x(−1)∈Rn,然后重复下面的步骤:
-
将之前的迭代结果作为动量,计算 v v v:
v = x ( k − 1 ) + k − 2 k + 1 ( x ( k − 1 ) − x ( k − 2 ) ) (19) v=x^{(k-1)}+\frac{k-2}{k+1}(x^{(k-1)}-x^{(k-2)}) \tag{19} v=x(k−1)+k+1k−2(x(k−1)−x(k−2))(19) -
使用 v v v更新 x x x:
x ( k ) = p r o x t k ( v − t k ∇ g ( v ) ) (20) x^{(k)}=prox_{t_k}(v-t_k\nabla g(v)) \tag{20} x(k)=proxtk(v−tk∇g(v))(20)
第一步 k = 1 k=1 k=1是常规的近端梯度更新。之后,我们使用 v v v代替 x ( k − 1 ) x^{(k-1)} x(k−1)从之前的迭代中搬运一些动量,使得下一步的梯度更新方向与当前的梯度方向不要相差太大。通过对近端梯度法加速,可以达到 O ( 1 / ϵ ) O(1/\sqrt\epsilon) O(1/ϵ)收敛速率。
6.1 例子:快速迭代软阈值法(FISTA)
对于式(10)的lasso问题,FISTA的更新策略为:
对于
k
=
1
,
2
,
3
,
.
.
.
k=1,2,3,...
k=1,2,3,...,
v
=
β
(
k
−
1
)
+
k
−
2
k
+
1
(
β
(
k
−
1
)
−
β
(
k
−
2
)
)
(21)
v=\beta^{(k-1)}+\frac{k-2}{k+1}(\beta^{(k-1)}-\beta^{(k-2)}) \tag{21}
v=β(k−1)+k+1k−2(β(k−1)−β(k−2))(21)
β ( k ) = S λ t k ( v − t k X T ( X β ( k − 1 ) − y ) ) (22) \beta^{(k)}=S_{\lambda t_k}(v-t_kX^T(X\beta^{(k-1)}-y)) \tag{22} β(k)=Sλtk(v−tkXT(Xβ(k−1)−y))(22)