深度学习(一):优化方法

一、梯度下降

1.1、基本思想

梯度下降(gradient descent)是利用函数一阶梯度信息寻找函数局部最优解的常用的优化方法。
对于函数f(x),其梯度为\nabla f(x)=\frac{\partial f}{\partial x},函数沿着梯度的方向增长最快,增长的速度为其2-范数||\nabla f||。为求函数的极小值,可采用负梯度方向上更新参数 x_{k+1}=x_{k}-\eta \nabla f(x),其中每次迭代的步长为\eta,即学习率。

下图展示了函数f(x)=-(cos^2 x_0 + cos^2 x_1)^2的图像及其梯度下降过程。

函数图像及其梯度下降过程

1.2、算法缺陷

尽管梯度下降算法十分简明,且对于大量问题是有效的,但是也存在一些缺陷,包括:

  • 易陷入局部极小值(local minimum),甚至鞍点。这是由于在局部极小值和鞍点,函数梯度\nabla f为零,参数不再更新。

    陷入极小值或鞍点的情形

  • 有可能在最优点附近振荡而无法收敛。这是由于固定的学习率\eta,无法随着梯度的变化而进行调整。

    不同学习率对算法迭代的影响

对前一问题,可以通过引入动量(momentum)来解决;对后一问题,可以通过动态调整学习率来解决。
对于这些改进有相当多的成熟算法可以使用,下图为torch.optim子包中的梯度下降算法及变形的关系图,并对各算法及其使用加以说明。

torch.optim子包中的梯度下降算法及变形

1.3、SGD

在实际问题中,由于样本数据量往往较大,如果每次都求全部样本数据的梯度,计算量会很大,由此每次随机抽取部分样本进行更新,就可以大大加快更新速度,这就是随机梯度下降(stochastic gradient descent, SGD)

关于SGD收敛性的证明和分析

在分析前对目标函数有两个假设和两个引理:

假设1:
目标函数二阶可导且Hessian矩阵有界 m I \preceq F^{\prime \prime}(w) \preceq M I,其中m,M\geq0

该假设说明了F是强凸的,且是Lipschitz连续的。

假设2:
(1)g\left(\boldsymbol{w}_{k}, \xi_{k}\right)F^{\prime}\left(\boldsymbol{w}_{k}\right)的无偏估计;
(2)g\left(\boldsymbol{w}_{k}, \xi_{k}\right)关于\xi_{k}的方差\operatorname{Var}_{\xi_{k}}\left[g\left(\boldsymbol{w}_{k}, \xi_{k}\right)\right] \leqslant V,其中V\geq0

引理1:当F满足假设1时,迭代过程中有如下不等式始终成立:
\begin{aligned} \mathbb{E}_{\xi_{k}}\left[F\left(\boldsymbol{w}_{k+1}\right)\right]-F\left(\boldsymbol{w}_{k}\right) \leqslant &-\eta_{k} F^{\prime}\left(\boldsymbol{w}_{k}\right)^{\top} \mathbb{E}_{\xi_{k}}\left[g\left(\boldsymbol{w}_{k}, \xi_{k}\right)\right] +\frac{1}{2} \eta_{k}^{2} M \mathbb{E}_{\xi_{k}}\left[\left\|g\left(\boldsymbol{w}_{k}, \xi_{k}\right)\right\|_{2}^{2}\right] \end{aligned}

引理2:当F满足假设1和假设2时,迭代过程中有如下不等式始终成立:
\mathbb{E}_{\xi_{k}}\left[F\left(\boldsymbol{w}_{k+1}\right)\right]-F\left(\boldsymbol{w}_{k}\right) \leqslant-\left(1-\frac{1}{2} \eta_{k} M\right) \eta_{k}\left\|F^{\prime}\left(\boldsymbol{w}_{k}\right)\right\|_{2}^{2}+\frac{1}{2} \eta_{k}^{2} M V

