【深度学习笔记】7_7 AdaDelta算法

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图

7.7 AdaDelta算法

除了RMSProp算法以外,另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 [1]。有意思的是,AdaDelta算法没有学习率这一超参数

Adadelta是一种自适应学习率的方法,用于神经网络的训练过程中。 它的基本思想是避免使用手动调整学习率的方法来控制训练过程,而是自动调整学习率,使得训练过程更加顺畅。

7.7.1 算法

AdaDelta算法也像RMSProp算法一样,使用了小批量随机梯度 g t \boldsymbol{g}_t gt按元素平方的指数加权移动平均变量 s t \boldsymbol{s}_t st。在时间步0,它的所有元素被初始化为0。给定超参数 0 ≤ ρ < 1 0 \leq \rho < 1 0ρ<1(对应RMSProp算法中的 γ \gamma γ),在时间步 t > 0 t>0 t>0,同RMSProp算法一样计算

s t ← ρ s t − 1 + ( 1 − ρ ) g t ⊙ g t . \boldsymbol{s}_t \leftarrow \rho \boldsymbol{s}_{t-1} + (1 - \rho) \boldsymbol{g}_t \odot \boldsymbol{g}_t. stρst1+(1ρ)gtgt.

与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量 Δ x t \Delta\boldsymbol{x}_t Δxt,其元素同样在时间步0时被初始化为0。我们使用 Δ x t − 1 \Delta\boldsymbol{x}_{t-1} Δxt1来计算自变量的变化量:

g t ′ ← Δ x t − 1 + ϵ s t + ϵ ⊙ g t , \boldsymbol{g}_t' \leftarrow \sqrt{\frac{\Delta\boldsymbol{x}_{t-1} + \epsilon}{\boldsymbol{s}_t + \epsilon}} \odot \boldsymbol{g}_t, gtst+ϵΔxt1+ϵ gt,

其中 ϵ \epsilon ϵ是为了维持数值稳定性而添加的常数,如 1 0 − 5 10^{-5} 105。接着更新自变量:

x t ← x t − 1 − g t ′ . \boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \boldsymbol{g}'_t. xtxt1gt.

最后,我们使用 Δ x t \Delta\boldsymbol{x}_t Δxt来记录自变量变化量 g t ′ \boldsymbol{g}'_t gt按元素平方的指数加权移动平均:

Δ x t ← ρ Δ x t − 1 + ( 1 − ρ ) g t ′ ⊙ g t ′ . \Delta\boldsymbol{x}_t \leftarrow \rho \Delta\boldsymbol{x}_{t-1} + (1 - \rho) \boldsymbol{g}'_t \odot \boldsymbol{g}'_t. ΔxtρΔxt1+(1ρ)gtgt.

可以看到,如不考虑 ϵ \epsilon ϵ的影响,AdaDelta算法跟RMSProp算法的不同之处在于使用 Δ x t − 1 \sqrt{\Delta\boldsymbol{x}_{t-1}} Δxt1 来替代学习率 η \eta η

7.7.2 从零开始实现

AdaDelta算法需要对每个自变量维护两个状态变量,即 s t \boldsymbol{s}_t st Δ x t \Delta\boldsymbol{x}_t Δxt。我们按AdaDelta算法中的公式实现该算法。

%matplotlib inline
import torch
import sys
sys.path.append("..") 
import d2lzh_pytorch as d2lfeatures, labels = d2l.get_data_ch7()def init_adadelta_states():s_w, s_b = torch.zeros((features.shape[1], 1), dtype=torch.float32), torch.zeros(1, dtype=torch.float32)delta_w, delta_b = torch.zeros((features.shape[1], 1), dtype=torch.float32), torch.zeros(1, dtype=torch.float32)return ((s_w, delta_w), (s_b, delta_b))def adadelta(params, states, hyperparams):rho, eps = hyperparams['rho'], 1e-5for p, (s, delta) in zip(params, states):s[:] = rho * s + (1 - rho) * (p.grad.data**2)g =  p.grad.data * torch.sqrt((delta + eps) / (s + eps))p.data -= gdelta[:] = rho * delta + (1 - rho) * g * g

使用超参数 ρ = 0.9 \rho=0.9 ρ=0.9来训练模型。

d2l.train_ch7(adadelta, init_adadelta_states(), {'rho': 0.9}, features, labels)

输出:

loss: 0.243728, 0.062991 sec per epoch

在这里插入图片描述

7.7.3 简洁实现

