Momentum and NAG
文章目录
- Momentum
- Nesterov accelerated gradient
- NESTEROV 的另外一个方法?
Momentum
Momentum的迭代公式为:
vt=γvt−1+η∇θJ(θ)θ=θ−vtv_t = \gamma v_{t-1} + \eta \nabla_\theta J(\theta) \\ \theta=\theta-v_t vt=γvt−1+η∇θJ(θ)θ=θ−vt
其中J(⋅)J(\cdot)J(⋅)一般为损失函数。我们知道,一般的梯度下降,是没有γvt−1\gamma v_{t-1}γvt−1这一项的,有了这一项之后,θ\thetaθ的更新和前一次更新的路径有关,使得每一次更新的方向不会出现剧烈变化,所以这种方法在函数分布呈梭子状的时候非常有效。
先来看看这个函数利用梯度下降的效果吧。
import matplotlib.pyplot as plt
import numpy as np"""
z = x^2 + 50 y ^2
2x
100y
"""partial_x = lambda x: 2 * x
partial_y = lambda y: 100 * y
partial = lambda x: np.array([partial_x(x[0]),partial_y(x[1])])
f = lambda x: x[0] ** 2 + 50 * x[1] ** 2class Decent:def __init__(self, function):self.__function = function@propertydef function(self):return self.__functiondef __call__(self, x, grad, alpha=0.4, beta=0.7):t = 1fx = self.function(x)dist = - grad @ gradwhile True:dx = x - t * gradfdx = self.function(dx)if fdx <= fx + alpha * t * dist:breakelse:t *= betareturn dxgrad_decent = Decent(f)x = np.array([30., 15.])
process = []
while True:grad = partial(x)if np.sqrt(grad @ grad) < 1e-7:breakelse:process.append(x)x = grad_decent(x, grad)process = np.array(process)
print(len(process))
x = np.linspace(-40, 40, 1000)
y = np.linspace(-20, 20, 500)
fig, ax= plt.subplots()
X, Y = np.meshgrid(x, y)
ax.contour(X, Y, f([X, Y]), colors='black')
ax.plot(process[:, 0], process[:, 1])
plt.show()
怎么说呢,有点震荡?289步1e-7的误差
x = np.array([30., 15.])
process = []
v = 0
gamma = 0.7
eta = 0.016
while True:grad = partial(x)v = gamma * v + eta * gradif np.sqrt(grad @ grad) < 1e-7:breakelse:process.append(x)x = x - v
用117步,话说,这个参数是不是难调啊,感觉一般η\etaη很小啊。
还有一个很赞的分析,在博客:
路遥知马力-Momentum
Nesterov accelerated gradient
比Momentum更快:揭开Nesterov Accelerated Gradient的真面目
NGD的迭代公式是:
vt=γvt−1+η∇θJ(θ−γvt−1)θ=θ−vtv_t = \gamma v_{t-1} + \eta \nabla_\theta J(\theta - \gamma v_{t-1}) \\ \theta = \theta-v_t vt=γvt−1+η∇θJ(θ−γvt−1)θ=θ−vt
和上面的区别就是,第ttt步更新,我们关心的是下一步(一个近似)的梯度,而不是当前点的梯度,我之前以为这是有一个搜索的过程的,但是实际上没有,所以真的是这个式子具有前瞻性?或许真的和上面博客里说的那样,因为后面的部分可以看成一个二阶导的近似。
x = np.array([30., 15.])
process = []
v = 0
gamma = 0.7
eta = 0.013
while True:grad = partial(x-gamma*v)v = gamma * v + eta * gradif np.sqrt(grad @ grad) < 1e-7:breakelse:process.append(x)x = x - v
感觉没有momentum好用啊
NESTEROV 的另外一个方法?
在那个overview里面,引用的是
文献链接
但是里面的方面感觉不是NGD啊,不过的确是一种下降方法,所以讲一下吧。
假设f(x)f(x)f(x)满足其一阶导函数一致连续的凸函数,比如用以下条件表示:
∥f′(x)−f′(y)∥≤L∥x−y∥,∀x,y∈E\|f'(x)-f'(y)\| \le L\|x-y\|, \forall x, y \in E ∥f′(x)−f′(y)∥≤L∥x−y∥,∀x,y∈E
由此可以推得(不晓得这个0.5哪来的,虽然有点像二阶泰勒展式,但是呢,凸函数好像没有这性质吧,去掉0.5就可以直接证出来了,而且这个0.5对证明没有什么大的影响吧,因为只要让L=0.5L就可以了啊):
f(y)≤f(x)+<f′(x),y−x>+0.5L∥y−x∥2(2)f(y) \le f(x) + <f'(x), y-x>+0.5L\|y-x\|^2 \quad (2) f(y)≤f(x)+<f′(x),y−x>+0.5L∥y−x∥2(2)
为了解决min{f(x)∣x∈E}\min \{f(x)|x\in E\}min{f(x)∣x∈E},且最优解X∗X^*X∗非空的情况,我们可以:
- 首先选择一个点y0∈Ey_0 \in Ey0∈E,并令
k=0,a0=1,x−1=y0,α−1=∥y0−z∥/∥f′(y0)−f′(z)∥k=0, a_0=1, x_{-1}=y_0, \alpha_{-1}=\|y_0-z\|/\|f'(y_0)-f'(z)\| k=0,a0=1,x−1=y0,α−1=∥y0−z∥/∥f′(y0)−f′(z)∥
其中zzz是E中不同于y0y_0y0的任意点,且f′(y0)≠f′(z)f'(y_0) \ne f'(z)f′(y0)̸=f′(z) - 第k 步:
a) 计算最小的iii满足:
f(yk)−f(yk−2−iαk−1f′(yk))≥2−i−1αk−1∥f′(yk)∥2(4)f(y_k)-f(y_k-2^{-i}\alpha_{k-1}f'(y_k))\ge2^{-i-1} \alpha_{k-1} \|f'(y_k)\|^2 \quad (4) f(yk)−f(yk−2−iαk−1f′(yk))≥2−i−1αk−1∥f′(yk)∥2(4)
b) 令
αk=2−iαk−1,xk=yk−αkf′(yk)ak+1=(1+4ak2+1)/2yk+1=xk+(ak−1)(xk−xk−1)/ak+1.\alpha_k = 2^{-i}\alpha_{k-1}, x_k = y_k - \alpha_k f'(y_k) \\ a_{k+1} = (1+ \sqrt{4a_k^2 + 1})/2 \\ y_{k+1} = x_k + (a_k - 1)(x_k - x_{k-1}) / a_{k+1} . αk=2−iαk−1,xk=yk−αkf′(yk)ak+1=(1+4ak2+1)/2yk+1=xk+(ak−1)(xk−xk−1)/ak+1.
作者证明了这个方法的收敛率是O(1/k2)O(1/k^2)O(1/k2)的。
即在满足上面提到的假设,且利用上面给出的方法所求,可以证明,对于任意的k≥0k\ge 0k≥0:
f(xk)−f∗≤C/(k+2)2f(x_k) - f^* \le C / (k+2)^2 f(xk)−f∗≤C/(k+2)2
其中C=4L∥y0−x∗∥2C = 4L\|y_0 - x^*\|^2C=4L∥y0−x∗∥2并且f∗=f(x∗),x∗∈X∗f^*=f(x^*), x^* \in X^*f∗=f(x∗),x∗∈X∗。
还有一些关于收敛步长的分析就不贴了。
证明:
令yk(α)−αf′(yk)y_k(\alpha) - \alpha f'(y_k)yk(α)−αf′(yk), 可以得到(通过(2)):
f(yk)−f(yk(α))≥0.5α(2−αL)∥f′(yk)∥2f(y_k) - f(y_k (\alpha)) \ge 0.5 \alpha (2 - \alpha L) \|f'(y_k)\|^2 f(yk)−f(yk(α))≥0.5α(2−αL)∥f′(yk)∥2
结果就是, 只要2−iαk−1≤L−12^{-i} \alpha_{k-1} \le L^{-1}2−iαk−1≤L−1,不等式(4)就成立,也就是说αk≥0.5L−1,∀k≥0\alpha_k \ge 0.5L^{-1}, \forall k \ge 0αk≥0.5L−1,∀k≥0, 否则2−iαk−1>L−12^{-i} \alpha_{k-1} > L^{-1}2−iαk−1>L−1。
令pl=(ak−1)(xk−1−xk)p_l = (a_k-1)(x_{k-1}-x_k)pl=(ak−1)(xk−1−xk),则yk+1=xk−pk/ak+1y_{k+1}=x_k - p_k / a_{k+1}yk+1=xk−pk/ak+1,于是:
pk+1−xk+1=pk−xk+ak+1αk+1f′(yk+1)p_{k+1} - x_{k+1} = p_k - x_k + a_{k+1} \alpha_{k+1} f'(y_{k+1}) pk+1−xk+1=pk−xk+ak+1αk+1f′(yk+1)
于是:
∥pk+1−xk+1+x∗∥2=∥pk−xk+x∗∥2+2(ak+1−1)αk+1<f′(yk+1,pk>+2ak+1αk+1<f′(yk+1,x∗−yk+1>+ak+12αk+12∥f′(yk+1)∥2\begin{array}{ll} \|p_{k+1}-x_{k+1}+x^*\|^2 &= \|p_k - x_k + x^*\|^2 + 2(a_{k+1}-1)\alpha_{k+1} <f'(y_{k+1}, p_k> \\ & + 2a_{k+1} \alpha_{k+1} <f'(y_{k+1}, x^* - y_{k+1}> + a_{k+1}^2 \alpha_{k+1}^2 \|f'(y_{k+1})\|^2 \end{array} ∥pk+1−xk+1+x∗∥2=∥pk−xk+x∗∥2+2(ak+1−1)αk+1<f′(yk+1,pk>+2ak+1αk+1<f′(yk+1,x∗−yk+1>+ak+12αk+12∥f′(yk+1)∥2
利用不等式(4)和f(x)f(x)f(x)的凸性,可得:
<f′(yk+1),yk+1−x∗>≥f(xk+1)−f∗+0.5αk+1∥f′(yk+1)∥2(5)0.5αk+1∥f′(yk+1)∥2≤f(yk+1)−f(xk+1)≤f(xk)−f(xk+1)−ak+1−1<f′(yk+1,pk>(6)\begin{array}{ll} <f'(y_{k+1}), y_{k+1} - x^*> &\ge f(x_{k+1}) - f^* + 0.5 \alpha_{k+1} \|f'(y_{k+1})\|^2 (5)\\ 0.5 \alpha_{k+1} \|f'(y_{k+1})\|^2 &\le f(y_{k+1}) - f(x_{k+1}) \le f(x_k) - f(x_{k+1}) \\ & \quad -a_{k+1}^{-1} <f'(y_{k+1}, p_k> (6) \end{array} <f′(yk+1),yk+1−x∗>0.5αk+1∥f′(yk+1)∥2≥f(xk+1)−f∗+0.5αk+1∥f′(yk+1)∥2(5)≤f(yk+1)−f(xk+1)≤f(xk)−f(xk+1)−ak+1−1<f′(yk+1,pk>(6)
其中第一个不等式,先利用凸函数得性质:
f∗≥f(yk+1)+<f′(yk+1),x∗−yk+1)f^* \ge f(y_{k+1}) + <f'(y_{k+1}), x^*-y_{k+1}) f∗≥f(yk+1)+<f′(yk+1),x∗−yk+1)
再利用不等式(4):
f(yk+1)−f(xk+1)≥0.5αk+1∥f′(yk+1)∥2f(y_{k+1}) - f(x_{k+1}) \ge 0.5 \alpha_{k+1}\|f'(y_{k+1})\|^2 f(yk+1)−f(xk+1)≥0.5αk+1∥f′(yk+1)∥2
代入这俩个不等式可得:
∥pk+1−xk+1+x∗∥2−∥pk−xk+x∗∥2≤2(ak+1−1)αk+1<f′(yk+1),pk>−2ak+1αk+1(f(xk+1−f∗)+(ak+12−ak+1)αk+12∥f′(yk+1)∥2≤−2ak+1αk+1(f(xk+1)−f∗)+2(ak+12−ak+1)αk+1(f(xk)−f(xk+1))=2αk+1ak2(f(xk)−f∗)−2αk+1ak+12(f(xk+1)−f∗)≤2αkak2(f(xk)−f∗)−2αk+1ak+12(f(xk+1)−f∗)\begin{array}{ll} & \|p_{k+1} - x_{k+1}+x^*\|^2 - \|p_k - x_k + x^*\|^2 \le 2(a_{k+1}-1)\alpha_{k+1}<f'(y_{k+1}), p_k> \\ & \quad -2a_{k+1}\alpha_{k+1} (f(x_{k+1} - f^*) + (a_{k+1}^2 - a_{k+1})\alpha_{k+1}^2 \|f'(y_{k+1})\|^2 \\ & \quad \le -2a_{k+1} \alpha_{k+1} (f (x_{k+1}) - f^*) + 2(a_{k+1}^2 - a_{k+1}) \alpha_{k+1}(f(x_k)-f(x_{k+1})) \\ & \quad = 2\alpha_{k+1} a_k^2 (f(x_k)-f^*) - 2\alpha_{k+1} a_{k+1}^2 (f(x_{k+1}) - f^*) \\ & \quad \le 2\alpha_k a_k^2 (f(x_k)-f^*) - 2\alpha_{k+1} a_{k+1}^2 (f(x_{k+1}) -f^*) \end{array} ∥pk+1−xk+1+x∗∥2−∥pk−xk+x∗∥2≤2(ak+1−1)αk+1<f′(yk+1),pk>−2ak+1αk+1(f(xk+1−f∗)+(ak+12−ak+1)αk+12∥f′(yk+1)∥2≤−2ak+1αk+1(f(xk+1)−f∗)+2(ak+12−ak+1)αk+1(f(xk)−f(xk+1))=2αk+1ak2(f(xk)−f∗)−2αk+1ak+12(f(xk+1)−f∗)≤2αkak2(f(xk)−f∗)−2αk+1ak+12(f(xk+1)−f∗)
其中第一个不等式用到了(5), 第二个不等式用到了(6), 等式用到了ak+12−ak+1=ak2a_{k+1}^2-a_{k+1}=a_k^2ak+12−ak+1=ak2,最后一步用到了αk≤αk+1\alpha_k \le \alpha_{k+1}αk≤αk+1且f(xk)≥f∗f(x_k) \ge f^*f(xk)≥f∗。
因此:
2αk+1ak+12(f(xk+1)−f∗)≤2αk+1ak+12(f(xk+1)−f∗)+∥pk+1−xk+1+x∗∥2≤2αkak(f(xk)−f∗)+∥pk−xk+x∗∥2≤2α0a02(f(x0)−f∗)+∥p0−x0+x∗∥2≤∥y0−x∗∥2.\begin{array}{ll} & 2\alpha_{k+1}a_{k+1}^2 ( f(x_{k+1}) - f^*) \le 2\alpha_{k+1} a_{k+1}^2 (f(x_{k+1})-f^*) + \|p_{k+1}-x_{k+1} + x^*\|^2 \\ & \le 2 \alpha_k a_k (f(x_k)-f^*) + \|p_k -x_k + x^*\|^2 \\ & \le 2\alpha_0 a_0^2 (f(x_0) - f^*) + \|p_0 - x_0 + x^*\|^2 \le \|y_0-x^*\|^2. \end{array} 2αk+1ak+12(f(xk+1)−f∗)≤2αk+1ak+12(f(xk+1)−f∗)+∥pk+1−xk+1+x∗∥2≤2αkak(f(xk)−f∗)+∥pk−xk+x∗∥2≤2α0a02(f(x0)−f∗)+∥p0−x0+x∗∥2≤∥y0−x∗∥2.
最后一个不等式成立是因为p0=0,x0=y0p_0 = 0, x_0=y_0p0=0,x0=y0,左边第一项大于等于0.
又αk≥0.5L−1,ak+1≥ak+0.5≥1+0.5(k+1)\alpha_k \ge 0.5L^{-1}, a_{k+1}\ge a_k + 0.5 \ge 1 + 0.5(k+1)αk≥0.5L−1,ak+1≥ak+0.5≥1+0.5(k+1),所以:
f(xk+1)−f∗≤C/(k+3)2f(x_{k+1}) - f^* \le C/(k+3)^2 f(xk+1)−f∗≤C/(k+3)2
证毕。
class Decent:def __init__(self, function, grad):self.__function = functionself.__grad = gradself.process = []@propertydef function(self):return self.__function@propertydef grad(self):return self.__graddef __call__(self, y, z):def find_i(y, alpha):i = 0fy = self.function(y)fdy = self.grad(y)fdynorm = fdy @ fdywhile True:temp = self.function(y - 2 ** (-i) * alpha * fdy)if fy - temp > 2 ** (-i -1) * alpha * fdynorm:return i, fdyelse:i += 1a = 1x = yfdy = self.grad(y)fdz = self.grad(z)alpha = np.sqrt((y-z) @ (y-z) /(fdy-fdz) @ (fdy - fdz))k = 0while True:k += 1self.process.append(x)i, fdy = find_i(y, alpha)if np.sqrt(fdy @ fdy) < 1:print(k)return xalpha = 2 ** (-i) * alphax_old = np.array(x, dtype=float)x = y - alpha * fdya_old = aa = (1 + np.sqrt(4 * a ** 2 + 1)) / 2y = x + (a_old - 1) * (x - x_old) / agrad_decent = Decent(f, partial)x = np.array([30., 15.])
z = np.array([200., 10.])
grad_decent(x, z)
process = np.array(grad_decent.process)
x = np.linspace(-40, 40, 1000)
y = np.linspace(-20, 20, 500)
X, Y = np.meshgrid(x, y)
fig, ax = plt.subplots()
ax.contour(X, Y, f([X, Y]), colors="black")
ax.scatter(process[:, 0], process[:, 1])
ax.plot(process[:, 0], process[:, 1])
plt.show()
用了30步就能到达上面的情况,不过呢,如果想让∥f′(x)∥≤1e−7\|f'(x)\|\le 1e-7∥f′(x)∥≤1e−7得1000多步,主要是因为会来回振荡。
Momentum and NAG相关推荐
- DL之DNN优化技术:GD、SGD、Momentum、NAG、Ada系列、RMSProp各种代码实现之详细攻略
DL之DNN优化技术:GD.SGD.Momentum.NAG.Ada系列.RMSProp各种代码实现之详细攻略 目录 GD算法的三种细分 1.1.bGD 1.2.SGD 1.3.MbGD 1.4.SG ...
- #深度解析# 深度学习中的SGD、BGD、MBGD、Momentum、NAG、Adagrad、Adadelta,RMSprop、Adam优化器
关于SSE.MSE.RMSE.R-Squared等误差公式的深度解析请参考我的这篇博文->#深度解析# SSR,MSE,RMSE,MAE.SSR.SST.R-squared.Adjusted R ...
- 深度学习中常用优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
本文转载自:https://www.cnblogs.com/guoyaohua/p/8542554.html 在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagr ...
- 几种梯度下降法比较最小值与鞍点(SGD、Momentum、NAG、Adagrad、Adadelta与Rmsprop)
先上图: 研一寒假导师要求我们几个把这两幅动图用程序画出来,当时搜遍了网上没找到源代码,甚至还去推特问了图的原作者,后来没登录过,不知道回没回我哈哈.下面是两幅图的代码,可能不是非常还原.然后可以自己 ...
- 【超详细】对比10种优化函数BGD、SGD、mini-batch GD、Momentum、NAG、Adagrad、RMSProp、Adadelta、Adam、AMSgrad
在实践中常用到一阶优化函数,典型的一阶优化函数包括 BGD.SGD.mini-batch GD.Momentum.Adagrad.RMSProp.Adadelta.Adam 等等,一阶优化函数在优化过 ...
- 深度学习优化器Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...
- 【深度学习基础】02梯度下降算法改进:SGD、Momentum、NAG、RMSProp、Adam等
目录 1. 优化算法背景 1.1 常见优化问题 1.1.1 梯度消失或梯度爆炸 1.1.2 局部最小值 1.2 常用解决办法 1.2.1 参数初始化策略 1.2.2 小批量梯度下降 1.2.3 梯度下 ...
- 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目NAG 梯度下降
d为累计梯度 作为一个调参狗,每天用着深度学习框架提供的各种优化算法如Momentum.AdaDelta.Adam等,却对其中的原理不甚清楚,这样和一条咸鱼有什么分别!(误)但是我又懒得花太多时间去看 ...
- 各种优化算法总结(区别及联系)SGD Momentum NAG Aadagrad RMSprop AadaDelta Adam Nadam
文章是最近整理的一些深度学习优化算法总结,具体参考文献见文章末尾: 刚刚开始接触优化算法,林林总总,认识总是很浅薄,但是当你拿过来看的时候,发现从刚刚开始的SGD到现在的adam.Nadam等,原理上 ...
最新文章
- LeetCode简单题之拆炸弹
- Platform Builder 5下WinCE 5.0目录结构
- 我这些年的项目管理心得...
- 一次面试引发的思考(中小型网站优化思考)
- 不用计算机质数的判断,怎么样用电脑编程来判断一个数是否是质数?
- 2015 DevOps状态调查报告
- 如何创建MFC模式对话框与非模式对话框
- Python深度学习:No handles with labels found to put in legend.
- java观察者模式学习
- Java进阶篇设计模式之一 ----- 单例模式
- fpga烧写bin文件_S3C2440移植uboot之编译烧写uboot
- php使用file_get_contents 或者curl 发送get/post 请求 的方法总结
- openfeign seata事务不回滚_Spring,你为何中止我的事务?
- arcengine遍历图层组
- Java集成云打印机(芯烨云)——文档篇
- 百万邮做邮件营销的邮箱配置
- 核心期刊《中国老年学杂志》期刊简介及投稿要求
- python studing DAY1
- c++ - 信息学奥赛一本通答案1001
- Docker-----网络模式与资源控制管理