文章目录

  • 前言
  • APG(Accelerate Proximal Gradient)加速近端梯度算法[^1]
    • PGD (Proximal Gradient Descent)近端梯度下降法推导[^2]
      • Example of Proximal Gradient Descent
    • APG(Accelerate Proximal Gradient)加速近端梯度算法推导
      • Back to lasso example:
  • 总结
  • 引用

前言

近期在阅读Data-Driven Sparse Structure Selection for Deep Neural Networks论文时,用到里面APG-NAG相关优化器的知识,原论文方法采用mxnet去实现的,在这里想迁移到pytorch中。因此手撕一下APG和NAG相关的知识。

APG(Accelerate Proximal Gradient)加速近端梯度算法1

该方法是近端梯度下降法(Proximal Gradient Descent)的一种扩展方法,溯源的话应该早于2008年。在了解APG方法之前,首先需要了解一下近端梯度下降法(Proximal Gradient Descent).

PGD (Proximal Gradient Descent)近端梯度下降法推导2

直接套用Chen Xin Yu2的原话:“近端梯度下降法是众多梯度下降 (gradient descent) 方法中的一种,其英文名称为proximal gradident descent,其中,术语中的proximal一词比较耐人寻味,将proximal翻译成“近端”主要想表达”(物理上的)接近"。与经典的梯度下降法和随机梯度下降法相比,近端梯度下降法的适用范围相对狭窄。对于凸优化问题,当其目标函数存在不可微部分(例如目标函数中有 1-范数或迹范数)时,近端梯度下降法才会派上用场。"

近端梯度下降法(Proximal Gradient Descent)主要用于解决目标函数中包含不可微的凸函数的问题。即,假定存在,
f(x)=g(x)+h(x)\begin{align} f(x)=g(x)+h(x) \end{align}f(x)=g(x)+h(x)​​
其中

  • g(x)g(x)g(x)是可微分的凸函数,且dom(g)=Rndom(g)=\mathbb{R}^ndom(g)=Rn
  • h(x)h(x)h(x)不是必须可微的凸函数,即可以可微,也可以不可微,也可以局部可微。

我们的目标是,
min⁡xf(x)=g(x)+h(x)\begin{align} \min_{x}f(x)=g(x)+h(x) \end{align}xmin​f(x)=g(x)+h(x)​​
如果fff可微的话,则非常简单,直接用梯度下降法就可以实现,即,
x+=x−t∇f(x)\begin{align} x^+=x- t \nabla f(x) \end{align}x+=x−t∇f(x)​​
此处ttt可等价为学习率。

且可通过最小化函数fff在xxx周围的二阶近似(Minimize quadratic approximation to fff around xxx),来找到x+x^+x+,且可将其二阶导数∇2f(x)\nabla^2f(x)∇2f(x)替换为1t\frac{1}{t}t1​,表示如下:
x+=arg min⁡zf(x)+∇f(x)T(z−x)+12t∣∣z−x∣∣22=arg min⁡zfˉt(z)\begin{align} x^+=\argmin_{z} f(x)+\nabla f(x)^T (z-x) + \frac{1}{2t}||z-x||^2_2 = \argmin_{z} \bar{f}_t(z) \end{align}x+=zargmin​f(x)+∇f(x)T(z−x)+2t1​∣∣z−x∣∣22​=zargmin​fˉ​t​(z)​​
(注意:这里不是很明确为什么可以这样替换,仅知道是泰勒展开的形式,有理解的可以告诉我一下。而且作者为什么能想到上一步也不是很明晰)

