AdaDelta算法

2023-11-07

记录一下自己的学习过程~也能让自己的印象更深吧
AdaDelta算法主要是为了解决AdaGrad算法中存在的缺陷,下面先介绍一下AdaGrad算法优点和以及存在的问题:

AdaGrad的迭代公式如下所示:
Δ x t = η ∑ i = 1 t g i 2 ∗ g t \Delta{x_{t}}=\frac{\eta}{\sqrt{\sum_{i=1}^{t}{g_i^2}}}*g_t Δxt=i=1tgi2 ηgt
x t = x t − 1 − Δ x t x_t=x_{t-1}-\Delta{x_t} xt=xt1Δxt
其中 g t g_t gt表示当前迭代次数的梯度值。

  • 优点
    学习率将随着梯度的倒数增长,也就是说较大梯度具有较小的学习率,而较小的梯度具有较大的学习率,可以解决普通的sgd方法中学习率一直不变的问题
  • 缺点
    还是需要自己手动指定初始学习率,而且由于分母中对历史梯度一直累加,学习率将逐渐下降至0,并且如果初始梯度很大的话,会导致整个训练过程的学习率一直很小,从而导致学习时间变长。

而AdaDelta算法的提出就是为了解决上述的问题,AdaDelta有两种解决方案:

改进方法一:Accumulate Over Window

  • 在一个窗口w中对梯度进行求和,而不是对梯度一直累加
  • 因为存放 w 之前的梯度是低效的,所以可以用对先前所有梯度均值(使用RMS即均方根值实现)的一个指数衰减作为代替的实现方法。

更新公式如下:
① 将累计梯度信息从全部历史梯度变为当前时间向前的一个窗口期内的累积:
E [ g 2 ] t = ρ ∗ E [ g 2 ] t − 1 + ( 1 − ρ ) ∗ g t 2 E[g^2]_t=\rho*E[g^2]_{t-1}+(1-\rho)*g_t^2 E[g2]t=ρE[g2]t1+(1ρ)gt2
相当于历史梯度信息的累计乘上一个衰减系数 ρ \rho ρ,然后用 ( 1 − ρ ) (1-\rho) (1ρ)作为当前梯度的平方加权系数相加。

②然后将上述 E [ g t 2 ] E[g_t^2] E[gt2]开方后,作为每次迭代更新后的学习率衰减系数:
x t + 1 = x t − η E [ g 2 ] t + ϵ ∗ g t {x_{t+1}}=x_t-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}*g_t xt+1=xtE[g2]t+ϵ ηgt
R M S ( g t ) = E [ g 2 ] t + ϵ RMS(g_t)=\sqrt{E[g^2]_t+\epsilon} RMS(gt)=E[g2]t+ϵ ,其中 ϵ \epsilon ϵ是为了防止分母为0而加上的一个极小值。
这种更新方法解决了对历史梯度一直累加而导致学习率一直下降的问题,当时还是需要自己选择初始的学习率

改进方法二:Correct Units with Hessian Approximation

通过牛顿法可以知道,牛顿法迭代步长是 f ′ ′ ( x ) f^{\prime\prime}(x) f(x),二阶牛顿迭代公式为(求最小值);
x t + 1 = x t − f ′ ( x ) f ′ ′ ( x ) = x t − 1 f ′ ′ ( x ) ∗ f ′ ( x ) x_{t+1}=x_t-\frac{f^{\prime}(x)}{f^{\prime\prime}(x)} = x_t - \frac{1}{f^{\prime\prime}(x)}*f^{\prime}(x) xt+1=xtf(x)f(x)=xtf(x)1f(x)可以看出牛顿算法的迭代步长是二阶近似的解析解,不需要我们手动指定学习率。
  而高阶的牛顿法迭代的步长为 H e s s i a n \boldsymbol{Hessian} Hessian矩阵。
AdaDelta算法正是采用了这种思想,采用 H e s s i a n \boldsymbol{Hessian} Hessian矩阵的对角线近似 H e s s i a n \boldsymbol{Hessian} Hessian矩阵。
公式如下所示:
Δ x ≈ ∂ f ∂ x ∂ 2 f ∂ x 2 \Delta{x}\approx{\frac{\frac{\partial{f}}{\partial{x}}}{\frac{\partial^2{f}}{\partial{x^2}}}} Δxx22fxf
于是有:
1 ∂ 2 f ∂ x 2 = Δ x ∂ f ∂ x \frac{1}{{\frac{\partial^2{f}}{\partial{x^2}}}}=\frac{\Delta{x}}{\frac{\partial{f}}{\partial{x}}} x22f1=xfΔx
而更新公式为:
x t + 1 = x t − 1 ∂ 2 f ∂ x 2 ∗ g t = Δ x ∂ f ∂ x ∗ g t x_{t+1}=x_t-\frac{1}{{\frac{\partial^2{f}}{\partial{x^2}}}}*g_t=\frac{\Delta{x}}{\frac{\partial{f}}{\partial{x}}}*g_t xt+1=xtx22f1gt=xfΔxgt

