ADADELTA: AN ADAPTIVE LEARNING RATE METHOD
文章目录
- 引
- 主要内容
- 算法
- 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]tRMS[Δx]t−1gt
其中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=−∑τ=1tgτ2ηgt
也就是,步长与之前所有的梯度有关,显然这个步长是会逐渐减少的。但是这个缺点也很明显,如果起始点的梯度很大,那么就会导致后续步长很小,而一开始的梯度很小,就会导致后续步长很大,产生振荡,有些怪怪的。
而ADADELTA希望只关心一部分的梯度,比如
∑τ=t−ktgτ2\sqrt{\sum_{\tau=t-k}^tg_{\tau}^2} τ=t−k∑tgτ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∂2f1=∂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]tRMS[Δx]t−1gt
分子式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]tRMS[Δx]t−1gt
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相关推荐
- ADADELTA AN ADAPTIVE LEARNING RATE METHOD
ADADELTA: AN ADAPTIVE LEARNING RATE METHOD 参考:[自适应学习率调整AdaDelta](https://www.cnblogs.com/neopenx/p/4 ...
- 机器学习笔记之学习率(learning rate)与过拟合(overfitting)
这次的笔记,之所以把学习率和过拟合放在一起讲,是因为,Msc阶段的几个挂掉的入职面试(投的实习,有的直接变成了校招的比如hw和zx,还有ali),问了相关的问题,结果回答地不好,所以在这里把这两个东西 ...
- Paper:论文解读《Adaptive Gradient Methods With Dynamic Bound Of Learning Rate》中国本科生提出AdaBound的神经网络优化算法
Paper:论文解读-<Adaptive Gradient Methods With Dynamic Bound Of Learning Rate>中国本科生(学霸)提出AdaBound的 ...
- Adam和学习率衰减(learning rate decay)
1.梯度下降法更新参数 梯度下降法参数更新公式: 其中,η 是学习率,θt是第 t 轮的参数,J(θt) 是损失函数,∇J(θt) 是梯度. 在最简单的梯度下降法中,学习率 ηη 是常数,是一个需要实 ...
- loss乘以100等价于learning rate乘以100?
导读 看到这个问题的时候,可能你会很直观的认为是等价的,其实等不等价这个应该取决于在更新参数时所选择的优化算法. 因为无论是缩放loss还是learning rate最终的影响都是对更新参数时偏移量( ...
- 如何理解深度学习分布式训练中的large batch size与learning rate的关系?
问题详情: 在深度学习进行分布式训练时,常常采用同步数据并行的方式,也就是采用大的batch size进行训练,但large batch一般较于小的baseline的batch size性能更差,请问 ...
- 学习速率 learning rate
学习速率的选取策略 运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率 ααα : 如果学习速率太小,则会使收敛过慢. 如果学习速率太大,则会导致代价函数振荡 ...
- machine learning (5)---learning rate
degugging:make sure gradient descent is working correctly cost function(J(θ)) of Number of iteration ...
- learning rate四种改变方式
Fixed learning rate固定不变 base_lr = 0.01 lr_policy = "fixed" Step learning rate在每迭代stepsize次 ...
- 关于Increased rates of convergence through learning rate adaptation一文的理解
原文地址:http://www.researchgate.net/profile/Robert_Jacobs9/publication/223108796_Increased_rates_of_con ...
最新文章
- 单片机与微处理器和微型计算机的关系,微处理器、CPU、微处理机、微机、单片机它们之间有何区别?...
- mongodb常用语句以及SpringBoot中使用mongodb
- 输入一个正整数,求它各位数的数字之和
- 语音识别:从GMM-HMM到端到端
- Kubernetes网络设计原则
- mysql学生选课系统的关系模型_使用PowerDesigner搭建学生选课管理系统(学生老师管理员一体系结构)由基础设计至数据库生成(SQL语句源代码的生成)全过程实例操作...
- 敏捷开发绩效管理之六:敏捷开发生产率(中)(功能点分析,FPA,简化的功能点)...
- 一个数的约数(个数。约数和)
- 按网络管理模式 计算机网络可分为,计算机网络应用 按网络管理模式分类
- 单片机高效c语言编程,飞思卡尔单片机高效C语言编程(中文).pdf
- 一个大二前端的2017自我总结
- ,智商达到140及以上可以称之为天才
- 办公未来已来,金山WPS如何从“追随者”到“领跑者”
- app系统服务器出错怎么回事,app连接服务器出错
- Ubuntu18系统 PL2303GT驱动安装及绑定
- 男人,就要对自己下手狠一点
- 主板的芯片和插槽介绍
- 【肺实质分割】基于主动轮廓模型和贝叶斯方法识别实现胸膜旁肺实质分割附matlab代码
- 【厚积薄发系列】Python项目总结2—Python的闭包
- 数据库系统概念 | 第三章:SQL介绍
热门文章
- 不升级IE9的五大理由
- 为什么程序员下班后只关显示器却从不关电脑?
- 如何在Linux上编写和运行程序?
- android阿里图标库,Android Stdio调用阿里图标库
- 国电集团:电子招投标每年节约成本10亿元
- linux 批量修改文件后缀名
- Junit4测试报错:java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
- Steam软件联网问题解决方案
- 代码对比工具 mac
- oppo9s刷机教程_oppo r9s怎么刷机 oppo r9s手机在线刷机教程