然而,由于h(x)h(x)h(x)的存在,函数f(x)f(x)f(x)并不一定可微,但是注意g(x)g(x)g(x)是可微的。因此,我们可以将h(x)h(x)h(x)单独拿出来,并仅对g(x)g(x)g(x)进行二阶近似,即,
x+=arg min⁡zgtˉ(z)+h(z)=arg min⁡zg(x)+∇g(x)T(z−x)+12t∣∣z−x∣∣22+h(z)=arg min⁡z12t∣∣z−(x−t∇g(x))∣∣22+h(z)\begin{align} x^+ &= \argmin_z \bar{g_t}(z) + h(z) \nonumber \\ ~&= \argmin_z g(x)+\nabla g(x)^T (z-x) + \frac{1}{2t}||z-x||^2_2 + h(z) \nonumber \\ ~&= \argmin_z \frac{1}{2t}||z-(x-t\nabla g(x))||^2_2+h(z) \\ \end{align}x+  ​=zargmin​gt​ˉ​(z)+h(z)=zargmin​g(x)+∇g(x)T(z−x)+2t1​∣∣z−x∣∣22​+h(z)=zargmin​2t1​∣∣z−(x−t∇g(x))∣∣22​+h(z)​​

上述具体详细推导可见:近端梯度下降算法(Proximal Gradient Algorithm),提示:z是变量,z之外的常数项可以去掉或添加,不影响z的改变。

则为了最小化公式(5),即一方面另zzz尽可能靠近(x−t∇g(x))(x-t\nabla g(x))(x−t∇g(x)) (对g(x),尽可能靠近梯度下降方向),另一方面另h(z)h(z)h(z)尽可能小。

则可以定义Proximal operator(近端算子)如下,
proxh,t(x)=arg min⁡z12t∣∣x−z∣∣22+h(z)\begin{align} prox_{h,t}(x) = \argmin_{z} \frac{1}{2t}||x-z||^2_2+ h(z) \end{align}proxh,t​(x)=zargmin​2t1​∣∣x−z∣∣22​+h(z)​​
因此近端梯度下降法(Proximal Gradient Descent)可表示为: 对于f(x)=g(x)+h(x)f(x)=g(x)+h(x)f(x)=g(x)+h(x),给定任意初始化x(0)x^(0)x(0),重复如下步骤即可得到近似最优x∗x^*x∗,
x(k)=proxh,tk(x(k−1)−tk∇g(x(k−1))),k=1,2,3,…\begin{align} x^{(k)}=prox_{h,t_k}(x^{(k-1)}-t_k\nabla g(x^{(k-1)})) , \space k=1,2,3,\ldots \end{align}x(k)=proxh,tk​​(x(k−1)−tk​∇g(x(k−1))), k=1,2,3,…​​

至此,近端梯度下降法(Proximal Gradient Descent)推到完毕(收敛性分析略过,感兴趣同学可以参考cmu的PPT)。可能有读者有些许疑惑,为什么要做这么大一堆操作?不最后还是要最小化h(z)h(z)h(z)吗?并没有讲不可微函数h(x)h(x)h(x)是如何通过梯度下降来求解的哇。
然而,近端梯度下降法(Proximal Gradient Descent)主要亮点在如下方面:

  • Proximal operator(近端算子)不再依赖g(x)g(x)g(x),仅依赖于h(x)h(x)h(x)。也就是说,本来f(x)=g(x)+h(x)f(x)=g(x)+h(x)f(x)=g(x)+h(x)可以是一个非常复杂的可微分函数和一个不那么复杂的不可微分函数的组合,但使用该方法,我们无需考虑g(x)g(x)g(x)(因为其可微分,梯度很好计算),仅需针对性考虑不可微分函数h(x)h(x)h(x)即可,极大的简化了我们的问题。

总结+个人理解:这里原本想画图解释一下近端梯度下降法(Proximal Gradient Descent),但发现不是很好画,就简单用文字表述一下我对Proximal (近端)的理解, 理想情况下,梯度下降方向朝向是我们目标函数最优方向,但由于函数存在不可微分项,因此梯度下降的方向无法确定(虽然不可微分函数存在次梯度这一说(例如L1范数存在次梯度),但f(x)整体梯度如果始终包含不可微分的函数的次微分的话,实际梯度与计算梯度将始终有一定偏差,随着迭代次数过多后,偏差更大。)。所以,我们将可微分项和不可微分项拿出来,首先确保我们的可微分项的梯度下降方向绝对正确,不可微分项再另想办法进行最小化,这种思想就是PGD的思想。个人认为Proximal(近端)主要有一种近似(接近)的含义在里面,而且表现在梯度的近端上,更进一步,主要表现在可微分项梯度和不可微分项的梯度与整体函数梯度的近端(接近程度)上。

