最优化笔记,主要参考资料为《最优化:建模、算法与理论》
定义 (邻近算子)
对于一个凸函数 h h h, 定义它的邻近算子(proximal operator)为
prox ? h ( x ) = arg ? min ? u ∈ d o m h { h ( u ) + 1 2 ∥ u ? x ∥ 2 } . \operatorname{prox}_h(x)=\arg\min_{u\in\mathbf{dom}h}\left\{h(u)+\frac12\|u-x\|^2\right\}. proxh?(x)=argu∈domhmin?{h(u)+21?∥u?x∥2}.
可以看到,邻近算子的目的是求解一个距 x x x 不算太远的点,并使函数值 h ( x ) h(x) h(x) 也相对较小.
上图图描述了proximal算子的作用:
一个很自然的问题是,上面给出的邻近算子的定义是不是有意义的,即定义中的优化问题的解是不是存在唯一的. 若答案是肯定的,我们就可使用邻近算子去构建迭代格式. 下面的定理将给出定义中优化问题解的存在唯一性.
定理 (邻近算子是良定义的)
如果 h h h 是适当的闭凸函数,则对任意的 x ∈ R n , p r o x h ( x ) x\in\mathbb{R}^n,\quad\mathrm{prox}_h(x) x∈Rn,proxh?(x) 的值存在且唯一.
考虑如下复合优化问题:
min ? ψ ( x ) = f ( x ) + h ( x ) , \min\quad\psi(x)=f(x)+h(x), minψ(x)=f(x)+h(x),
其中函数 f f f 为可微函数,其定义域 d o m f = R n \mathbf{dom}f=\mathbb{R}^n domf=Rn, 函数 h h h 为凸函数,可以是非光滑的,并且一般计算此项的邻近算子并不复杂. 比如 LASSO 问题,两项分别为 f ( x ) = 1 2 ∥ A x ? b ∥ 2 , h ( x ) = μ ∥ x ∥ 1 . f(x)=\frac12\|Ax-b\|^2,\quad h(x)=\mu\|x\|_1. f(x)=21?∥Ax?b∥2,h(x)=μ∥x∥1?. 近似点梯度法的思想非常简单:注意到 ψ ( x ) \psi(x) ψ(x) 有两部分,对于光滑部分 f f f 做梯度下降,对于非光滑部分 h h h 使用邻近算子,则近似点梯度法的迭代公式为
x k + 1 = p r o x t k h ( x k ? t k ? f ( x k ) ) , ( 1 ) x^{k+1}=\mathrm{prox}_{t_kh}(x^k-t_k\nabla f(x^k)), \quad (1) xk+1=proxtk?h?(xk?tk??f(xk)),(1)
其中 t k > 0 t_k>0 tk?>0 为每次迭代的步长,它可以是一个常数或者由线搜索得出. 近似点梯度法跟众多算法都有很强的联系,在一些特定条件下,近似点梯度法还可以转化为其他算法:当 h ( x ) = 0 h(x)=0 h(x)=0 时,迭代公式变为梯度下降法
x k + 1 = x k ? t k ? f ( x k ) ; x^{k+1}=x^k-t_k\nabla f(x^k); xk+1=xk?tk??f(xk);
当 h ( x ) = I C ( x ) h(x)=I_C(x) h(x)=IC?(x) 时,迭代公式变为投影梯度法
x k + 1 = P C ( x k ? t k ? f ( x k ) ) . x^{k+1}=\mathcal{P}_C(x^k-t_k\nabla f(x^k)). xk+1=PC?(xk?tk??f(xk)).
对
f
(
x
)
f(x)
f(x)在
x
k
x^k
xk处做泰勒展线性展开并加上二次项,非光滑部分不做改变:
min
?
x
f
(
x
)
+
h
(
x
)
??
?
??
min
?
x
f
(
x
k
)
+
?
f
(
x
k
)
T
(
x
?
x
k
)
+
1
2
t
k
∥
x
?
x
k
∥
2
+
h
(
x
)
(
2
)
??
?
??
min
?
x
1
2
t
k
∥
x
?
x
k
+
t
k
?
f
(
x
k
)
∥
2
+
h
(
x
)
(
3
)
??
?
??
min
?
x
1
2
t
k
∥
x
?
(
x
k
?
t
k
?
f
(
x
k
)
)
∥
2
+
h
(
x
)
(
4
)
\begin{aligned} &\min_x f(x)+h(x) \\ \iff &\min_x f(x^k)+\nabla f(x^k)^\mathrm{T}(x-x^k)+\frac1{2t_k}\|x-x^k\|^2+h(x) \quad(2) \\ \iff &\min_x \frac1{2t_k}\|x-x^k+t_k\nabla f(x^k)\|^2+h(x)\quad (3) \\ \iff &\min_x \frac1{2t_k}\|x-(x^k-t_k\nabla f(x^k))\|^2+h(x) \quad(4) \end{aligned}
????xmin?f(x)+h(x)xmin?f(xk)+?f(xk)T(x?xk)+2tk?1?∥x?xk∥2+h(x)(2)xmin?2tk?1?∥x?xk+tk??f(xk)∥2+h(x)(3)xmin?2tk?1?∥x?(xk?tk??f(xk))∥2+h(x)(4)?
可以看到(4)式即为邻近算子的定义
x
k
+
1
=
prox
?
t
k
h
(
x
k
?
t
k
?
f
(
x
k
)
)
x^{k+1}=\operatorname{prox}_{t_{k}h}(x^k-t_k\nabla f(x^k))
xk+1=proxtk?h?(xk?tk??f(xk))
相当于是对
f
(
x
)
f(x)
f(x)先做一步梯度下降
x
^
k
+
1
=
x
k
?
t
k
?
f
(
x
k
)
\hat{x}^{k+1}=x^k-t_k\nabla f(x^k)
x^k+1=xk?tk??f(xk),然后再寻找一个点
x
k
+
1
x^{k+1}
xk+1,使得
x
k
+
1
x^{k+1}
xk+1距
x
^
k
+
1
\hat{x}^{k+1}
x^k+1 不算太远,并使函数值
h
(
x
^
k
+
1
)
h(\hat{x}^{k+1})
h(x^k+1) 也相对较小.
也就是说近似点梯度法收敛速度是 O ( 1 k ) O(\frac1k) O(k1?)的,比次梯度算法快!
注意每个Section公式重新从(1)开始编号
仍然考虑复合优化问题
min
?
ψ
(
x
)
=
f
(
x
)
+
h
(
x
)
.
(
1
)
\min\quad\psi(x)=f(x)+h(x)\quad. (1)
minψ(x)=f(x)+h(x).(1)
上面介绍的近似点梯度法收敛速度是
O
(
1
k
)
O(\frac1k)
O(k1?)的,下面介绍一个在此基础上改进的算法——FISTA,收敛速度可以达到
O
(
1
k
2
)
O(\frac1k^2)
O(k1?2)!