Nesterov加速算法

8.2 最优化 Nesterov加速算法

理论介绍

Lipschitz 连续

Lipschitz 连续: 在一个连续函数 f f f上面额外施加了一个限制,要求存在一个常数 K ≥ 0 K \geq 0 K0使得定义域内的任意两个元素 x 1 x_1 x1 x 2 x_2 x2 都满足
∣ f ( x 1 ) − f ( x 2 ) ∣ ≤ K ∣ x 1 − x 2 ∣ |f(x_1) - f(x_2)| \leq K |x_1 - x_2| f(x1)f(x2)Kx1x2
此时称函数 f f f的Lipschitz常数为 K

简单理解,就是 f ′ ( x ) ≤ K , ∀ x ∈ R f'(x) \leq K, \forall x \in R f(x)K,xR R R R f f f的定义域

梯度下降法:

考虑以下线性转化问题:
b = A x + w b = Ax + w b=Ax+w

例如在图像模糊问题中, A为模糊模板(由未模糊图像通过转换而来), b为模糊图像, w为噪声。 并且, A 和 b已知, x为待求的系数。

求解该问题的传统方法为最小二乘法,思想很简单,使得重构误差 ∣ ∣ A x − b ∣ ∣ 2 || Ax - b||^2 Axb2最小,即:
x ^ = a r g min ⁡ x ∣ ∣ A x − b ∣ ∣ 2 \hat{x} = arg\min_x ||Ax- b||^2 x^=argxminAxb2
f ( x ) = ∣ ∣ A x − b ∣ ∣ 2 f(x) = ||Ax - b||^2 f(x)=Axb2求导,可得其导数为: f ′ ( x ) = 2 A T ( A x − b ) f'(x) = 2A^T(Ax-b) f(x)=2AT(Axb)。 对于该问题,令导数为零即可以取得最小值(函数 f ( x ) f(x) f(x)为凸函数,其极小值为最小值)。

  1. 如果A为非奇异矩阵,即A可逆的话,那么可得该问题的精确解为 x = A − 1 b x = A^{-1}b x=A1b
  2. 如果A为奇异矩阵,即A不可逆,则该问题没有精确解。退而求其次,我们求一个近似解就好, ∣ ∣ A x − b ∣ ∣ 2 ≤ ϵ ||Ax-b||^2 \leq\epsilon Axb2ϵ

m i n ∣ ∣ x ∣ ∣ 1 s . t . ∣ ∣ A x − b ∣ ∣ 2 ≤ ϵ min||x||_1 \\ s.t. ||Ax-b||^2 \leq \epsilon minx1s.t.Axb2ϵ

其中, ∣ ∣ x ∣ ∣ 1 ||x||_1 x1为惩罚项,用以规范化参数 x x x。该例子使用L1范数作为惩罚项,是希望 x x x尽量稀疏(非零元素个数尽可能的少),即b是A的一个稀疏表示。 ∣ ∣ A x − b ∣ ∣ 2 ≤ ϵ ||Ax-b||^2 \leq \epsilon Axb2ϵ则为约束条件,即重构误差最小。问题(3)也可以描述为:
min ⁡ x F ( x ) ≡ ∣ ∣ A x − b ∣ ∣ 2 + λ ∣ ∣ x ∣ ∣ 1 \min_x{F(x) \equiv ||Ax - b||^2 + \lambda||x||_1} xminF(x)Axb2+λx1
式子(4)即为一般稀疏表示的优化问题。希望重构误差尽可能的小,同时参数的个数尽可能的少。

注: 惩罚项也可以是L2或者其他范数。

梯度下降法的缺陷

考虑更为一般的情况,我们来讨论梯度下降法。有无约束的优化问题如下:
min ⁡ x F ( x ) ≡ f ( x ) \min_x {F(x) \equiv f(x)} xminF(x)f(x)
梯度下降法基于这样的观察:如果实值函数 F ( x ) F(x) F(x)在点 a a a处可微且有定义,那么函数 F ( x ) F(x) F(x)在点 a a a沿着梯度想反的方向 − ▽ F ( a ) -\triangledown F(a) F(a)下降最快。

