文章目录

  • 主要内容
  • 算法
  • ADADELTA 代码

这篇论文比较短,先看了这篇,本来应该先把ADAGRAD看了的。普通的基于梯度下降的方法,普遍依赖于步长,起始点的选择,所以,受ADAGRAD的启发,作者提出了一种ADADELTA的方法。

Δxt=−RMS[Δx]t−1RMS[g]tgt\Delta x_t = -\frac{\mathrm{RMS}[\Delta x]_{t-1}}{\mathrm{RMS}[g]_t}g_t Δxt​=−RMS[g]t​RMS[Δx]t−1​​gt​
其中gt=∂f(xt)∂xtg_t=\frac{\partial f(x_t)}{\partial x_t}gt​=∂xt​∂f(xt​)​,所以下一步迭代就是:
xt+1=xt+Δxtx_{t+1} = x_t + \Delta x_t xt+1​=xt​+Δxt​

主要内容

ADAGRAD方法:
Δxt=−η∑τ=1tgτ2gt\Delta x_t = -\frac{\eta}{\sqrt{\sum_{\tau=1}^t g_{\tau}^2}}g_t Δxt​=−∑τ=1t​gτ2​​η​gt​
也就是,步长与之前所有的梯度有关,显然这个步长是会逐渐减少的。但是这个缺点也很明显,如果起始点的梯度很大,那么就会导致后续步长很小,而一开始的梯度很小,就会导致后续步长很大,产生振荡,有些怪怪的。
而ADADELTA希望只关心一部分的梯度,比如
∑τ=t−ktgτ2\sqrt{\sum_{\tau=t-k}^tg_{\tau}^2} τ=t−k∑t​gτ2​​
但是这么做,每次迭代都必须记录kkk个梯度,这显得不怎么效率,于是,作者相处了一个法子:
E[g2]t=ρE[g2]t−1+(1−ρ)gt2E[g^2]_t = \rho E[g^2]_{t-1} + (1-\rho)g_t^2 E[g2]t​=ρE[g2]t−1​+(1−ρ)gt2​
可以看到,对于g1g_1g1​,t+1t+1t+1步之后其影响为:ρt(1−ρ)g1\rho^t(1-\rho) g_1ρt(1−ρ)g1​,对整个迭代造成的影响是一个等比序列:
(1−ρ),ρ(1−ρ),…,ρt(1−ρ)(1-\rho), \rho (1-\rho), \ldots, \rho^t(1-\rho) (1−ρ),ρ(1−ρ),…,ρt(1−ρ)
最后趋向于:
1−ρt+1→11-\rho^{t+1} \rightarrow1 1−ρt+1→1
这么做就俩劝其美啦。
记:
RMS[g]t=E[g2]t+ϵ\mathrm{RMS}[g]_t = \sqrt{E[g^2]_t + \epsilon} RMS[g]t​=E[g2]t​+ϵ​
其中ϵ\epsilonϵ是为了让除法有意义而添加的小量。
所以
Δxt=−ηRMS[g]tgt\Delta x_t = -\frac{\eta}{\mathrm{RMS}[g]_t}g_t Δxt​=−RMS[g]t​η​gt​
这还不是最终版本,另一个启发决定了η\etaη的选择。

我们知道,很多问题是有实际含义的,xxx可能是有单位的,比如是米,天等,所以,一个很自然的期望是,Δx\Delta xΔx的单位和xxx是保持一致的。但是:
units of Δx∝units of g∝∂f∂x∝1units of x\mathrm{units \: of \:}\Delta x \propto \mathrm{units \: of \:} g \propto \frac{\partial f}{\partial x}\propto \frac{1}{\mathrm{units \: of \:} x} unitsofΔx∝unitsofg∝∂x∂f​∝unitsofx1​
也就是说Δx\Delta xΔx的步长单位和梯度单位是一致的,就像是l=vtl=vtl=vt,Δt\Delta tΔt的步长单位是m/sm/sm/s,是时间单位的倒数。
而利用二阶导数迭代步长就符合单位一致(如Newton方法):
Δx∝H−1g∝∂f∂x∂2f∂x2∝units of x\Delta x \propto H^{-1} g \propto \frac{\frac{\partial f}{\partial x}}{\frac{\partial^2 f}{\partial x^2}} \propto \mathrm{units \: of \:} x Δx∝H−1g∝∂x2∂2f​∂x∂f​​∝unitsofx
其中HHH为Hessian矩阵。
又注意到:
Δx=∂f∂x∂2f∂x2⇒1∂2f∂x2=Δx∂f∂x\Delta x = \frac{\frac{\partial f}{\partial x}}{\frac{\partial^2 f}{\partial x^2}} \Rightarrow \frac{1}{\frac{\partial^2 f}{\partial x^2}} = \frac{\Delta x}{\frac{\partial f}{\partial x}} Δx=∂x2∂2f​∂x∂f​​⇒∂x2∂2f​1​=∂x∂f​Δx​
于是,完全体的ADADELTA方法变为如下:

