Dive into Deep Learning-优化算法(2)

  1. 梯度下降
  • 为什么梯度下降可以优化目标函数:以一维梯度下降为例 f : R → R f:\mathbb{R}\rightarrow\mathbb{R} f:RR,利用泰勒展开,可以得到: f ( x + ϵ ) = f ( x ) + ϵ f ′ ( x ) + O ( ϵ 2 ) f(x + \epsilon) = f(x) + \epsilon f'(x) + O(\epsilon^2) f(x+ϵ)=f(x)+ϵf(x)+O(ϵ2),此时假定步长 η > 0 \eta>0 η>0,取 ϵ = − η f ′ ( x ) \epsilon = -\eta f'(x) ϵ=ηf(x),代入泰勒展开式中可以得到 f ( x − η f ′ ( x ) ) = f ( x ) − η f ′ 2 ( x ) + O ( η 2 f ′ 2 ( x ) ) f(x - \eta f'(x)) = f(x) - \eta f'^2(x) + O(\eta^2f'^2(x)) f(xηf(x))=f(x)ηf′2(x)+O(η2f′2(x)),由于式中 η f ′ 2 ( x ) > 0 \eta f'^2(x)>0 ηf′2(x)>0,所以总可以调整 η \eta η使得高阶项影响变小, f ( x − η f ′ ( x ) ) < f ( x ) f(x - \eta f'(x)) < f(x) f(xηf(x))<f(x),所以如果我们使用 x ← x − η f ′ ( x ) x\leftarrow x - \eta f'(x) xxηf(x)就可以使得函数 f ( x ) f(x) f(x)的值减小;
  • 学习率:上式中的 η \eta η,需要在更新缓慢和迭代震荡中选择合适的值;
  • 多元梯度下降,和上面类似,只是对于输入 x = [ x 1 , x 2 , ⋯ , x d ] T x=[x_1,x_2,\cdots,x_d]^T x=[x1,x2,,xd]T,目标函数 f : R d → R f:\mathbb{R}^d\rightarrow \mathbb{R} f:RdR,相应的梯度也是多元的, ∇ f ( x ) = [ ∂ f ( x ) ∂ x 1 , ∂ f ( x ) ∂ x 2 , ⋯ , ∂ f ( x ) ∂ x d ] T \nabla f(x) = [\frac{\partial f(x)}{\partial x_1},\frac{\partial f(x)}{\partial x_2},\cdots,\frac{\partial f(x)}{\partial x_d}]^T f(x)=[x1f(x),x2f(x),,xdf(x)]T,对应的泰勒展开 f ( x + ϵ ) = f ( x ) + ϵ T ∇ f ( x ) + O ( ∣ ∣ ϵ ∣ ∣ 2 ) f(x + \epsilon) = f(x) + \epsilon^T\nabla f(x) + O(||\epsilon||^2) f(x+ϵ)=f(x)+ϵTf(x)+O(∣∣ϵ2)
  • 自适应方法(牛顿法):上面的例子可以看出学习率比较敏感,需要仔细调整,借助泰勒展开, f ( x + ϵ ) = f ( x ) + ϵ T ∇ f ( x ) + 1 2 ϵ T ∇ 2 f ( x ) ϵ + O ( ∣ ∣ ϵ ∣ ∣ 3 ) f(x + \epsilon) = f(x) + \epsilon^T\nabla f(x) + \frac{1}{2}\epsilon^T\nabla^2f(x)\epsilon + O(||\epsilon||^3) f(x+ϵ)=f(x)+ϵTf(x)+21ϵT2f(x)ϵ+O(∣∣ϵ3),其中将 H = ∇ 2 f ( x ) H = \nabla^2 f(x) H=2f(x)定义为 f f f的Hessian矩阵, d × d d\times d d×d,其中H的储存代价对于深度学习来说很高,不适用,现在暂时不考虑适用性问题, f f f的最小值处 ∇ f = 0 \nabla f=0 f=0,可以得到 ∇ f ( x ) + H ϵ = 0 \nabla f(x) + H\epsilon = 0 f(x)+=0,得到 ϵ = − H − 1 ∇ f ( x ) \epsilon = -H^{-1}\nabla f(x) ϵ=H1f(x),更新 x : x = x − η H − 1 ∇ f ( x ) x:x = x - \eta H^{-1}\nabla f(x) x:x=xηH1f(x)
  1. 随机梯度下降
  • 深度学习中目标函数是训练数据集中每个样本损失函数的平均值即 f ( x ) = 1 n ∑ i = 1 n f i ( x ) f(x) = \frac{1}{n}\sum_{i=1}^nf_i(x) f(x)=n1i=1nfi(x),其中 n n n是样本数目,对应的梯度计算为 ∇ f ( x ) = 1 n ∑ i = 1 n ∇ f i ( x ) \nabla f(x) = \frac{1}{n}\sum_{i = 1}^n\nabla f_i(x) f(x)=n1i=1nfi(x),一次迭代的计算代价为 O ( n ) O(n) O(n)
  • 随机梯度下降 S G D SGD SGD在每次迭代中都随机采样一个索引 i i i,之后计算梯度 x ← x − η ∇ f i ( x ) x\leftarrow x - \eta\nabla f_i(x) xxηfi(x)来进行更新,每次迭代的复杂度降为 O ( 1 ) O(1) O(1),而且随机梯度 ∇ f i ( x ) \nabla f_i(x) fi(x)是完整梯度 ∇ f ( x ) \nabla f(x) f(x)的无偏估计 E i ∇ f i ( x ) = 1 n ∑ i = 1 n f i ( x ) = ∇ f ( x ) \mathbb{E}_i\nabla f_i(x) = \frac{1}{n}\sum_{i=1}^nf_i(x) = \nabla f(x) Eifi(x)=n1i=1nfi(x)=f(x),但是此时梯度下降每次迭代都存在噪声,而且当迭代到最小值附近的时候仍然会收到噪声的影响,需要动态的调整学习率;
  • 动态学习率:与时间相关的学习率 η ( t ) \eta(t) η(t)来取代常量 η \eta η
  1. 小批量随机梯度下降
  • 核心是为了计算效率;
  • 平均梯度减小了方差;
  1. 动量法
  • v t = β v t − 1 + g t , t − 1 v_t = \beta v_{t - 1} + g_{t,t-1} vt=βvt1+gt,t1,其中 g t , t − 1 g_{t,t-1} gt,t1为此时的梯度, v t v_t vt是动量,累加了过去的梯度,每次迭代 x t ← x t − 1 − η t v t x_t\leftarrow x_{t - 1}-\eta_tv_t xtxt1ηtvt
  • 有效的场景:在不同维度方向上的变量的梯度大小差异比较大的时候有效,此时假设不使用动量,那么大的学习率将会使大梯度变量方向发散,小的学习率会使小梯度方向变化缓慢;
  • 加快了收敛速度;
  • 由于对过去的数据进行了指数降权,有效梯度数为 1 1 − β \frac{1}{1-\beta} 1β1
  1. AdaGrad算法
  • 稀疏特征:在模型训练中偶尔出现的,例如语言模型训练时罕见词,在训练的时候,对应常见特征的参数收敛快,而罕见特征的参数收敛慢,换句话说,学习率要么对于常见特征而言降低太慢,要么对于不常见特征而言降低太快;
  • 一个解决办法是记录看到的特定特征的次数,并以此来调整学习率,例如 s ( i , t ) s(i,t) s(i,t)表示截止 t t t时观察到的功能 i i i的次数,学习率由原来 η = η 0 t + c → η 0 s ( i , t ) + c \eta=\frac{\eta_0}{\sqrt{t + c}}\rightarrow \frac{\eta_0}{\sqrt{s(i,t) + c}} η=t+c η0s(i,t)+c η0,允许每个维度拥有自己的学习率;
  • AdaGrad算法就是将粗略的计数器 s ( i , t ) s(i,t) s(i,t)替换为先前观察所得梯度的平方之和来解决这个问题,使用 s ( i , t + 1 ) = s ( i , t ) + ( ∂ i f ( x ) ) 2 s(i,t+1)=s(i,t)+(\partial_if(x))^2 s(i,t+1)=s(i,t)+(if(x))2来调整学习率;
  • g t = ∂ w l ( y t , f ( x t , w ) ) , s t = s t − 1 + g t 2 , w t = w t − 1 − η s t + ϵ ⋅ g t g_t = \partial_wl(y_t,f(x_t,w)),s_t = s_{t - 1} + g^2_t,w_t = w_{t - 1}-\frac{\eta}{\sqrt{s_t + \epsilon}}\cdot g_t gt=wl(yt,f(xt,w)),st=st1+gt2,wt=wt1st+ϵ ηgt
  1. RMSProp算法
  • Adagrad算法中 s t s_t st是梯度平方的累加,会持续增长,几乎是线性递增,迭代后期学习率下降很快,加爵该问题按照动量的方式,公式如下:
  • s t ← γ s t − 1 + ( 1 − γ ) g t 2 , x t ← x t − 1 − η s t + ϵ ⊙ g t s_t\leftarrow \gamma s_{t - 1} + (1 - \gamma)g_t^2,x_t\leftarrow x_{t - 1} - \frac{\eta}{\sqrt{s_t + \epsilon}}\odot g_t stγst1+(1γ)gt2xtxt1st+ϵ ηgt
  1. Adadelta算法
  • 是AdaGrad的另一种变体,使用了两个状态变量, s t s_t st用于存储梯度二阶导数的泄露平均值, Δ x t \Delta x_t Δxt用于存储模型本身中参数变化二阶导数的泄露平均值,也就是调整之后梯度的平方泄露平方值,公式如下:
  • s t = ρ s t − 1 + ( 1 − ρ ) g t 2 s_t = \rho s_{t - 1} + (1 - \rho)g_t^2 st=ρst1+(1ρ)gt2,调整之后的梯度为 g t ′ = Δ x t − 1 + ϵ s t + ϵ ⊙ g t g'_t = \frac{\sqrt{\Delta x_{t - 1}+\epsilon}}{\sqrt{s_t + \epsilon}}\odot g_t gt=st+ϵ Δxt1+ϵ gt Δ x t = ρ Δ x t − 1 + ( 1 − ρ ) g t ′ 2 \Delta x_t = \rho \Delta x_{t - 1} + (1 - \rho)g_t'^{2} Δxt=ρΔxt1+(1ρ)gt2,然后使用缩放之后的梯度进行更新 x t = x t − 1 − g t ′ x_t = x_{t - 1}-g'_t xt=xt1gt
  • 在某种程度上,Adadelta没有学习率参数。相反,它使用参数本身的变化率来调整学习率
  1. Adam算法
  • 公式如下:
  • 动量和二次矩的指数加权移动平均值计算 v t ← β 1 v t − 1 + ( 1 − β 1 ) g t , s t ← β 2 s t − 1 + ( 1 − β 2 ) g t 2 v_t\leftarrow \beta_1 v_{t - 1} + (1 - \beta_1)g_t,s_t\leftarrow \beta_2 s_{t - 1} + (1 - \beta_2)g_t^2 vtβ1vt1+(1β1)gt,stβ2st1+(1β2)gt2,因为如果初始化 v 0 = s 0 = 0 v_0=s_0=0 v0=s0=0会获得一个相当大的初始偏差,所以通过使用 ∑ i = 0 t β i = 1 − β t 1 − β \sum_{i = 0}^t\beta^i = \frac{1 - \beta^t}{1 - \beta} i=0tβi=1β1βt来解决,相应的标准化状态变量 v ^ t = v t 1 − β 1 t , s ^ t = s t 1 − β 2 t \widehat{v}_t = \frac{v_t}{1 - \beta_1^t},\widehat{s}_t = \frac{s_t}{1 - \beta_2^t} v t=1β1tvt,s t=1β2tst,有了这两个状态之后,对梯度进行重新缩放 g t ′ = η v ^ t s ^ t + ϵ g'_t = \frac{\eta \widehat{v}_t}{\sqrt{\widehat{s}_t} + \epsilon} gt=s t +ϵηv t,最后对变量进行更新 x t ← x t − 1 − g t ′ x_t\leftarrow x_{t - 1} - g'_t xtxt1gt

ref
https://zh.d2l.ai/chapter_optimization/adam.html

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

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

相关文章

400元已到账,成交从认真开始

昨天发了一个值班的需求&#xff0c;收到了很多好友的响应&#xff0c;这里非常感谢关注创业程序员卡酷的老朋友、新朋友。今天分享一下&#xff1a;拓展、合作、成交 现在不管是IT行业还是其他行业&#xff0c;大环境可谓一片惨淡&#xff0c;35乃至30找不到工作的失业人员一抓…

深度论证-高速走线控制100欧姆阻抗一定是最好的选择吗?

高速先生成员--黄刚 对于高速差分信号到底需要控制多少欧姆的阻抗&#xff0c;高速先生相信大部分工程师首先都会看下例如信号的协议文档或者芯片的文档&#xff0c;看看里面有没有推荐的控制阻抗值。例如像PCIE信号&#xff0c;在4.0之后的阻抗会明确要求按照85欧姆来控制&…

4.Jmeter阶梯加压Stepping Thread Group

1. 先去Jmeter下载地址下载PluginsManager&#xff0c;放置在Jmeter的lib/ext 目录下 &#xff0c;重启Jmeter 2. 在插件管理器查找并安装jpgc - Standard Set,重启Jmeter 3.右键测试计划->添加->Threads(Users)->jpgc - Stepping Thread Group 然后设置阶梯加压参数…

SAP_ABAP_快速了解_指针

首先abap里有下面几种数据类型 变量&#xff0c;结构和内表 来看下面的比喻&#xff1a; 变量 房间 结构 平房&#xff08;里面有很多房间&#xff1b;是一户人家&#xff09; 内表 楼房&#xff08;有很多层&#xff0c;每层有很多户人家&#xff0c;每户人家又有很多…

贷款没有逾期,征信没问题,为什么大数据信用评分低呢?

大数据信用在金融贷前风控越来越重要&#xff0c;这让不少人开始关心自己的大数据信用了&#xff0c;其中就有不少人有疑问&#xff0c;那就是自己网贷没有逾期&#xff0c;征信记录也还可以&#xff0c;为什么大数据信用评分低呢?这个问题也是不少人都想知道的&#xff0c;小…

鸿蒙开发之跨设备文件访问

分布式文件系统为应用提供了跨设备文件访问的能力&#xff0c;开发者在多个设备安装同一应用时&#xff0c;通过基础文件接口&#xff0c;可跨设备读写其他设备该应用分布式文件路径&#xff08;/data/storage/el2/distributedfiles/&#xff09;下的文件。 例如&#xff1a;多…

Codeforces Round 925 (Div. 3) D. Divisible Pairs(数学)

波利卡普有两个最喜欢的整数 x 和 y (它们可以相等)&#xff0c;他找到了一个长度为 n 的数组 a 。 波利卡普认为一对索引 ⟨ i , j ⟩ ( 1 ≤ i < j ≤ n ) ⟨i,j⟩ ( 1≤i<j≤n ) ⟨i,j⟩(1≤i<j≤n)是优美的&#xff0c;如果&#xff1a; a i a j a_ia_j ai​aj…

信息系统安全与对抗-计算机木马、Web网站攻击技术、网络防火墙(期末复习简答题)

目录 七、计算机木马 1、计算机木马与计算机病毒之间存在的相同点和不同点 3、黑客利用远程控制型木马进行网络入侵的六个步骤 十一、Web 网站攻击技术 2、SQL 注入攻击漏洞的探测方法 3、防范 SQL 注入攻击的措施 5、反射型 XSS、存储型 XSS、DOM 型 XSS 的区别 6、判断…

Arthas使用使用方法

一、Arthas简介 可以用来快速定位java程序使用中的问题&#xff0c;查看程序运行过程中的各种信息。 相对于之前jvm命令方式的定位方式&#xff0c;主要有以下特性: 1) 对源程序无侵入性&#xff0c;不需要重启或修改源码 2) 交互式命令行操作方式&#xff0c;方便使用 3)…

软件测试之【软件测试初级工程师技能点全解】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;初级测试工程师技能点&#x1f449;测试理论基…

Shell脚本之数组

数组 数组中可以存放多个值&#xff08;bash 只支持一维数组&#xff09;数组元素的索引从0开始数组在括号内指定数组的值&#xff0c;每个值仅能用空格分割 其中&#xff1a;30为索引0 20为索引1 10为索引2 60为索引3 以此类推&#xff0c;不过注意索引是从0开始的 如果数组中…

vue布局设置——使用 el-drawer 打造个性化 Admin 后台布局设置

在前端开发中&#xff0c;我们常常需要为 admin 后台构建灵活且个性化的布局设置。今天&#xff0c;我要分享的是如何利用 el-drawer 来实现这样一个有趣的功能。 首先&#xff0c;我们来看一下主要的设置参数&#xff1a; 1. theme: 用于定义主题&#xff0c;可以根据需求切换…

【已解决】attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

ctfshow web入门 phpCVE web312web314

web311 web312 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143&#xff0c;在php中调用的是imap_open函数来实现功能…

学习java

在实验室看见这本书&#xff0c;无聊看了下&#xff0c;写出了第一个java代码 成功下载了eclipse并且汉化。 写了自己的第一个java程序&#xff1a; package ttttt;public class ttttt {public static void main(String[] args) {System.out.println("hello world")…

Unreal自定义字体中,缺少字怎么办,有没有字表?

关键词&#xff1a;自定义字体&#xff0c;字表&#xff0c;编码&#xff0c;UTF-8,4E00-9FFF,4E00-9FA5,字符查重&#xff0c;字符唯一&#xff0c; 问题&#xff1a; 游戏中经常要自定义字体&#xff0c; 自定义字体往往要做离线字库 offline fonts 离线字库 离不开字符表。…

6 使用 AspectJ 的 AOP 配置管理事务

1. 概述 AspectJ 主要是使用 XML 配置顾问方式自动为每个符合切入点表达式的类生成事务代理。创建测试操作步骤如下&#xff1a; 2. 创建测试项目 创建一个名为 aspectj-aop 项目&#xff0c;pom.xml 文件如下&#xff1a; <?xml version"1.0" encoding"…

调味品企业的销量增长秘诀:五丰黎红引领大厨革新之路

随着时代的发展和消费升级&#xff0c;调味品行业的竞争愈发激烈&#xff0c;在此大环境之下&#xff0c;企业需要不断寻找创新的突破点来实现销量的增长。众所周知&#xff0c;调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a…

[JAVASE] 类和对象(二)(续篇)

目录 一. static 修饰成员方法 1.1 基本使用 1.2 注意事项 (重点) 1.2.1 1.2.1 二. 代码块 2.1 代码块的分类及使用 2.1.1 静态代码块 2.1.2 实例代码块 2.1.3 普通代码块 2.2 代码块的执行顺序 三. 对象的打印 3.1 打印对象的引用 3.2 重写 toString 方法 四. 总结 一…

idea上如何新建git分支

当前项目在dev分支&#xff0c;如果想在新分支上开发代码&#xff0c;如何新建一个分支呢&#xff1f;5秒搞定~ 1、工具类选择git&#xff0c;点击New Branch 或者右下角点击git分支&#xff0c;再点击New Branch 2、在弹出的Create New Branch弹窗中&#xff0c;输入你的新分支…