基于此,我们假设 f ( x ) f(x) f(x)连续可微。如果存在一个足够小的数值 t > 0 t>0 t>0使得 x 2 = x 1 − t ▽ F ( a ) x_2 = x_1 - t\triangledown F(a) x2=x1tF(a),那么:
F ( x 1 ) ≥ F ( x 2 ) x 0 ∈ R n , x k = x k − 1 − t k ▽ f ( x k − 1 ) F(x_1) \geq F(x_2) \\ x_0 \in R^n, x_k = x_{k-1} - t_k \triangledown f(x_{k-1}) F(x1)F(x2)x0Rn,xk=xk1tkf(xk1)
梯度下降法的核心就是通过式子(6)找到序列 x k {x_k} xk,使得 F ( x k ) ≥ F ( x k − 1 ) F(x_k) \geq F(x_{k-1}) F(xk)F(xk1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gpOl6ZTP-1627534604110)(E:\项目\8.2 最优化\梯度下降法.png)]

从上图可以看出:初始点不同,获得的最小值也不同。因为梯度下降法求解的是局部最小值,受初值的影响较大。如果函数 f ( x ) f(x) f(x)为凸函数的话,则局部最小值亦为全局最小值。这时,初始点只对迭代速度有影响。

再回头看一下式子(6),我们使用步长 t k t_k tk和倒数 ▽ F ( x k ) \triangledown F(x_k) F(xk)来控制每一次迭代时 x x x的变化量。再看一下上面的那张图,对于每一次迭代,我们当然希望 F ( x ) F(x) F(x)的值降得越快越好,这样我们就能更快速的获得函数的最小值。因此,步长 t k t_k tk的选择很重要。

如果步长 t k t_k tk太小,则找到最小值的迭代次数非常多,即迭代速度非常慢,或者说收敛速度很慢;而步长太大的话,则会出现overshoot the minimum的现象,即不断在最小值左右徘徊,跳来跳去的。

然而, t k t_k tk最后还是作用在 x k − 1 x_{k-1} xk1上,得到 x k x_k xk。因此,更为朴素的思想应该是:序列 x k {x_k} xk的个数尽可能小,即每一次迭代步伐尽可能大,函数值减少得尽可能的多。那么就是关于序列 x k {x_k} xk的选择了,如何更好的选择每一个点 x k x_k xk,使得函数值更快的趋紧其最小值。

ISTA 算法

ISTA(Iterative shrinkage-thresholding algorithm), 即 迭代阈值收缩算法。

先从无约束优化问题开始, 即上面的式子(5):