Δxt=−RMS[Δx]t−1RMS[g]tgt\Delta x_t = -\frac{\mathrm{RMS}[\Delta x]_{t-1}}{\mathrm{RMS}[g]_t}g_t Δxt​=−RMS[g]t​RMS[Δx]t−1​​gt​
分子式t−1t-1t−1的原因式Δxt\Delta x_tΔxt​压根不知道,所木有办法,就将就一下。

算法

完整的算法如下:

需要注意一点的是,在实际实验中,我们设置E[Δx2]0=1E[\Delta x^2]_0=1E[Δx2]0​=1而不是如算法中所说的0。因为,如果设置为0,那么意味着第一步只进行相当微小的迭代,所以之后也都是微小的迭代。或许作者是将ϵ\epsilonϵ设置为111?而不是一个小量?

ADADELTA 代码

import numpy as np
import matplotlib.pyplot as plt

这次用比较怪一点的方式来写,首先,创建一个类,用来存放函数fff和梯度ggg

class ADADELTA:def __init__(self, function, gradient, rho=0.7):assert hasattr(function, "__call__"), "Invalid function"assert hasattr(gradient, "__call__"), "Invalid gradient"assert 0 < rho < 1, "Invalid rho"self.__function = functionself.__gradient = gradientself.rho = rhoself.acc_gradient = 0 #初始化accumulate gradientself.acc_updates = 1 #初始化accumulate updatesself.progress = []@propertydef function(self):return self.__function@propertydef gradient(self):return self.__gradientdef reset(self):self.acc_gradient = 0 #初始化accumulate gradientself.acc_updates = 1 #初始化accumulate updatesself.progress = []

计算累计梯度
E[g2]t=ρE[g2]t−1+(1−ρ)gt2E[g^2]_t = \rho E[g^2]_{t-1} + (1-\rho)g_t^2 E[g2]t​=ρE[g2]t−1​+(1−ρ)gt2​

def accumulate_gradient(self, gt):self.acc_gradient = self.rho * self.acc_gradient \+ (1 - self.rho) * gt ** 2return self.acc_gradient
ADADELTA.accumulate_gradient = accumulate_gradient

更新E[Δx]tE[\Delta x]_tE[Δx]t​
E[Δx2]t=ρE[Δx2]t−1+(1−ρ)Δxt2E[\Delta x^2]_t = \rho E[\Delta x^2]_{t-1} + (1-\rho)\Delta x_t^2 E[Δx2]t​=ρE[Δx2]t−1​+(1−ρ)Δxt2​

def accumulate_updates(self, deltax):self.acc_updates = self.rho * self.acc_updates \+ (1 - self.rho) * deltax ** 2return self.acc_updates
ADADELTA.accumulate_updates = accumulate_updates

计算更新步长:
Δxt=−RMS[Δx]t−1RMS[g]tgt\Delta x_t = -\frac{\mathrm{RMS}[\Delta x]_{t-1}}{\mathrm{RMS}[g]_t}g_t Δxt​=−RMS[g]t​RMS[Δx]t−1​​gt​

def step(self, x, smoothingterm=1e-8):gt = self.gradient(x)self.accumulate_gradient(gt)RMS_gt = np.sqrt(self.acc_gradient + smoothingterm)RMS_up = np.sqrt(self.acc_updates + smoothingterm)deltax = -RMS_up / RMS_gt * gtself.accumulate_updates(deltax)return x + deltax
ADADELTA.step = step

进行t步

def process(self, startx, t, smoothingterm=1e-8):x = startxfor i in range(t):self.progress.append(x)x = self.step(x, smoothingterm)return self.progress
ADADELTA.process = process

可视化

def plot(self):x = np.arange(1, len(self.progress) + 1)y = np.array([self.function(item) for item in self.progress])fig, ax = plt.subplots(constrained_layout=True)ax.plot(x, y)ax.set_xlabel("steps")ax.set_ylabel("value of function")ax.set_title("value with steps")plt.show()
ADADELTA.plot = plot
def function(x):return x[0] ** 2 + 50 * x[1] ** 2def gradient(x):return 2 * x[0] + 100 * x[1]
test = ADADELTA(function, gradient, 0.9)
test.reset()
startx = np.array([10, 10])
test.process(startx, 50)
test.plot()

