AdaDelta算法

除了RMSProp算法以外,另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 [1]。

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

AdaDelta算法也像RMSProp算法一样,使用了小批量随机梯度gt\boldsymbol{g}_tgt​按元素平方的指数加权移动平均变量st\boldsymbol{s}_tst​。

  • 在时间步0,它的所有元素被初始化为0。给定超参数0≤ρ<10 \leq \rho < 10≤ρ<1(对应RMSProp算法中的γ\gammaγ)
  • 在时间步t>0t>0t>0,同RMSProp算法一样计算

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

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

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

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

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

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

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

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

实现AdaDelta

AdaDelta算法需要对每个自变量维护两个状态变量,即st\boldsymbol{s}_tst​和Δxt\Delta\boldsymbol{x}_tΔxt​。

按AdaDelta算法中的公式实现该算法。

def get_data_ch7():  data = np.genfromtxt('data/airfoil_self_noise.dat', delimiter='\t')data = (data - data.mean(axis=0)) / data.std(axis=0)return torch.tensor(data[:1500, :-1], dtype=torch.float32), \torch.tensor(data[:1500, -1], dtype=torch.float32) # 前1500个样本(每个样本5个特征)
%matplotlib inline
import torch
import sysfeatures, labels = 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
def train_ch7(optimizer_fn, states, hyperparams, features, labels,batch_size=10, num_epochs=2):# 初始化模型net, loss = linreg, squared_lossw = torch.nn.Parameter(torch.tensor(np.random.normal(0, 0.01, size=(features.shape[1], 1)), dtype=torch.float32),requires_grad=True)b = torch.nn.Parameter(torch.zeros(1, dtype=torch.float32), requires_grad=True)def eval_loss():return loss(net(features, w, b), labels).mean().item()ls = [eval_loss()]data_iter = torch.utils.data.DataLoader(torch.utils.data.TensorDataset(features, labels), batch_size, shuffle=True)for _ in range(num_epochs):start = time.time()for batch_i, (X, y) in enumerate(data_iter):l = loss(net(X, w, b), y).mean()  # 使用平均损失# 梯度清零if w.grad is not None:w.grad.data.zero_()b.grad.data.zero_()l.backward()optimizer_fn([w, b], states, hyperparams)  # 迭代模型参数if (batch_i + 1) * batch_size % 100 == 0:ls.append(eval_loss())  # 每100个样本记录下当前训练误差# 打印结果和作图print('loss: %f, %f sec per epoch' % (ls[-1], time.time() - start))set_figsize()plt.plot(np.linspace(0, num_epochs, len(ls)), ls)plt.xlabel('epoch')plt.ylabel('loss')
train_ch7(adadelta, init_adadelta_states(), {'rho': 0.9}, features, labels)

也可以使用pytorch内置的optim.Adadelta:

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

深度学习优化算法-AdaDelta算法相关推荐

  1. 重磅 | 2017年深度学习优化算法研究亮点最新综述火热出炉

    翻译 | AI科技大本营(微信ID:rgznai100) 梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法.几乎当前每一个先进的(state-of-the-art ...

  2. Adam 那么棒,为什么还对 SGD 念念不忘?一个框架看懂深度学习优化算法

    作者|Juliuszh 链接 | https://zhuanlan.zhihu.com/juliuszh 本文仅作学术分享,若侵权,请联系后台删文处理 机器学习界有一群炼丹师,他们每天的日常是: 拿来 ...

  3. 2017年深度学习优化算法最新进展:如何改进SGD和Adam方法?

    2017年深度学习优化算法最新进展:如何改进SGD和Adam方法? 深度学习的基本目标,就是寻找一个泛化能力强的最小值,模型的快速性和可靠性也是一个加分点. 随机梯度下降(SGD)方法是1951年由R ...

  4. 深度学习优化算法的总结与梳理(从 SGD 到 AdamW 原理和代码解读)

    作者丨科技猛兽 转自丨极市平台 本文思想来自下面这篇大佬的文章: Juliuszh:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam https://zhuanlan.zhihu.com/ ...

  5. adam算法效果差原因_深度学习优化器-Adam两宗罪

    在上篇文章中,我们用一个框架来回顾了主流的深度学习优化算法.可以看到,一代又一代的研究者们为了我们能炼(xun)好(hao)金(mo)丹(xing)可谓是煞费苦心.从理论上看,一代更比一代完善,Ada ...

  6. 大梳理!深度学习优化算法:从 SGD 到 AdamW 原理和代码解读

    ‍ 作者丨知乎 科技猛兽  极市平台 编辑 https://zhuanlan.zhihu.com/p/391947979 本文思想来自下面这篇大佬的文章: Juliuszh:一个框架看懂优化算法之异同 ...

  7. 深度学习优化算法,Adam优缺点分析

    优化算法 首先我们来回顾一下各类优化算法. 深度学习优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -& ...

  8. Adam那么棒,为什么还对SGD念念不忘?一个框架看懂深度学习优化算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者|Juliuszh,https://zhuanlan.zhih ...

  9. 2017年深度学习优化算法最新进展:改进SGD和Adam方法

    2017年深度学习优化算法最新进展:如何改进SGD和Adam方法 转载的文章,把个人觉得比较好的摘录了一下 AMSGrad 这个前期比sgd快,不能收敛到最优. sgdr 余弦退火的方案比较好 最近的 ...

  10. Pytorch框架的深度学习优化算法集(优化中的挑战)

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net Py ...

最新文章

  1. GitHub 热榜:来膜拜这个流弊的 AI 框架!
  2. sigaction 函数,sigemptyset()函数,fcntl()函数,isatty()函数
  3. centos6.5配置linux dhcp
  4. 经典面试题(7):下面的代码运行结果是什么么?
  5. 在集设|参透海报设计中提取排版设计灵感
  6. php伪协议漏洞_PHP之伪协议深入理解
  7. 数据结构与算法之一快速排序
  8. git pull没有更新成功_关于git pull时出现的问题及解决反思
  9. 罚函数(penalty function)的设计
  10. LYNC功能之呼叫合并
  11. 我与计算机作文450字,第一次上网作文450字(通用5篇)
  12. Python实现CarMaker TestRun的泛化
  13. 大学什么专业学c语言和机械制图,机械设计工程师大学时应该学什么
  14. OpenCV:图像锐化
  15. 中望3d快捷键命令大全_CAD、3D快捷命令
  16. java生成唯一订单号
  17. 660 - 循环基础-利息计算
  18. Photoshop(4)做海报的心得
  19. 性能测试中怎么检测CPU情况
  20. 【DCT】基于simulink的dual clutch Transmission双离合器变速器系统仿真系统详细解析

热门文章

  1. Android app修改IMEI号
  2. AD9如何自定义板子外形,导圆角
  3. c语言iostream函数用法,iostream中的extern对象解决方法
  4. 1.2 iostream库简介
  5. Camtasia Studio2022卡塔莎(专业的电脑屏幕录像软件)
  6. LINGO11 百度网盘
  7. 对民办幼儿园管理的几点思考
  8. matlab求线与面的夹角,基于MATLAB的通用晶面间夹角公式的推导与求解
  9. PeckShield旗下数字资产反洗钱系统CoinHolmes亮相北京网络安全大会!
  10. 关于学习BEX5的问题