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