这时候,我们还假设 f ( x ) f(x) f(x)满足Lipschitz连续条件,即 f ( x ) f(x) f(x)的导数有下界,其最小下界称为Lipshitz常数 L ( f ) L(f) L(f)。这时,对于任意的 L ≥ L ( f ) L \geq L(f) LL(f), 有:
f ( x ) ≤ f ( y ) + < x − y , ▽ f ( y ) > + L 2 ∣ ∣ x − y ∣ ∣ 2    ∀ x , y ∈ R n f(x) \leq f(y) + + \frac L2||x-y||^2 \space \space \forall x,y \in R^n f(x)f(y)+<xy,f(y)>+2Lxy2  x,yRn
基于此,在点 x k x_k xk附近可以把函数值近似为:
f ^ ( x , x k ) = f ( x k ) + < ▽ f ( x k ) , x − x k > + L 2 ∣ ∣ x − x k ∣ ∣ 2 \hat{f}(x, x_k) = f(x_k) + <\triangledown f(x_k), x-x_k> + \frac L2 ||x-x_k||^2 f^(x,xk)=f(xk)+<f(xk),xxk>+2Lxxk2
在梯度下降的每一步迭代中,将点 x k − 1 x_{k-1} xk1处的近似函数取得最小值的点作为下一次迭代的起始点 x k x_k xk,这就是所谓的Proximal Gradient Descent for L1 Regularization算法(其中, t k = 1 L t_k = \frac 1L tk=L1)。
x k = a r g min ⁡ x { f ( x k − 1 + < x − x k − 1 , ▽ f ( x k − 1 ) > + 1 2 t k ∣ ∣ x − x k − 1 ∣ ∣ 2 ) } x_k = arg\min_x\{f(x_{k-1} + + \frac 1{2t_k}||x-x_{k-1}||^2)\} xk=argxmin{f(xk1+<xxk1,f(xk1)>+2tk1xxk12)}
上面的方法只适合解决非约束问题。而ISTA要解决的是带惩罚项的优化问题,引入范数规范函数 g ( x ) g(x) g(x)对参数 x x x进行约束,如下:
m i n { F ( x ) ≡ f ( x ) + g ( x ) : x ∈ R n } min\{F(x)\equiv f(x) + g(x): x\in R^n\} min{F(x)f(x)+g(x):xRn}
使用更为一般的二次近似模型来求解上述的优化问题,在点 y , F ( x ) : = f ( x ) + g ( x ) y, F(x):=f(x) + g(x) y,F(x):=f(x)+g(x)的二次近似函数为:
Q L ( x , y ) : = f ( y ) + < x − y , ▽ f ( y ) > + L 2 ∣ ∣ x − y ∣ ∣ 2 + g ( x ) Q_L(x, y) := f(y) + + \frac L2||x-y||^2 + g(x) QL(x,y):=f(y)+<xy,f(y)>+2Lxy2+g(x)
该函数的最小值表示为 : P L P_L PL是proximal(近端算子的简写形式)、
P L ( y ) : = a r g min ⁡ x { Q L ( x , y ) : x ∈ R n } P_L(y) := arg\min_x\{Q_L(x,y): x\in R^n\} PL(y):=argxmin{QL(x,y):xRn}
忽略其常数项 f ( y ) f(y) f(y) ▽ F ( y ) \triangledown F(y) F(y),这些有和没有对结果没有影响。再结合式子(11)和(12), P L ( y ) P_L(y) PL(y)可以写成:
P L ( y ) = a r g min ⁡ x { g ( x ) + L 2 ∣ ∣ x − ( y − 1 L ▽ f ( y ) ) ∣ ∣ 2 } P_L(y) = arg\min_x\{g(x) + \frac L2||x-(y-\frac 1L \triangledown f(y))||^2\} PL(y)=argxmin{g(x)+2Lx(yL1f(y))2}
显然,使用ISTA解决带约束的优化问题时的基本迭代步骤为:
x k = P L ( x k − 1 ) x_k = P_L(x_k - 1) xk=PL(xk1)
固定步长的ISTA的基本迭代步骤如下(步长 t = 1 / L ( f ) t = 1 / L(f) t=1/L(f)):

ISTA with constant stepsize

Input: $L := L(f) - A $ Lipschitz constant of ▽ f \triangledown f f.

Step 0: Take x 0 ∈ R n x_0 \in R^n x0Rn

Step k: (k >= 1) Compute
x k = P L ( x k − 1 ) x_k = P_L(x_{k-1}) xk=PL(xk1)

然而, 固定步长的ISTA的缺点是: Lipschitz常数 L ( f ) L(f) L(f)不一定可知或者计算。例如, L1范数约束的优化问题,其Lipschitz常数依赖于 A T A A^TA ATA的最大特征值。而对于大规模的问题,非常难计算。因此,使用以下带回溯(backtracking)的ISTA:

ISTA with backtracking

Step 0. Take L 0 > 0 L_0 > 0 L0>0,some η > 1 \eta > 1 η>1, and x 0 ∈ R n x_0 \in R^n x0Rn