同理对分子分母按照上一个方法进行处理,可以得到以下公式:

  • 其中假设x附近的曲率是平滑的,而 x t + 1 x_{t+1} xt+1可以近似 x t x_t xt
    Δ x = R M S [ ( Δ x ) ] t − 1 R M S [ g ] t ∗ g t \Delta{x}=\frac{RMS[(\Delta{x})]_{t-1}}{RMS[g]_t}*g_t Δx=RMS[g]tRMS[(Δx)]t1gt
    x t + 1 = x t − Δ x x_{t+1}=x_t-\Delta{x} xt+1=xtΔx
    其中 g t g_t gt为本次迭代的梯度。
  • 由于 R M S RMS RMS永远为正,所以能保证更新的方向一直为梯度的负方向
  • 分子作为一个加速项,作为动量在时间窗口 w w w上积累先前的梯度。
    下面是论文中的算法展示:
    在这里插入图片描述

有时间自己用python实现一下然后再贴上来

参考文献
ADADELTA: AN ADAPTIVE LEARNING RATE METHOD(2012)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AdaDelta算法 的相关文章

  • linux查看文件夹大小

    linux怎么查看文件夹多大 1 最简单的查看方法可以使用ls ll ls lh命令进行查看 当使用ls ll 会显示成字节大小 而ls lh会以KB MB等为单位进行显示 这样比较直观一些 2 通过命令du h max depth 1 可
  • Lesson 6.4 逻辑回归手动调参实验

    文章目录 一 数据准备与评估器构造 1 数据准备 2 构建机器学习流 二 评估器训练与过拟合实验 三 评估器的手动调参 在补充了一系列关于正则化的基础理论以及 sklearn 中逻辑回归评估器的参数解释之后 接下来 我们尝试借助 sklea
  • 知网CAJ直接PDF下载,并且autoBookMark添加书目

    知网能下PDF 谷歌浏览器下 You猴 安装这两个插件 CNKI 中国知网 PDF 全文下载 特制版 知网下载助手 安装所需要的文件链接 链接 https pan baidu com s 1sIKJnvuZE2P8r4HSETrWGQ 提取
  • Android TextEdit 文本框设置

    文本框类型设置 android inputType none 输入普通字符 android inputType text 输入普通字符 android inputType textCapCharacters 输入普通字符 android i