以下证明:当假设1和假设2满足时,随机梯度下降每次迭代的步长固定为\eta_{k}=\eta_{0},且满足0<\eta_{0} \leqslant \frac{1}{M},则 \mathbb{E}\left[F\left(\boldsymbol{w}_{k}\right)-F^{*}\right] \leqslant \frac{\eta_{0} M V}{2 m}+\left(1-\eta_{0} m\right)^{k-1}\left(\mathbb{E}\left[F\left(\boldsymbol{w}_{0}\right)-F^{*}\right]-\frac{\eta_{0} M V}{2 m}\right)

【证明】由假设1,F是强凸的,则具有性质\left\|F^{\prime}\left(\boldsymbol{w}_{k}\right)\right\|_{2}^{2} \geqslant 2 m\left(F\left(\boldsymbol{w}_{k}\right)-F^{*}\right)

由引理2可得
\begin{aligned} \mathbb{E}_{\xi(k)}\left[F\left(\boldsymbol{w}_{k+1}\right)\right]-F\left(\boldsymbol{w}_{k}\right) & \leqslant-\left(1-\frac{1}{2} \eta_{0} M\right) \eta_{k}\left\|F^{\prime}\left(\boldsymbol{w}_{k}\right)\right\|_{2}^{2}+\frac{1}{2} \eta_{0}^{2} M V \\ & \leqslant-\frac{1}{2} \eta_{0}\left\|F^{\prime}\left(\boldsymbol{w}_{k}\right)\right\|_{2}^{2}+\frac{1}{2} \eta_{0}^{2} M V \\ & \leqslant-\eta_{0} m\left(F\left(\boldsymbol{w}_{k}\right)-F^{*}\right)+\frac{1}{2} \eta_{0}^{2} M V \end{aligned}

两边同减去F^*,并对\xi^{(1)}, \xi^{(2)}, \cdots, \xi^{(k)}取期望,得到\mathbb{E}\left[F\left(\boldsymbol{w}_{k+1}\right)-F^{*}\right] \leqslant\left(1-\eta_{0} m\right) \mathbb{E}\left[F\left(\boldsymbol{w}_{k}\right)-F^{*}\right]+\frac{1}{2} \eta_{0} M V

两边同时减去\frac{\eta_{0} M V}{2 m},得到
\begin{aligned} \mathbb{E}\left[F\left(\boldsymbol{w}_{k+1}\right)-F^{*}\right]-\frac{\eta_{0} M V}{2 m} & \leqslant\left(1-\eta_{0} m\right) \mathbb{E}\left[F\left(\boldsymbol{w}_{k}\right)-F^{*}\right]+\frac{1}{2} \eta_{0} M V-\frac{\eta_{0} M V}{2 m} \\ &=\left(1-\eta_{0} m\right)\left(\mathbb{E}\left[F\left(\boldsymbol{w}_{k}\right)-F^{*}\right]-\frac{\eta_{0} M V}{2 m}\right) \end{aligned}
k,\cdots,2,1迭代带入上式可得
\begin{aligned} \mathbb{E}\left[F\left(\boldsymbol{w}_{k+1}\right)-F^{*}\right]-\frac{\eta_{0} M V}{2 m} & \leqslant\left(1-\eta_{0} m\right) \mathbb{E}\left[F\left(\boldsymbol{w}_{k}\right)-F^{*}\right]+\frac{1}{2} \eta_{0} M V-\frac{\eta_{0} M V}{2 m} \\ &=\left(1-\eta_{0} m\right)^{k-1}\left(\mathbb{E}\left[F\left(\boldsymbol{w}_{k}\right)-F^{*}\right]-\frac{\eta_{0} M V}{2 m}\right) \end{aligned}
证毕。
通过上式可以得到如下结论:
(1)固定步长的随机梯度下降算法不能保证收敛到最小值点。\lim _{k \rightarrow \infty} \mathbb{E}\left[F\left(\boldsymbol{w}_{k}\right)-F^{*}\right]=\frac{\eta_{0} M V}{2 m}
(2)固定步长的随机梯度下降算法的收敛速度是sublinear的。
\lim _{k \rightarrow \infty} \frac{\mathbb{E} \left[F\left(\boldsymbol{w}_{k+1}\right)-F^{*}\right]}{\mathbb{E}\left[F\left(\boldsymbol{w}_{k}\right)-F^{*}\right]}=1
这也印证了之前所说的两个缺陷。