Step k. ( k ≥ 1 ) (k \geq 1) (k1) Find the smallest nonnegative intergers i k i_k ik such that with L ˉ = η i k L k − 1 \bar{L} = \eta^{i_k} L_{k-1} Lˉ=ηikLk1
F ( P L ˉ ( x k − 1 ) ) ≤ Q L ˉ ( P L ˉ ( x k − 1 , x k − 1 ) ) F(P_{\bar{L}}(x_{k-1})) \leq Q_{\bar{L}}(P_{\bar{L}}(x_{k-1}, x_{k-1})) F(PLˉ(xk1))QLˉ(PLˉ(xk1,xk1))
Set L k = η i k L k − 1 L_k = \eta ^ {i_k}L_{k-1} Lk=ηikLk1 and compute
x k = P L k ( x k − 1 ) x_k = P_{L_k}(x_{k-1}) xk=PLk(xk1)

FISTA (A fast iterative shrinkage-thresholding algorithm)是一种快速的迭代阈值收缩算法(ISTA)。

FISTA 与 ISTA的区别在于迭代步骤中近似函数起始点y的选择。ISTA使用前一次迭代求得的近似函数最小值 x k − 1 x_{k-1} xk1,而FISTA则使用另一种方法来计算y的位置。

FISTA with constant stepsize

**Input: ** L = L ( f ) − A L = L(f) - A L=L(f)A Lipschitz constant of ▽ f \triangledown f f.

Step 0. Take y 1 = x 0 ∈ R n y_1 = x_0 \in R^n y1=x0Rn t 1 = 1 t_1 = 1 t1=1.

Step k. ( k ≥ 1 ) (k \geq 1) (k1) Compute
x k = P L ( y k ) t k + 1 = 1 + 1 + 4 t k 2 2 , y k + 1 = x k + t k − 1 t k + ! ( x k − x k − 1 ) x_k = P_L(y_k) \\ t_{k+1} = \frac {1 + \sqrt{1+4t^2_k}}{2}, \\ y_{k+1} = x_k + \frac {t_k - 1}{t_{k+!}}(x_k - x_{k-1}) xk=PL(yk)tk+1=21+1+4tk2 ,yk+1=xk+tk+!tk1(xkxk1)

当然,考虑到与ISTA同样的问题:问题规模大的时候,决定步长的Lipschitz常数计算复杂。FISTA与ISTA一样,亦有其回溯算法。在这个问题上,FISTA与ISTA并没有区别,上面也说了,FISTA与ISTA的区别仅仅在于每一步迭代时近似函数起始点的选择。更加简明的说:FISTA用一种更为聪明的办法选择序列 { x k } \{x_k\} {xk}, 使得其基于梯度下降思想的迭代过程更加快速地趋近问题函数 F ( x ) F(x) F(x)的最小值。

第二类Nesterov加速算法

对于 LASSO 问题:
min ⁡ x 1 2 ∣ ∣ A x − b ∣ ∣ 2 + μ ∣ ∣ x ∣ ∣ 1 \min_x{ \frac 1 2||Ax - b||^2 + \mu||x||_1} xmin21Axb2+μx1
利用第二类 Nesterov 加速的近似点梯度法进行优化。

该算法被外层连续化策略调用,在连续化策略下完成某一固定正则化系数的内层迭代优化。第二类 Nesterov 加速算法的迭代格式如下:
z k = ( 1 − γ k ) x k − 1 + γ k y k − 1 , y k = p r o x t k γ k h ( y k − 1 − t k γ k A T ( A z k − b ) ) , x k = ( 1 − γ k ) x k − 1 + γ k y k . z^{k} = (1-\gamma_k)x^{k-1} +\gamma_ky^{k-1}, \\ y^{k} = prox_{\frac{t_k}{\gamma_k}h}(y^{k-1}-\frac{t_k}{\gamma_k}A^T(Az^k-b)), \\ x^{k} = (1-\gamma_k)x^{k-1}+\gamma_ky^k. zk=(1γk)xk1+γkyk1,yk=proxγktkh(yk1γktkAT(Azkb)),xk=(1γk)xk1+γkyk.
和经典FISTA算法的一个重要区别在于,第二类Nesterov加速算法中的三个序列{ x k x^k xk},{yk}和{zk}都可以保证在定义域内.而FISTA算法中的序列{ y k y^k yk}不一定在定义域内.
y k = p r o x t k γ k h ( y k − 1 − t k γ k A T ( A z k − b ) ) y^{k} = prox_{\frac{t_k}{\gamma_k}h}(y^{k-1}-\frac{t_k}{\gamma_k}A^T(Az^k-b)) yk=proxγktkh(yk1γktkAT(Azkb))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bFt5oq6d-1627534604113)(C:\Users\Maple\AppData\Roaming\Typora\typora-user-images\image-20210517192923458.png)]

