Nesterov加速算法
上一届分析了近似点梯度法的收敛速度:如果光华部分的梯度是利普西茨连续的,则目标函数的收敛速度可以达到 O 1 k O{\frac{1}{k}} Ok1,一个自然的问题是如果仅用梯度信息,我们能不能取得更快的收敛速度。Nesterov分别再1983年、1988年和2005年提出了三种改进的一阶算法,收敛速度能到达 O ( 1 k 2 ) O({1}{k^2}) O(1k2)。实际上,这三种算法都可以应用到近似点梯度算法上。再Nesterov加速算法再但是并没有引起太多的关注。但几年来,随着数据量的增大,牛顿型方法由于其过大的计算复杂度,不便于有效地应用到实际中,Nesterov加速算法作为一种快速的一阶算法重新被挖掘出来并迅速流行起来。Beck和Teboulle在2008年给出了Nesterov在1983年提出的算法的近似点梯度法版本—FISTA。本节将对这些加速方法做一定的介绍和总结,主要讨论凸函数的加速算法。
一、FISTA算法
考虑如下如何问题
min x ∈ R n ψ ( x ) = f ( x ) + h ( x ) (1) \min_{x\in\mathcal{R^n}}\psi(x)=f(x)+h(x) \tag{1} x∈Rnminψ(x)=f(x)+h(x)(1)
其中 f ( x ) f(x) f(x)是连续可微的凸函数且梯度是利普西茨连续的, h ( x ) h(x) h(x)是适当的闭凸函数。优化问题(1)由光华部分 f ( x ) f(x) f(x)和非光滑部分 h ( x ) h(x) h(x)组成,可以使用近似点梯度法来求解这一问题,但其收敛速度只有 O 1 k O{\frac{1}{k}} Ok1。很自然地,我们希望能够加速近似点梯度算法,这就是本文要介绍的FISTA算法。
FISTA算法由两步组成:第一步沿着前两步的计算方向计算一个新点;第二部在该心点处做一步近似点梯度迭代,即
y k = x k − 1 + k − 2 k − 1 ( x k − 1 − x k − 2 ) , x k = p r o x t k h ( y k − t k ∇ f ( y k ) ) . \begin{aligned} y^k &=x^{k-1}+\frac{k-2}{k-1}(x^{k-1}-x^{k-2}), \\ x^k &=prox_{t_kh}(y^k-t_k\nabla f(y^k)). \end{aligned} ykxk=xk−1+k−1k−2(xk−1−xk−2),=proxtkh(yk−tk∇f(yk)).
图1给出FISTA算法的迭代序列图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMGgHRWz-1641886213293)(fig1_fista.PNG)]
可以看到这一做法对每一步迭代的计算几乎没有影响,而带来的效果是显著的。如果选取 t k t_k tk为固定的步长并小于或等于 1 L \frac{1}{L} L1,其收敛速度达到了 O 1 k 2 O\frac{1}{k^2} Ok21,完整的FISTA算法如下:
算法1:FISTA算法
- 输入: x 0 = x − 1 ∈ R n , k ← 1 x^0=x^{-1}\in\mathcal{R^n},k\leftarrow 1 x0=x−1∈Rn,k←1
- while 未达到收敛准则 do
- 计算 y k = x k − 1 + k − 2 k − 1 ( x k − 1 − x k − 2 ) y^k =x^{k-1}+\frac{k-2}{k-1}(x^{k-1}-x^{k-2}) yk=xk−1+k−1k−2(xk−1−xk−2),
- 选取 t k = t ∈ ( 0 , 1 L ] t_k=t\in(0,\frac{1}{L}] tk=t∈(0,L1],计算 x k = p r o x t k h ( y k − t k ∇ f ( y k ) ) x^k =prox_{t_kh}(y^k-t_k\nabla f(y^k)) xk=proxtkh(yk−tk∇f(yk))
- k ← k + 1 k\leftarrow k+1 k←k+1
- end while
为了对算法做更好的推广,可以给出FISTA算法的一个等价变形,只是把原来算法钟的第一步拆分成亮部迭代,相应的算法见算法2。当 γ k = 2 k + 1 \gamma_k=\frac{2}{k+1} γk=k+12时,并且取固定步长时,两个算法时等价的。但当 γ k \gamma_k γk采用别的取法时,算法2将给出另一个版本的加速算法。
对于该算法框架,我们需要确定如何选取步长 t k t_k tk和 γ k \gamma_k γk,这决定了算法的收敛速度。
算法2:FISTA算法的等价变形
- 输入: v 0 = x 0 ∈ R n , k ← 1 v_0=x_0\in\mathcal{R^n},k\leftarrow 1 v0=x0∈Rn,k←1.
- while 未达到收敛准则 do
- \quad 计算 y k = ( 1 − γ k ) x k − 1 + γ k v k − 1 y^k=(1-\gamma_k)x^{k-1}+\gamma_kv^{k-1} yk=(1−γk)xk−1+γkvk−1.
- \quad 选取 t k t_k tk,计算 x k = p r o x t k h ( y k − t k ∇ f ( y k ) ) x^k=prox_{t_kh}(y^k-t_k\nabla f(y^k)) xk=proxtkh(yk−tk∇f(yk)).
- \quad 计算 v k = x k − 1 + 1 γ k ( x k − x k − 1 ) v^k=x^{k-1}+\frac{1}{\gamma_k}(x^k-x^{k-1}) vk=xk−1+γk1(xk−xk−1</