邻近梯度下降法

  对于无约束凸优化问题,当目标函数可微时,可以采用梯度下降法求解;当目标函数不可微时,可以采用次梯度下降法求解;当目标函数中同时包含可微项与不可微项时,常采用邻近梯度下降法求解。上述三种梯度算法均属于离线批处理类型算法,在大规模的数据问题中,每次迭代都需要计算整个数据集梯度,因而需要较大的计算代价和存储空间。在线邻近梯度法(Online Proximal Gradient,OPG)是随即优化算法与临近梯度算法的结合,是一种典型的随机优化方法,以单个或小批量采样数据而实现数据实时处理。

  考虑如下目标函数可分解为两部分的凸优化问题:

\begin{equation}\label{E1}
\min _{x} f(x)+g(x),
\end{equation}

其中$x$为优化变量,$f(x)$为光滑可微凸损失函数,$g(x)$是不可微的凸函数,一般为正则项。邻近梯度算法对其中的不可微项$g(x)$保持不变,可微项$f(x)$在$k$步迭代值$x_k$处做一阶Taylor展开,并加入二阶邻近项,对\eqref{E1}式的邻近梯度下降为:

\begin{aligned}
x_{k+1} &=\underset{u}{\arg \min } g(u)+f\left(x_{k}\right)+\nabla f\left(x_{k}\right)^{T}\left(u-x_{k}\right)+(1 / 2 \tau)\left\|u-x_{k}\right\|_{2}^{2} \\
&=\underset{u}{\operatorname{argmin}} g(u)+\frac{1}{2 \tau} \| u-\left.\left(x_{k}-t \nabla f\left(x_{k}\right)\right)\right|_{2} ^{2} \\
&=\operatorname{prox}_{\tau g}\left(x_{k}-\tau \nabla f\left(x_{k}\right)\right)
\end{aligned}

其中$\tau$为梯度步长,$\operatorname{prox}_{\tau g}(\cdot)$为邻近算子,根据$g(x)$形式有不同的定义,当$g(x)$为0时,邻近梯度算法退化为梯度下降算法;当$g(x)$为示性函数时,邻近算子为投影算符;当$g(x)$为$l_1$范数时,邻近算子为软阈值收缩算子。

在线邻近梯度下降法中,$f(x)$可以为不可微凸函数,将其利用次梯度线性化处理,同时也加入邻近项,可得:

\begin{equation}\label{E3}
x_{k+1}=\arg \min \left\{f_{k}^{T} x+g(x)+\left(1 / 2 \eta_{k}\right)\left\|x-x_{k}\right\|_{2}^{2}\right\}
\end{equation}

其中,次梯度$f_k$为$f(x)$的在$k$步迭代值$x_k$处近似,线性化处理目的是简化计算;$\left(1 / 2 \eta_{k}\right)\left\|x-x_{k}\right\|_{2}^{2}$为在$x_k$处的二次正则项,也称邻近项,目的是使得$x_{k+1}$和$x_{k}$相距较近,同时随着迭代收敛,$x_{k+1}$逐渐接近$x_{k}$,邻近项逐渐接近于0,所以可认为邻近项的目的是加快收敛,同时不会影响最终结果;$\eta_{k}>0$为邻近步长参数。

关于次梯度(Subgradient)

最新文章

  1. nmap使用教程
  2. db2死锁分析与处理
  3. 用Update Select批量更新某一字段的值[可以跨库]
  4. winxp sp2
  5. Java中的==、equals、hasCode方法
  6. 《JavaScript DOM 编程艺术 》 笔记
  7. MyBatis和Hibernate相比,优势在哪里?
  8. ActiveMq主从机制
  9. redis加锁
  10. Gitlab 备份迁移恢复报错gtar: .: Cannot mkdir: No such file or directory
  11. [数据结构]P1.2 队列
  12. vue的组件之间传值方法
  13. c#继承 里氏转化原则
  14. JS-JS创建数组的三种方法
  15. children和childNodes 的区别
  16. PGsql 基本用户权限操作
  17. linux使用mail命令发送邮件
  18. HUAS 2017暑假第六周比赛-题解
  19. poj1564-Sum It Up(经典DFS)
  20. JPA Spring Data 概述

热门文章

  1. 关于C++类定义中不能声明该类对象,而Java中可以的原因
  2. PicLite 开发日志 (v0.0.3)
  3. 在 ESXi 主机上关闭无响应的虚拟机电源
  4. Idea使用入门
  5. 用浏览器快速开启Docker的体验之旅
  6. Linux主流发行版本配置IP总结(Ubuntu、CentOS、Redhat、Suse)
  7. C# 随机给一个全部信息都未知的类类型,如何获取该类的类名、属性个数、属性名、属性的数据类型、属性值?
  8. AQS源码探究之竞争锁资源
  9. SpringMVC乱码解决
  10. 在MySQL中保存Java对象