文章目录

  • 主要内容
  • 算法
  • 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. 单片机与微处理器和微型计算机的关系,微处理器、CPU、微处理机、微机、单片机它们之间有何区别?...
  2. mongodb常用语句以及SpringBoot中使用mongodb
  3. 输入一个正整数,求它各位数的数字之和
  4. 语音识别:从GMM-HMM到端到端
  5. Kubernetes网络设计原则
  6. mysql学生选课系统的关系模型_使用PowerDesigner搭建学生选课管理系统(学生老师管理员一体系结构)由基础设计至数据库生成(SQL语句源代码的生成)全过程实例操作...
  7. 敏捷开发绩效管理之六:敏捷开发生产率(中)(功能点分析,FPA,简化的功能点)...
  8. 一个数的约数(个数。约数和)
  9. 按网络管理模式 计算机网络可分为,计算机网络应用 按网络管理模式分类
  10. 单片机高效c语言编程,飞思卡尔单片机高效C语言编程(中文).pdf
  11. 一个大二前端的2017自我总结
  12. ,智商达到140及以上可以称之为天才
  13. 办公未来已来,金山WPS如何从“追随者”到“领跑者”
  14. app系统服务器出错怎么回事,app连接服务器出错
  15. Ubuntu18系统 PL2303GT驱动安装及绑定
  16. 男人,就要对自己下手狠一点
  17. 主板的芯片和插槽介绍
  18. 【肺实质分割】基于主动轮廓模型和贝叶斯方法识别实现胸膜旁肺实质分割附matlab代码
  19. 【厚积薄发系列】Python项目总结2—Python的闭包
  20. 数据库系统概念 | 第三章:SQL介绍

热门文章

  1. 不升级IE9的五大理由
  2. 为什么程序员下班后只关显示器却从不关电脑?
  3. 如何在Linux上编写和运行程序?
  4. android阿里图标库,Android Stdio调用阿里图标库
  5. 国电集团:电子招投标每年节约成本10亿元
  6. linux 批量修改文件后缀名
  7. Junit4测试报错:java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
  8. Steam软件联网问题解决方案
  9. 代码对比工具 mac
  10. oppo9s刷机教程_oppo r9s怎么刷机 oppo r9s手机在线刷机教程