二、改进型算法

2.1、Momentum Optimizer

由于固定步长的学习率收敛速度慢,甚至无法收敛,Momentum Optimizer引入了一个momentum vector,每次参数的更新不仅与本次计算的梯度相关,还与之前的梯度相关,这样会更加朝着有利于收敛到最优解的方向,收敛速度更快。其更新公式如下:
\begin{array}{c}{m \leftarrow \beta m+\eta \nabla f(w)} \\ {w \leftarrow w-m}\end{array}
其中\beta是一个超参数, 可知Momentum 更新速度是GD的\frac{1} {1-\beta}倍。

2.2 Nesterov Accelarated Gradient

Nesterov Accelarated Gradient, NAG是在Momentum 优化的基础上改进得到的算法,与Momentum最大的不同在于:m每次更新时加上的梯度不同,NAG每次加上当前位置之后一点点 位置的梯度,这样会更加正确指向最优点的方向,收敛速度更快。更新公式如下:
\begin{array}{c}{m \leftarrow \beta m+\eta \nabla f(w+\beta m)} \\ {w \leftarrow w-m}\end{array}
下图说明了NAG比Momentum更好的原因,而且在极值点附近,如果超过了极值点,NAG会把更新的方向往回拉,而不是继续向前,这有利于减小振荡加速收敛。

NAG vs Momentum

2.3、AdaGrad Optimizer

AdaGrad Optimizer 即自适应梯度下降法,是在梯度下降的基础上动态调整学习率,第t次迭代的学习率为
\eta_{t}=\frac{l}{\sqrt{g_{0}^{2}+g_{1}^{2}+\cdots+g_{t-1}^{2}+\varepsilon}}
其中g_{t-1}表示第t次迭代的梯度,l,\varepsilon为预设的常数。
此时参数更新的方式为{ w \leftarrow w-\eta_t g_{t-1}}
通过这样的操作,保证了随着迭代次数的增加,参数的更新速度会越来越慢,因此可以减小振荡,避免因步长太大而无法收敛到极值点。同时有个缺点就是在复杂函数优化中,容易过早收敛到局部极小值点。

2.4、RMSProp

RMSProp (root mean square propagation) 是AdaGrad的拓展,利用衰减因子定义指数加权平均a_{t}^{(2)},即RMSProp通过只累加最近一次的梯度来解决AdaGrad更新过快的问题,第t次迭代的学习率为
\eta_{t}=\frac{1}{\sqrt{a_{t}^{(2)}+\varepsilon}}
此时参数更新的方式为{ w \leftarrow w-\eta_t g_{t-1}}
a_{t}^{(2)}由两部分组成:一部分是之前的梯度累积和,另一部分是当前梯度大小(主要作用),离当前越远的梯度对当前的影响越小。

2.5、Adam

Adam (adptive moment estimation) 结合了 Momentum和RMSProp的思想,它记录了之前梯度的指数平均和之前梯度平方和的指数平均,第t次迭代的学习率为
\eta_{t} \propto \frac{1}{\sqrt{\frac{a_{t}^{(2)}+\varepsilon}{1-\left(\rho^{(2)}\right)^{t}}}}
此时参数更新的方式为{ w \leftarrow w-\eta_t \frac{a_{t}^{(1)}} {1-(\rho^{(1)})^t}}
综合来说 Adam 是上述优化方法中最优的一个,当不知道如何选择时,就选Adam吧。

三、总结与实践

以上几种算法的区别总结在下表中,其形象优劣亦可通过动图看出。