随机推荐

  • 从零开始学习React——(十六):利用React生命周期优化组件

    通过上一节 对于React生命周期有了新认识 如何利用它来提高组件的性能呢 本节将会抛砖引玉讲解一个小例子 为了代码的清晰 可以删除上一节一些无关的生命周期函数代码 1 ChildItem js存在性能问题 那就是 子组件ChildItem
  • GPU指令下发方式

    1 概述 GPU接收CPU发送的渲染命令 执行相应的计算 渲染命令在CPU和GPU之间传递 由CPU发送给GPU AMD的GPU有两种命令发送方式 第一种是CPU通过直接写GPU的寄存器 发送相应的渲染命令 对于GPU来说 这种方式是CPU
  • Vue中table实现行的上移和下移

    链接 html
  • 【基础知识学习】链表的创建

    链表的创建 因为对链表使用不太熟悉 学习使用数组创建了一个链表并访问 代码如下 以后学到新的知识继续补充 include
  • mfc入门基础(七)向导对话框的创建与显示

    实现参考 VS2010 MFC编程入门之十四 对话框 向导对话框的创建及显示 软件开发 鸡啄米 一 向导对话框的创建与显示 1 具体的例子使用 还是参照上节或者说上上节中的例子写出来 test02 所以也还是在这个基础上来进行更改 2 创建
  • Day82-基于ElasticSearch的实战-仿京东搜素

    基于ElasticSearch的实战 仿京东搜素 1 创建springboot项目 添加相关依赖 2 导入相关Maven依赖
  • HAL库使用硬件SPI驱动0.96寸OLED stm32F401

    找一个可以使用SPI接口的OLED驱动程序 一般买OLED会提供 或者自己网上找 这里用的是中景园的例程 由于我使用的开发板是STM32F401ccu6 所以我先移植到我的开发板上 主要改的 打开MXcube 配置时钟 配置DEBUG 我这
  • RBM中的Gibbs,CD-K,PCD三种抽样方式

    首先看RBM教程推导 http blog csdn net itplus article details 19207371 推导到下图时 对中括号中的第二项进行计算 是 通过采样的到的 那么采样有三种方法 Gibbs CD K PCD 下面
  • JDBC的原理及应用

    一 JDBC作用 JDBC Java DataBase Connectivity 就是Java数据库连接 简单说就是封装了java语言操作不同据库 例如 mysql oracle sqlServer等数据库 的接口 各个数据库厂商实现这个接
  • SpringBoot 多模块的优点与必要性

    使用多模块的原因 使用Java技术开发的工程项目 无论是数据处理系统还是Web网站 随着项目的不断发展 需求的不断细化与添加 工程项目中的代码越来越多 包结构也越来越复杂这时候工程的进展就会遇到各种问题 1 不同方面的代码之间相互耦合 这时
  • vsCode注释快捷键

    系列文章目录 文章目录 系列文章目录 前言 一 pandas是什么 二 使用步骤 1 你也可以选择代码 使用上方菜单的 编辑 来手动注释代码 前言 VScode怎么注释掉一段代码 快捷键直接搞定 一 pandas是什么 示例 pandas
  • vue 封装组件供全局使用_Vue如何封装高质量组件

    依照MVC模式思想来解释高可复用性 低耦合性的组件定义方法 组件分类 级别从小到大 基础组件 只是一种宽泛的定义 可见场景较多 与业务无关的组件 比如列表 表格 输入框等 没有实际的UI 故不能直接使用 UI组件 与基础组件同级 为基础组件
  • python os.walk 指定遍历深度_使用os.walk()以递归方式遍历Python中的目录

    试试这个 usr bin env python coding utf 8 FileTreeMaker py author legendmohe import os import argparse import time class File
  • STM32实现74HC595控制

    一 前言 本文主要是实出74HC595的简单控制功能实现 学习笔记整理 二 概述 一 74HC595简述 74HC595是一个8位串行输入 平行输出的位移缓存器 平台行输出为三态输出 在SCHCP的上升沿输入 在STCP的上升沿进入存储寄存
  • 测试开发-晋级之路4-函数进阶(闭包 装饰器)***

    一 闭包 在上面我们见过了再函数中调用函数本身 那么在函数中可不可以定义一个函数 问题需求 如何函故外部调用函数内部定义的函数 问题的引入 到底什么是闭包 闭包的概念 一个完整的闭包须满足一下三个条件 1 函数中嵌套一个函数 2 外层函数返
  • ubuntu系统下配置vscode编译cmake

    文章目录 一 配置vs code运行c 代码 三个关键文件介绍 1 tasks json run helloworld cpp 1 1 打开cpp文件 使其成为活动文件 1 2 按编辑器右上角的播放按钮 1 3生成task文件 1 4 此时
  • 如何在工作中利用AIGC提质增效?

    引言 人工智能技术快速发展 以 ChatGPT 为代表的新的人工智能语言模型的出现与更迭 引发人们极大的兴奋和关注 越来越多的企业开始将 AI 技术应用到生产流程 以提高工作效率和生产力 AIGC AI Generated Content
  • SQLMAP 脱库过程(post请求,三种方法)

    一 准备工作 1 sqlmap为python语言开发 因此需要具备python环境 2 python环境搭建及sqlmap下载 可参考其他文章 很多也很全 这个不是本文重点 因此略过 二 环境搭建 1 本人使用的是Mac windows7虚
  • Python自动化运维之一(Python入门)

    Python简介 python是吉多 范罗苏姆发明的一种面向对象的脚本语言 可能有些人不知道面向对象和脚本具体是什么意思 但是对于一个初学者来说 现在并不需要明白 大家都知道 当下全栈工程师的概念很火 而Python是一种全栈的开发语言 所
  • AdaDelta算法

    记录一下自己的学习过程 也能让自己的印象更深吧 AdaDelta算法主要是为了解决AdaGrad算法中存在的缺陷 下面先介绍一下AdaGrad算法优点和以及存在的问题 AdaGrad的迭代公式如下所示 x t