ADADELTA: AN ADAPTIVE LEARNING RATE METHOD相关推荐

  1. ADADELTA AN ADAPTIVE LEARNING RATE METHOD

    ADADELTA: AN ADAPTIVE LEARNING RATE METHOD 参考:[自适应学习率调整AdaDelta](https://www.cnblogs.com/neopenx/p/4 ...

  2. 机器学习笔记之学习率(learning rate)与过拟合(overfitting)

    这次的笔记,之所以把学习率和过拟合放在一起讲,是因为,Msc阶段的几个挂掉的入职面试(投的实习,有的直接变成了校招的比如hw和zx,还有ali),问了相关的问题,结果回答地不好,所以在这里把这两个东西 ...

  3. Paper:论文解读《Adaptive Gradient Methods With Dynamic Bound Of Learning Rate》中国本科生提出AdaBound的神经网络优化算法

    Paper:论文解读-<Adaptive Gradient Methods With Dynamic Bound Of Learning Rate>中国本科生(学霸)提出AdaBound的 ...

  4. Adam和学习率衰减(learning rate decay)

    1.梯度下降法更新参数 梯度下降法参数更新公式: 其中,η 是学习率,θt是第 t 轮的参数,J(θt) 是损失函数,∇J(θt) 是梯度. 在最简单的梯度下降法中,学习率 ηη 是常数,是一个需要实 ...

  5. loss乘以100等价于learning rate乘以100?

    导读 看到这个问题的时候,可能你会很直观的认为是等价的,其实等不等价这个应该取决于在更新参数时所选择的优化算法. 因为无论是缩放loss还是learning rate最终的影响都是对更新参数时偏移量( ...

  6. 如何理解深度学习分布式训练中的large batch size与learning rate的关系?

    问题详情: 在深度学习进行分布式训练时,常常采用同步数据并行的方式,也就是采用大的batch size进行训练,但large batch一般较于小的baseline的batch size性能更差,请问 ...

  7. 学习速率 learning rate

    学习速率的选取策略 运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率 ααα : 如果学习速率太小,则会使收敛过慢. 如果学习速率太大,则会导致代价函数振荡 ...

  8. machine learning (5)---learning rate

    degugging:make sure gradient descent is working correctly cost function(J(θ)) of Number of iteration ...

  9. learning rate四种改变方式

    Fixed learning rate固定不变 base_lr = 0.01 lr_policy = "fixed" Step learning rate在每迭代stepsize次 ...

  10. 关于Increased rates of convergence through learning rate adaptation一文的理解

    原文地址:http://www.researchgate.net/profile/Robert_Jacobs9/publication/223108796_Increased_rates_of_con ...

最新文章

  1. 711 发送请求失败_30秒上手新一代 Http 请求神器 RxHttp
  2. oracle:主键,外键
  3. Selenium2(WebDriver)开发环境搭建(java版)
  4. SAP_SD_客户退货需要做哪些处理
  5. 神策军丨优秀 Leader 养成记:多做简单又有效的事
  6. 学习有五个层次和境界
  7. C++与tolua++的完整调用流程,超级详解解决交互疑难
  8. 运放的开环增益和相移
  9. Rabbitmq取消预取机制配置,配置手动确认后仍然java.lang.IllegalStateException: Channel closed; cannot ack/nack的问题
  10. mysql重置所有表_清空mysql指定库里所有表数据
  11. 常见噪声及其消除的方式
  12. 【C语言复习】C语言中的文件操作
  13. H5页面展示丨网页三维展示丨产品3D展示原理【商迪3D】
  14. 美团酒旅实时数据规则引擎应用实践
  15. [歌词]《一花依世界》《君がいる世界へ》歌词假名罗马音(上标注音版)
  16. note edge android 6.0 root,三星Note Edge 6.0 root N9150ZCU1CQH5 root 高级设置
  17. adb:failed to install app.apk Failure [INSTALL_FAILED_VERSION_DOWNGRADE: Package Verification Result
  18. (SGPN)南加州大学 phd 王薇月:深度学习在点云分割中的应用 | 公开课视频内容分享总结
  19. 在元宇宙中打造“艺术”的世界
  20. Strace 解决性能问题案例一则

热门文章

  1. jmeter下载安装配置(超细)
  2. Python干货分享+百G资源放送!
  3. 开关电源测试软件有哪些,开关电源的测试项目大全,你确定都知道?
  4. Ubuntu好用的软件推荐
  5. Android 开源项目和文章集合(更新:2022.03.21)
  6. EBS开发_导入物料编码
  7. 什么新东西值得学「GitHub 热点速览 v.22.29」
  8. 思维导图—Git命令全集
  9. 微信小程序websocket实现即时聊天功能
  10. 美股个股熔断机制[博]