一、 凸优化基础(Convex Optimization basics)
二、 一阶梯度方法(First-order methods)
在凸优化问题中,对于可微分的目标函数,我们可以通过梯度下降法(gradient descent)迭代求解最优解,而对于不可微分的目标函数,通过引入次梯度(subgradient)也可以迭代求解最优解,然而比起梯度下降法,次梯度法的速度比较缓慢。为此,针对于一些整体不可微分但却可以分解的目标函数来说,我们可以使用一种更快的算法——近端梯度法。
考虑一个目标函数可以分解为如下形式的两个函数:
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/ϵ)收敛速率。
对于一个可微分的凸函数 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)
这就是我们常见的梯度下降的迭代更新策略。
如果 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) \\ &=\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)
使用近端函数,我们可以定义一个迭代过程,叫做迭代梯度下降。其过程如下:
首先,选择一个初始点 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)
使用该方法有几个优点:
考虑下面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)
近端梯度下降相当于梯度下降法的一种推广,因此也被称为复合梯度下降(composite gradient descent)或者广义梯度下降(generalized gradient descent)。下面几个特殊的情况可以看出为什么称之为广义梯度下降。
当 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)
即正常的梯度下降法。
当 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中。
当 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)。其比次梯度方法快,但仅仅适用于近端算子是闭合形式的情况。
加速的近端梯度法选择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 ( x ( k − 1 ) ) ) (20) x^{(k)}=prox_{t_k}(v-t_k\nabla g(x^{(k-1)})) \tag{20} x(k)=proxtk(v−tk∇g(x(k−1)))(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/ϵ)收敛速率。
对于式(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)
CMU:Convex Optimization