通过名称为Adadelta的优化器方法,我们便可使用PyTorch提供的AdaDelta算法。它的超参数可以通过rho来指定。

d2l.train_pytorch_ch7(torch.optim.Adadelta, {'rho': 0.9}, features, labels)

输出:

loss: 0.242104, 0.047702 sec per epoch

在这里插入图片描述

小结

  • AdaDelta算法没有学习率超参数,它通过使用有关自变量更新量平方的指数加权移动平均的项来替代RMSProp算法中的学习率。

参考文献

[1] Zeiler, M. D. (2012). ADADELTA: an adaptive learning rate method. arXiv preprint arXiv:1212.5701.


注:除代码外本节与原书此节基本相同,原书传送门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/535923.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的面向智慧教育的实习实践系统设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的面向智慧教育的实习实践系统设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…

企业微信高效沟通的秘诀

在数字化营销的浪潮中&#xff0c;企业微信已成为连接企业和客户的重要渠道。为了提升客户服务效率&#xff0c;许多企业通过设置快捷回复语来优化客户接待流程。然而&#xff0c;随着客户量的激增&#xff0c;传统的快捷回复已无法完全满足需求。今天&#xff0c;我要为大家介…

多数问题求解之蒙特卡洛与分治法

多数问题&#xff08;Majority Problem&#xff09;是一个有多种求解方法的经典问题&#xff0c;其问题定义如下&#xff1a; 给定一个大小为 n n n的数组&#xff0c;找出其中出现次数超过 n / 2 n/2 n/2的元素 例如&#xff1a;当输入数组为 [ 5 , 3 , 5 , 2 , 3 , 5 , 5 ] […

【速看】高效工具!你绝不能错过的7款时间轴制作软件

如果你希望制定一个计划&#xff0c;无论大或小、时间长短&#xff0c;时间表是规划理想未来的有效方法。它们可以让你清楚地了解自己有多少时间&#xff0c;并帮助你了解需要做什么以及何时做。 1. boardmix boardmix博思白板是一个专业的在线绘图工具&#xff0c;它提供了丰富…

element el-table 高度自适应 无法纵向滑动

人最终还是会活成自己讨厌的那种类型&#xff0c;不知道是心魔还是病痷。渐渐的对于自己看着不顺心的人事情总会指摘那么几句&#xff0c;其实自己完全是出于善意的初衷&#xff0c;可往往收到的是对方愚昧的回应。 还是经常自我反省那句&#xff1a;如果回到农村&#xff0c;有…

初识C++类和对象(1)

1.定义类 我们使用class进行表示类&#xff0c;class后面的是类名rect&#xff0c;在类里面我们可以定义成员变量&#xff0c;这个题目我们是要去求长方形的周长和面积&#xff0c;我们定义长方形的长&#xff0c;和长方形的宽度&#xff1b; 我们定义了2个函数计算长方形的周…

【Python数据结构与判断6/7】一对一的字典

目录 目标 字典 代码示例 增删查改 字典访问元素 删除元素 字典的添加 修改元素 字典与列表的比较 Debug 总结 目标 在前面的内容中我们学习了元组与列表这样按照索引顺序查找数据的类型。 当我们存储的数据过多时&#xff0c;如何快速查找一个指定的数据就成…

一个简单的微信小程序表单提交样式模板

没什么东西&#xff0c;只是方便自己直接复制使用 .wxml <view class"box"><form bindsubmit"formSubmit"><view class"form-item"><text class"head">姓名&#xff1a;</text><input class"…

【LeetCode: 2864. 最大二进制奇数 + 模拟 + 位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

使用Mybatis-plus来完成多表联查

1、需要进行多表联查的表 电影表&#xff08;t_film&#xff09;、电影地区表(t_film_type)、电影分类表&#xff08;t_film_region&#xff09; 2、在项目中创建表的实体类 FIlm类、FilmType类、FilmRegion类 3、完善实体 &#xff08;1&#xff09;Data lombok依赖…

【C语言】字符串函数上

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是字符串函数上篇&#xff0c;主要是关于长度不受限制的字符串函数&#xff08;strlen,strcpy,strcat,strcm…

24-Java策略模式 ( Strategy Pattern )

Java策略模式 摘要实现范例 策略模式的重心不是如何实现算法&#xff0c;而是如何组织、调用这些算法&#xff0c;从而让程序结构更加灵活&#xff0c;具有更好的维护性和扩展性。 策略模式属于行为型模式 摘要 1. 意图 针对一组算法&#xff0c;将每一个算法封装到具有共…