Example of Proximal Gradient Descent

参考CMU的PPT,也举一个例子,ISTA算法,便于更加直观的理解:
Lasso criterion 一篇对lasso的讲解,感觉非常不错
定义如下函数:
f(β)=12∣∣y−Xβ∣∣22+λ∣∣β∣∣1\begin{align} f(\beta)= \frac{1}{2} ||y-X\beta||^2_2 + \lambda ||\beta||_1\end{align}f(β)=21​∣∣y−Xβ∣∣22​+λ∣∣β∣∣1​​​
即其min⁡βf(β)\min_{\beta} f(\beta)minβ​f(β)如图所示,

上述公式就是一个典型的近端梯度下降算法(Proximal Gradient Algorithm)问题,可看作g(β)=12∣∣y−Xβ∣∣22g(\beta)= \frac{1}{2} ||y-X\beta||^2_2g(β)=21​∣∣y−Xβ∣∣22​,h(β)=λ∣∣β∣∣1h(\beta)=\lambda ||\beta||_1h(β)=λ∣∣β∣∣1​。

则引入我们的近端算子(Proximal operator),

proxt=arg min⁡z12t∣∣β−z∣∣22+λ∣∣z∣∣1=Sλt(β)\begin{align} prox_{t} &=\argmin_{z} \frac{1}{2t}||\beta-z||^2_2+ \lambda ||z||_1 \nonumber \\ &=S_{\lambda t}(\beta)\end{align}proxt​​=zargmin​2t1​∣∣β−z∣∣22​+λ∣∣z∣∣1​=Sλt​(β)​​
其中,Sλt(β)S_{\lambda t}(\beta)Sλt​(β)也称为 soft-thresholding operator,具体如下:
[Sλ(β)]i={βi−λif βi>λ0if −λ≤βi≤λ,i=1,…,nβi+λif βi<−λ\begin{equation} \left[S_\lambda(\beta)\right]_i= \begin{cases}\beta_i-\lambda & \text { if } \beta_i>\lambda \\ 0 & \text { if }-\lambda \leq \beta_i \leq \lambda, \quad i=1, \ldots, n \\ \beta_i+\lambda & \text { if } \beta_i<-\lambda\end{cases} \end{equation}[Sλ​(β)]i​=⎩⎨⎧​βi​−λ0βi​+λ​ if βi​>λ if −λ≤βi​≤λ,i=1,…,n if βi​<−λ​​​
有关soft-thresholding operator如何这样设计可见https://angms.science/doc/CVX/ISTA0.pdf,参考自知乎,我也实在推不动了。

则我们按照公式(7)的方法,已知∇g(β)=−XT(y−Xβ)\nabla g(\beta)=-X^T(y-X\beta)∇g(β)=−XT(y−Xβ),则,给定初始化β0\beta^0β0
β(k)=proxh,tk(β(k−1)−tk∇g(β(k−1))),k=1,2,3,…=Sλtk(β(k−1)+tkXT(y−Xβ(k−1)))\begin{align} \beta^{(k)}&=prox_{h,t_k}(\beta^{(k-1)}-t_k\nabla g(\beta^{(k-1)})) , \space k=1,2,3,\ldots \\ &=S_{\lambda t_k}(\beta^{(k-1)}+t_k X^T(y-X\beta^{(k-1)})) \end{align}β(k)​=proxh,tk​​(β(k−1)−tk​∇g(β(k−1))), k=1,2,3,…=Sλtk​​(β(k−1)+tk​XT(y−Xβ(k−1)))​​

至此,随着k的迭代,可得到近似最优β∗\beta^*β∗

12点半了,回宿舍,明天更

同时,该方法也被称为 iterative soft-thresholding algorithm (ISTA).

如下图1,与直接将f(x)f(x)f(x)求次梯度的方法相比,该方法可以有效收敛。

APG(Accelerate Proximal Gradient)加速近端梯度算法推导

如果对PGD有一个清晰的认识后,那么APG的推导将变会变得无比清晰简单,再次重复一下我们的目标,

min⁡xf(x)=g(x)+h(x)\begin{align} \min_{x}f(x)=g(x)+h(x) \end{align}xmin​f(x)=g(x)+h(x)​​
其中

  • g(x)g(x)g(x)是可微分的凸函数,且dom(g)=Rndom(g)=\mathbb{R}^ndom(g)=Rn
  • h(x)h(x)h(x)不是必须可微的凸函数,即可以可微,也可以不可微,也可以局部可微。

在之前PGD方法中,最重要的是公式(7),而APG方法也仅在公式(7)的输入上做了一个大家非常熟悉的改动,如下所示,给定初始化x(0)x^{(0)}x(0),且另x(−1)=x(0)x^{(-1)}=x^{(0)}x(−1)=x(0)(这一步仅为了公式美观,无别的意义),则:
v=x(k−1)+k−2k+1(x(k−1)−x(k−2))x(k)=prox⁡tk(v−tk∇g(v))fork=1,2,3,…\begin{align} v &=x^{(k-1)}+\frac{k-2}{k+1}\left(x^{(k-1)}-x^{(k-2)}\right) \\ x^{(k)} &=\operatorname{prox}_{t_k}\left(v-t_k \nabla g(v)\right) \\ for \space k=1,2,3, \ldots \nonumber \end{align} vx(k)for k=1,2,3,…​=x(k−1)+k+1k−2​(x(k−1)−x(k−2))=proxtk​​(v−tk​∇g(v))​​

  • 对于k=1时,为PGD算法。
  • 对于k>1时,相当于x(k−1)x^{(k-1)}x(k−1)加了一个动量,变成vvv。
  • 如果h(x)h(x)h(x)不存在,即f(x)f(x)f(x)可微,则相当于梯度下降算法。

公式(15)等同于公式(7),公式(14)就是增加一个小的动量,以此达到加速的目的。如下图所示:

Back to lasso example:

回到刚才的例子,可以看到用APG方法,加速效果明显

总结

PGD和APG主要用于目标函数中存在不可微分项的情况,在实际的深度学习算法中,该情况最主要用于稀疏优化,例如损失函数增加架构参数的L1范数,可以使架构参数变得稀疏。当然,该方法也有许多其它应用,总之,当你的函数中出现不可微分问题的时候,就可以来参考一下PGD算法。

后续NAG优化器原理将放在(二)中 (二)的链接,太长了,拆一拆。后续部分会讲解NAG优化器,以及论文中如何将APG和NAG结合到一起,并尝试给出pytorch自定义优化器的代码实现(原论文是Mxnet)。

引用


  1. Proximal Gradient Descent (and Acceleration) link: https://www.stat.cmu.edu/~ryantibs/convexopt/lectures/prox-grad.pdf (强推!) ↩︎ ↩︎

  2. 机器学习 | 近端梯度下降法 (proximal gradient descent) (强推!) ↩︎ ↩︎

APG(Accelerate Proximal Gradient)加速近端梯度算法 和 NAG(Nesterov accelerated gradient)优化器原理 (一)相关推荐

  1. APG(Accelerate Proximal Gradient)加速近端梯度算法 和 NAG(Nesterov accelerated gradient)优化器原理 (二)

    文章目录 前言 NAG优化器 APG 与 NAG的结合 Pytorch 代码实现 总结 附录 公式(11)推导 引用 前言 近期在阅读Data-Driven Sparse Structure Sele ...

  2. Proximal Gradient Method近端梯度算法

    本文参考文献附在最后.是对参考文献的理解. 1:此算法解决凸优化问题模型如下: minF(x)=g(x)+h(x) min F(x)=g(x)+h(x)其中 g(x) g(x)凸的,可微的. h(x) ...

  3. 【机器学习】numpy实现NAG(Nesterov accelerated gradient)优化器

    ⚡本系列历史文章⚡ [Momentum优化器] [Nesterov accelerated gradient优化器] [RMSprop优化器] [Adagrad优化器] [Adadelta优化器] [ ...

  4. 近端算法:近端最小化(Proximal minimization)、近端梯度(PG)、加速近端梯度(APG)、ADMM

    近端算法 基本介绍及定义 定义 工作原理 性质 近端算子解释 Moreau-Yosida正则化 次微分算子的预解 修正梯度步长 信任区域问题 近端算法(Proximal Algorithms) 近端最 ...

  5. PG(近端梯度)-APG(加速近端梯度)-ADMM 优化Lasso

    近端梯度和Nesterov加速近端梯度以及DMM算法是十分经典的优化算法,本文首先对原算法进行了讲解推导,然后进行了编程实现. 目录 1.Lasso问题 2.PG算法 3.APG算法 4.ADMM算法 ...

  6. 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目NAG 梯度下降

    d为累计梯度 作为一个调参狗,每天用着深度学习框架提供的各种优化算法如Momentum.AdaDelta.Adam等,却对其中的原理不甚清楚,这样和一条咸鱼有什么分别!(误)但是我又懒得花太多时间去看 ...

  7. 入门神经网络优化算法(一):Gradient Descent,Momentum,Nesterov accelerated gradient

    入门神经网络优化算法(一):Gradient Descent,Momentum,Nesterov accelerated gradient 入门神经网络优化算法(二):Adaptive Optimiz ...

  8. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  9. NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS (翻译,侵删)

    NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS(Nesterov 加速梯度和缩放不变性攻击) 摘要 ...

最新文章

  1. k8s节点亲和性:pod和node的亲和性、硬策略、软策略
  2. hdu 5802——Windows 10
  3. struct stat结构体简介
  4. 使用预训练模型进行句对分类(Paddle、PyTorch)
  5. jsoup 去除html标签,如何使用jsoup取消注释html标签
  6. ubuntu下的eclipse 3.3初用aptana报SWT错误
  7. matlab计算三角格网面积,不规则平面图形的面积计算及其MATLAB实现.doc
  8. 【HTML+CSS网页设计与布局 从入门到精通】第12章-CSS
  9. 第 2 章 类加载子系统
  10. 面向对象设计思想_重要_2
  11. docker-compose学习
  12. svn中文路径 权限设定
  13. 优化算法 | 多车型车辆路径问题-初始解构造方法
  14. 关于Web网页设计规范简述
  15. Android UI设计之十自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果
  16. 基于核的黎曼编码和字典学习
  17. 百度智能云OCR获取APIKey和SecretKey
  18. 2021年美国大学生数学建模竞赛C题参考翻译
  19. make xxx_defconfig
  20. CellPress | 人工智能在临床试验中的应用

热门文章

  1. 使用JS距离实现LDA文档相似度计算
  2. RGB图像转为灰度图的几种方法
  3. 室内定位导航系统设计实现指南
  4. MATLAB字库字库,迪文HMI标准字库及部分扩展字库参考
  5. 微信收款助手消息不弹窗的解决办法
  6. 2013年北邮网研院上机真题(D)
  7. 数据湖和传统业务_在十六湖国家公园测量和计算流量
  8. java游戏服务端_JAVA游戏服务端的速度比得上c++吗?
  9. java三叉戟_HTML 5 Web SQL核心三叉戟
  10. 管理Exchange Online用户介绍(二)