第三类Nesterov加速算法

同样的,对于LASSO问题:
min ⁡ x 1 2 ∣ ∣ A x − b ∣ ∣ 2 + μ ∣ ∣ x ∣ ∣ 1 \min_x{ \frac 1 2||Ax - b||^2 + \mu||x||_1} xmin21Axb2+μx1
利用第三类 Nesterov 加速的近似点梯度法进行优化。其迭代格式如下:
z k = ( 1 − γ k ) x k − 1 + γ k y k − 1 , y k = p r o x ( t k ∑ i = 1 k 1 γ i ) h ( − t k ∑ i = 1 k 1 γ i ∇ f ( z i ) , x k = ( 1 − γ k ) x k − 1 + γ k y k . z^{k} = (1-\gamma_k)x^{k-1} +\gamma_ky^{k-1}, \\ y^{k} = prox_{(t_k\sum_{i=1}^{k}{\frac{1}{\gamma_i}})h}(-t_{k}\sum_{i=1}^{k}{\frac{1}{\gamma_i}}\nabla{f(z^i)}, \\ x^{k} = (1-\gamma_k)x^{k-1}+\gamma_ky^k. zk=(1γk)xk1+γkyk1,yk=prox(tki=1kγi1)h(tki=1kγi1f(zi),xk=(1γk)xk1+γkyk.
该算法和第二类Nesterov加速算法的区别仅仅在于 y k y^k yk的更新,第三类Nesterow加速算法计算 y k y^k yk时需要利用全部已有的 ∇ f ( z i ) , i = 1 , 2 , ⋯   , k \nabla{f(z^i)},i=1,2,\cdots,k f(zi),i=1,2,,k.

比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87bsvFfs-1627534604116)(C:\Users\Maple\AppData\Roaming\Typora\typora-user-images\image-20210517184956548.png)]

可以看到:就固定步长而言,FISTA算法相较于第二类Nesterov加速算法收敛得略快一些,也可以注意到FISTA算法是非单调算法.同时,BB步长和线搜索技巧可以加速算法的收敛速度.此外,带线搜索的近似点梯度法可以比带线搜索的FISTA算法更加收敛.

应用

杂项

梯度下降法中面临的挑战问题:

  1. 病态条件: 不同方向有不同的梯度, 学习率选择困难 (悬崖,跑到对面悬崖)
  2. 局部最小: 陷入局部最小点
  3. 鞍点:
    1. 梯度为0, Hessian矩阵同时存在正值和负值,
    2. Hessian矩阵的所有特征值为正值的概率很低
    3. 对于高维情况,鞍点和局部最小点的数量很多, 使用二阶优化算法会有问题。
  4. 平台区域, 梯度为0, Hessian矩阵也为0, 加入噪音使得从平台区域跳出

动量法:

  • 主要想法:在参数更新时考虑历史梯度信息 保持惯性

  • 参数更新规则
    v t ← ρ v t − 1 − η ▽ J ( θ t ) θ t + 1 ← θ t + v t v_t \leftarrow \rho v_{t-1} - \eta \triangledown J(\theta_t) \\ \theta_{t+1} \leftarrow \theta_{t} +v_t vtρvt1ηJ(θt)θt+1θt+vt
    参数 ρ ∈ [ 0 , 1 ) \rho \in [0, 1) ρ[0,1)为历史梯度贡献的衰减速率,一般为 0.5、0.9或0.99

    η \eta η : 学习率

    ρ \rho ρ也可以随着迭代次数的增大而变大,随着时间推移调整 ρ \rho ρ比收缩 η \eta η更重要 , 动量法克制了SGD中的两个问题

    • Hessian矩阵的病态问题(右图图解)
    • 随机梯度的方差带来的不稳定

Nesterov 动量法:

  • 受 Nesterov 加速梯度算法 NGA 的启发

  • 梯度计算在施加当前速度之后

  • 在动量法的基础上添加了一个校正因子(correction factor)
    v t ← ρ v t − 1 − η ▽ J ( θ t + ρ v t − 1 ) θ t + 1 ← θ t + v t v_t \leftarrow \rho v_{t-1} - \eta \triangledown J(\theta_t + \rho v_{t-1}) \\ \theta_{t+1} \leftarrow \theta_{t} +v_t vtρvt1ηJ(θt+ρvt1)θt+1θt+vt

AdaGrad

  • 学习率自适应:与梯度历史平方值的综合的平方根成反比

  • 效果: 更为平缓的倾斜方向上回去的更大的进步,可能逃离鞍点

  • 问题:理解题都平方和增长过快,导致学习率较小,提前终止学习。
    s t ← s t − 1 + ▽ J ( θ t ) ∗ ▽ J ( θ t ) θ t + 1 ← θ t − η s t ▽ J ( θ t ) s_t \leftarrow s_{t-1} + \triangledown J(\theta_t) * \triangledown J(\theta_t) \\ \theta_{t+1} \leftarrow \theta_t - \frac \eta{\sqrt{s_t}}\triangledown J(\theta_t) stst1+J(θt)J(θt)θt+1θtst ηJ(θt)

RMSProp

  • 在AdaGrad基础上,降低了对早期历史梯度的依赖

  • 通过设置衰减系数 β 2 \beta_2 β2实现

  • 建议 β 2 \beta_2 β2 = 0.9
    s t ← β 2 s t − 1 + ( 1 − β 2 ) θ t + 1 ← θ t − η s t ▽ J ( θ t ) s_t \leftarrow \beta_2 s_{t-1} + (1 - \beta_2) \\ \theta_{t+1} \leftarrow \theta_t - \frac {\eta}{\sqrt{s_t}} \triangledown J(\theta_t) stβ2st1+(1β2)θt+1θtst ηJ(θt)

Adam

  • 同时考虑动量和学习率自适应

  • β 1 \beta_1 β1通常设置成0.9, β 2 \beta_2 β2设置成0.999
    v t ← β 1 v t − 1 − ( 1 − β 1 ) ▽ J ( θ t ) s t ← β 2 s t − 1 − ( 1 − β 2 ) ▽ J ( θ t ) ∗ ▽ J ( θ t ) θ t + 1 ← θ t − η v t s t v_t \leftarrow \beta_1 v_{t-1} - (1 - \beta_1)\triangledown J(\theta_t) \\ s_t \leftarrow \beta_2 s_{t-1} - (1 - \beta_2) \triangledown J(\theta_t) * \triangledown J(\theta_t) \\ \theta_{t+1} \leftarrow \theta_t - \eta \frac {v_t}{\sqrt{s_t}} vtβ1vt1(1β1)J(θt)stβ2st1(1β2)J(θt)J(θt)θt+1θtηst vt

参考文献

  • FISTA的由来:从梯度下降法到ISTA & FISTA_huang1024rui的专栏-CSDN博客_fista
    s_t \leftarrow \beta_2 s_{t-1} - (1 - \beta_2) \triangledown J(\theta_t) * \triangledown J(\theta_t) \
    \theta_{t+1} \leftarrow \theta_t - \eta \frac {v_t}{\sqrt{s_t}}
    $$

参考文献

  • FISTA的由来:从梯度下降法到ISTA & FISTA_huang1024rui的专栏-CSDN博客_fista
  • [2] Beck A , Teboulle M . A Fast Iterative Shrinkage-Thresholding Algorithm for Linear Inverse Problems[J]. Siam J Imaging Sciences, 2009, 2(1):183-202.

你可能感兴趣的:(人工智能,算法,python,算法,人工智能)