优化器类 优化算法 改变量表达式 学习率表达式
torch.optim.SGD SGD { w \leftarrow w-\eta \nabla f(w)} \eta = const
torch.optim.SGD Momentum { w \leftarrow w-(\beta m+\eta \nabla f(w))} \eta = const
torch.optim.SGD NAG { w \leftarrow w-(\beta m+\eta \nabla f(w+\beta m))} \eta = const
torch.optim.Adagrad AdaGrad { w \leftarrow w-\eta_t g_{t-1}} \eta_{t} \propto \frac{1}{\sqrt{\sum_{\tau=0}^{t-1} g_{\tau}^{2}+\varepsilon}}
torch.optim.RMSProp RMSProp { w \leftarrow w-\eta_t g_{t-1}} \eta_{t}=\frac{1}{\sqrt{a_{t}^ {(2)}+\varepsilon}}
torch.optim.Adam Adam { w \leftarrow w-\eta_t \frac{a_{t}^{(1)}} {1-(\rho^{(1)})^ t}} \eta_{t} \propto \frac{1}{\sqrt{\frac{a_{t}^{(2)}+\varepsilon}{1-\left(\rho^{(2)}\right)^{t}}}}

下面通过pytorch的优化包来实践优化的过程。Himmelblau函数是常见的测试优化器性能的函数,它有4个值为零的极小值点,其函数实现和图像如下所示:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def him(x):
    return (x[0]**2+x[1]-11)**2 + (x[0]+x[1]**2-7)**2

x = np.arange(-6,6,0.1)
y = np.arange(-6,6,0.1)
X,Y = np.meshgrid(x,y)
Z = him([X,Y])

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X,Y,Z,cmap='rainbow')
ax.set_xlabel('x[0]')
ax.set_ylabel('x[1]')
ax.set_zlabel('f')
fig.show()
Himmelblau 函数图像

以下用优化器 torch.optim.Adam 来最小化Himmelblau 函数,共迭代20000次,每迭代1000次,输出一次结果。

import torch
x = torch.tensor([0.,0.],requires_grad=True)
optimizer = torch.optim.Adam([x,])
for step in range(20001):
    f = him(x)
    optimizer.zero_grad()
    f.backward()
    optimizer.step()
    if step % 1000 == 0:
        print('step:{}, x:{}, f(x):{}'.format(step,x.tolist(),f))

初试值为(0,0)时,结果如下,最后收敛到极小值0。

step:0, x:[0.0, 0.0], f(x):170.0
step:1000, x:[1.270142912864685, 1.118398904800415], f(x):88.53223419189453
step:2000, x:[2.332378387451172, 1.9535709619522095], f(x):13.7662353515625
step:3000, x:[2.8519949913024902, 2.114161729812622], f(x):0.6711392402648926
step:4000, x:[2.981964111328125, 2.0271568298339844], f(x):0.014927156269550323
step:5000, x:[2.9991261959075928, 2.0014777183532715], f(x):3.9870232285466045e-05
step:6000, x:[2.999983549118042, 2.0000221729278564], f(x):1.1074007488787174e-08
step:7000, x:[2.9999899864196777, 2.000013589859009], f(x):4.150251697865315e-09
step:8000, x:[2.9999938011169434, 2.0000083446502686], f(x):1.5572823031106964e-09
step:9000, x:[2.9999964237213135, 2.000005006790161], f(x):5.256879376247525e-10
step:10000, x:[2.999997854232788, 2.000002861022949], f(x):1.8189894035458565e-10
step:11000, x:[2.9999988079071045, 2.0000014305114746], f(x):5.547917680814862e-11
step:12000, x:[2.9999992847442627, 2.0000009536743164], f(x):1.6370904631912708e-11
step:13000, x:[2.999999523162842, 2.000000476837158], f(x):5.6843418860808015e-12
step:14000, x:[2.999999761581421, 2.000000238418579], f(x):1.8189894035458565e-12
step:15000, x:[3.0, 2.0], f(x):0.0
step:16000, x:[3.0, 2.0], f(x):0.0
step:17000, x:[3.0, 2.0], f(x):0.0
step:18000, x:[3.0, 2.0], f(x):0.0
step:19000, x:[3.0, 2.0], f(x):0.0
step:20000, x:[3.0, 2.0], f(x):0.0

初试值为(-1,0)时,结果如下,最后收敛到极其接近于极小值0。

step:0, x:[-1.0, 0.0], f(x):164.0
step:1000, x:[-2.065551996231079, 1.1903401613235474], f(x):89.31765747070312
step:2000, x:[-2.703892469406128, 2.321927547454834], f(x):20.508712768554688
step:3000, x:[-2.800236940383911, 2.973504066467285], f(x):0.9571946263313293
step:4000, x:[-2.8048553466796875, 3.124056816101074], f(x):0.002129464643076062
step:5000, x:[-2.8051087856292725, 3.1312758922576904], f(x):5.7411853049416095e-08
step:6000, x:[-2.805112838745117, 3.1313014030456543], f(x):5.68707037018612e-09
step:7000, x:[-2.805114984512329, 3.131305694580078], f(x):2.143679012078792e-09
step:8000, x:[-2.8051164150238037, 3.1313085556030273], f(x):7.466951501555741e-10
step:9000, x:[-2.805117130279541, 3.131310224533081], f(x):2.4942892196122557e-10
step:10000, x:[-2.805117607116699, 3.1313111782073975], f(x):7.275957614183426e-11
step:11000, x:[-2.8051178455352783, 3.1313116550445557], f(x):2.637534635141492e-11
step:12000, x:[-2.8051180839538574, 3.131312131881714], f(x):5.6843418860808015e-12
step:13000, x:[-2.8051180839538574, 3.131312370300293], f(x):2.2737367544323206e-13
step:14000, x:[-2.8051180839538574, 3.131312370300293], f(x):2.2737367544323206e-13
step:15000, x:[-2.8051180839538574, 3.131312370300293], f(x):2.2737367544323206e-13
step:16000, x:[-2.8051180839538574, 3.131312370300293], f(x):2.2737367544323206e-13
step:17000, x:[-2.8051180839538574, 3.131312370300293], f(x):2.2737367544323206e-13
step:18000, x:[-2.8051180839538574, 3.131312608718872], f(x):2.2737367544323206e-13
step:19000, x:[-2.8051180839538574, 3.131312370300293], f(x):2.2737367544323206e-13
step:20000, x:[-2.8051180839538574, 3.131312608718872], f(x):2.2737367544323206e-13

另外一阶优化方法还包括AdaDelta、Adamax等,二阶方法还包括牛顿法及其衍生方法,等有时间再加以补充。

参考资料

[1] https://yq.aliyun.com/articles/616375
[2] 史春奇等 著. 机器学习算法背后的理论与优化. 北京:清华大学出版社,2019
[3] 肖智清 著. 神经网络与PyTorch实战. 北京:机械工业出版社, 2018
[4] Ian Goodfellow 等 著, 赵申剑等 译, 深度学习. 北京:人民邮电出版社, 2017

岂曰无衣?与子同袍。王于兴师,修我戈矛,与子同仇!——《诗经·秦风》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容

  • 有前面的知识,我们知道如何构建目标函数了,当目标函数构建出来后,如何求其参数使的目标函数最小化呢?这就是这一小节的...
    李涛AT北京阅读 875评论 0 0
  • 在tensorflow中我们通过梯度下降算法来优化我们的模型,同时这个优化算法会在每一步的训练中来跟新,迭代模型的...
    泛酸的桂花酒阅读 4,155评论 0 0
  • 一.优化器算法简述 首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD,这三种形式的区别就是取决于我们...
    ZAK_ML阅读 4,494评论 0 5
  • www.dlworld.cn 听说你了解深度学习最常用的学习算法:Adam优化算法?-深度学习世界深度学习常常需要...
    hzyido阅读 55,043评论 0 24
  • 我最喜欢的车就是大众夏朗车。 我们家就有一辆车,我每天都坐着我最喜欢的夏朗去上学 。 夏朗是七座车,有三排...
    做营销的小周阅读 236评论 3 2