详解随机梯度下降法(Stochastic Gradient Descent,SGD)

2023-10-27

深度学习最常用的优化方法就是随机梯度下降法,但是随机梯度下降法在某些情况下会失效,这是为什么呢?带着这个问题我们接着往下看。
一个经典的例子就是假设你现在在山上,为了以最快的速度下山,且视线良好,你可以看清自己的位置以及所处位置的坡度,那么沿着坡向下走,最终你会走到山底。但是如果你被蒙上双眼,那么你则只能凭借脚踩石头的感觉判断当前位置的坡度,精确性就大大下降,有时候你认为的坡,实际上可能并不是坡,走一段时间后发现没有下山,或者曲曲折折走了好多路才能下山。
类似的,批量梯度下降法(Batch Gradient Descent,BGD)就好比正常下山,而随机梯度下降法就好比蒙着眼睛下山,数学上的表达式为。
批量梯度下降法在全部训练集上计算准确的梯度,公式为
∑ i = 1 n ∇ θ f ( θ ; x i , y i ) + ∇ θ ϕ ( θ ) \sum_{i=1}^{n} \nabla_{\theta} f\left(\theta ; x_{i}, y_{i}\right)+\nabla_{\theta} \phi(\theta) i=1nθf(θ;xi,yi)+θϕ(θ)
其中 f ( θ ; x i , y i ) f\left(\theta ; x_{i}, y_{i}\right) f(θ;xi,yi)表示在每个样本的损失函数, ϕ ( θ ) \phi(\theta) ϕ(θ)为正则项。
随机梯度下降法则采样单个样本来估计当前的梯度,即
∇ θ f ( θ ; x i , y i ) + ∇ θ ϕ ( θ ) \nabla_{\theta} f\left(\theta ; x_{i}, y_{i}\right)+\nabla_{\theta} \phi(\theta) θf(θ;xi,yi)+θϕ(θ)
可以看出,为了获取准确的梯度,批量梯度下降法的每一 步都把整个训练集载入进来进行计算,时间花费和内存开销都非常大,无法应用于大数据集、大模型的场景。相反,随机梯度下降法则放弃了对梯度准确性的追求,每步仅仅随机采样一个(或少量)样本来估计当前梯度,计算速度快,内存开销小。但由于每步接受的信息量有限,随机梯度下降法对梯度的估计常常出现偏差,造成目标函数曲线收敛得很不稳定,伴有剧烈波动,有时甚至出现不收敛的情况。下图展示了两种方法在优化过程中的参数轨迹,可以看出,批量梯度下降法稳定地逼近最低点,而随机梯度下降法的参数轨迹曲曲折折简直是“黄河十八弯"。
在这里插入图片描述
(a)批量梯度下降法
在这里插入图片描述
(b)随机梯度下降法
进步地,有人会说深度学习中的优化问基本身就很难,有太多局部最优点的陷阱,没错,这些陷阱对于随机梯度下降法和批量梯度下降都是普遍存在的。但对随机梯度下降法来说,可怕的不是局部最优点,而是山谷和鞍点两类地形。山谷顾名思义就是狭长的山间小道,左右两边是峭壁;鞍点的形状像是一个马鞍,一个方向上两头翘, 另一个方向上两头垂,而中心区域是一片近乎水平的平地。为什么随机梯度下降法最害怕遇上这两类地形呢?在山谷中,准确的梯度方向是沿山道向下,稍有偏离就会撞向山壁,而粗糙的梯度估计使得它在两山壁间来回反弹震荡,不能沿山道方向迅速下降,导致收敛不稳定和收敛速度慢在鞍点处,随机梯度下降法会走入一片平坦之地(此时离最低点还很远,故也称plateau)。想象一下蒙着双眼只凭借脚底感觉坡度,如果坡度很明显,那么基本能估计出下山的大致方向;如果坡度不明显,则很可能走错方向。同样,在梯度近乎为零的区域,随机梯度下降法无法准确察觉出梯度的微小变化,结果就停滞下来。
在这里插入图片描述
上图示例为鞍点
解决方案:动量(Momentum)方法、AdaGrad方法、Adam方法
分析:随机梯度下降本质上是采用迭代方式更新参数,每次迭代在当前位置的基础上,沿着某一方向迈一小步抵达下一位置,然后再下一位置重复上述步骤。随机梯度下降法的更新公式表示为: θ t + 1 = θ t − η g t \theta_{t+1}=\theta_{t}-\eta g_{t} θt+1=θtηgt,其中,当前估计的负梯度 − g t -g_{t} gt表示步子的方向,学习速率 η \eta η,控制步幅,改造的随机梯度下降法仍然基于这个更新公式。
动量(Momentum)方法
为了解决随机梯度下降法山谷震荡和鞍点停滞的问题,我们做一个简单的思维实验。想象一下纸团在山谷和鞍点处的运动轨迹,在山谷中纸团受重力作用沿山道滚下,两边是不规则的山壁,纸团不可避免地撞在山壁上,由于质量小受山壁弹力的干扰大,从一侧山壁反弹回来撞向另一侧山壁,结果来回震荡地滚下;如果当纸团来到鞍点的一片平坦之地时,还是由于质属小,速度很快减为零。纸团的情况和随机梯度下降法遇到的问题面直如出一辙。直观地,如果换成一个铁球,当沿着山谷滚下时,不容易受到途中旁力的干扰,轨迹会更稳更直;当来到鞍点中心处,在惯性作用下继续前行,从而有机会冲出这片平坦的陷阱,因此,有了动量方法,模型参数的迭代公式为:
v t = γ v t − 1 + η g t v_{t}=\gamma v_{t-1}+\eta g_{t} vt=γvt1+ηgt
θ t + 1 = θ t − v t {\theta_{t+1}={\theta}_{t}-{v_{t}}} θt+1=θtvt
具体来说,前进步伐 v t v_{t} vt,由两部分组成。一是学习速率 η {\eta} η乘以当前估计的梯度 g t {g_{t}} gt;二是带衰减的前一次步伐 v t − 1 {v_{t-1}} vt1这里,惯性就体现在对前一次步伐信息的重利用上。类比中学物理知识,当前梯度就好比当前时刻受力产生的加速度,前一次步伐好比前一-时刻的速度,当前步伐好比当前时刻的速度。为了计算当前时刻的速度,应当考虑前一时刻速度和当前加速度共同作用 的结果,因此 v t {v_{t}} vt直接依赖于 v t − 1 {v_{t -1}} vt1 g t {g_{t}} gt,而不仅仅是 g t {g_{t}} gt。另外,衰减系数 γ {\gamma} γ扮演了阻力的作用。
中学物理还告诉我们,刻画惯性的物理量是动量,这也是算法名字的由来。沿山谷滚下的铁球,会受到沿坡道向下的力和与左右山壁碰撞的弹力。向下的力稳定不变,产生的动量不断累积,速度越来越快;左右的弹力总是在不停切换,动量累积的结果是相互抵消,自然减弱了球的来回震荡。因此,与随机梯度下降法相比,动量方法的收敛速度更快,收敛曲线也更稳定,如下图示
在这里插入图片描述
AdaGrad 方法
惯性的获得是基于历史信息的,那么,除了从过去的步伐中获得一股子向前冲的劲儿,还能获得什么呢?我们还期待获得对周围环境的感知,即使蒙上双眼,依靠前几次迈步的感觉,也应该能判断出一些信息,比如这个方向总是坑坑洼洼的,那个方向可能很平坦。随机梯度下降法对环境的感知是指在参数空间中,根据不同参数的一些经验性判断,自适应地确定参数的学习速率,不同参数的更新步幅是不同的。例如,在文本处理中训练词嵌入模型的参数时,有的词或词组频繁出现,有的词或词组则极少出现。数据的稀疏性导致相应参数的梯度的稀疏性,不频繁出现的词或词组的参数的梯度在大多数情况下为零,从而这些参数被更新的频率很低。在应用中,我们希望更新频率低的参数可以拥有较大的更新步幅,而更新频率高的参数的步幅可以减小。AdaGrad方法采用“历史梯度平方和”来衡量不同参数的梯度的稀疏性,取值越小表明越稀疏,具体的更新公式表示为

θ t + 1 , i = θ t , i − η ∑ k = 0 t g k , i 2 + ϵ g t , i \theta_{t+1, i}=\theta_{t, i}-\frac{\eta}{\sqrt{\sum_{k=0}^{t} g_{k, i}^{2}+\epsilon}} g_{t, i} θt+1,i=θt,ik=0tgk,i2+ϵ ηgt,i

其中, θ t + 1 {\theta_{t+1}} θt+1表示(t+1)时刻的参数向量 θ t + 1 {\theta_{t+1}} θt+1的第 i {i} i个参数, g k , i {g_{k,i}} gk,i表示第 k {k} k时刻的梯度向量 g k {g_{k}} gk的第 i {i} i个维度(方向)。另外,分母中求和的形式实现了退火过程,这是很多优化技术中常见的策略,意味着随着时间的推移,学习速率 η ∑ k = 0 t g k , i 2 + ϵ \frac{\eta}{\sqrt{\sum_{k=0}^{t} g_{k, i}^{2}+\epsilon}} k=0tgk,i2+ϵ η越来越小。从而保证了算法的最终收敛。

Adam方法
Adam方法将惯性保持和环境感知这两个优点集于一身。 一方面,Adam记录梯度的一阶矩(first moment),即过往梯度与当前梯度的平均,这体现了惯性保持;另一方面,Adam还记录梯度的二阶矩( sccond moment),即过往梯度平方与当前梯度平方的平均,这类似AdaGrad方法,体现了环境感知能力,为不同参数产生自适应的学习速率。一阶矩和二阶矩采用类似于滑动窗口内求平均的思想进行融合,即当前梯度和近一段时间内梯度的平均值,时间久远的梯度对当前平均值的贡献呈指数衰减。具体来说,一阶矩和二阶矩采用指数衰退平均( exponential decay average)技术,计算公式为
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_{t}=\beta_{1} m_{t-1}+\left(1-\beta_{1}\right) g_{t} mt=β1mt1+(1β1)gt

v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_{t}=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right) g_{t}^{2} vt=β2vt1+(1β2)gt2,其中 β 1 {\beta_{1}} β1 β 2 {\beta_{2}} β2为衰减系数, m t {m_{t}} mt是一阶矩, v t {v_{t}} vt是二阶矩。
如何理解一-阶矩和二阶矩呢?一阶矩相当于估计 E [ g t ] \mathbb{E}\left[g_{t}\right] E[gt]:由于当下梯度g,是随机采样得到的估计结果,因此更关注它在在统计意义上的期望;二阶矩相当于估计 E [ g t ] \mathbb{E}\left[g_{t}\right] E[gt],这点与AdaGrad方法不同,不是从开始到现在的加和,而是它的期望。它们的物理意义是,当 ∥ m t ∥ \left\|m_{t}\right\| mt大且 v t {v_{t}} vt大时,梯度大且稳定,这表明遇到一个明显的大坡,前进方向明确;当 ∥ m t ∥ \left\|m_{t}\right\| mt趋于零且 v t {v_{t}} vt大时,梯度不稳定,表明可能遇到一个峡谷,容易引起反弹震荡;当 ∥ m t ∥ \left\|m_{t}\right\| mt大且 v t {v_{t}} vt趋于零时,这种情况不可能出现;当 ∥ m t ∥ \left\|m_{t}\right\| mt趋于零且 v t {v_{t}} vt趋于零时,梯度趋于零,可能到达局部最低点,也可能走到一片坡度极缓的平地,此时要避免陷入平原( plateau)。另外,Adam方法还考虑了 m t {m_{t}} mt v t {v_{t}} vt在零初始值情况下的偏置矫正。具体来说,Adam的更新公式为

θ t + 1 = θ t − η ⋅ m ^ t v ^ t + ϵ \theta_{t+1}=\theta_{t}-\frac{\eta \cdot \hat{m}_{t}}{\sqrt{\hat{v}_{t}+\epsilon}} θt+1=θtv^t+ϵ ηm^t其中, m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_{t}=\frac{m_{t}}{1-\beta_{1}^{t}}, \hat{v}_{t}=\frac{v_{t}}{1-\beta_{2}^{t}} m^t=1β1tmt,v^t=1β2tvt

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

详解随机梯度下降法(Stochastic Gradient Descent,SGD) 的相关文章

  • OPENCV缺陷检测小例子

    前阵子在某公众号看到halcon做缺陷检测的例子 由于不会使用halcon 其附带的 dev代码也看不懂 于是自己写了opencv代码来实现 原图如下 其目的是要检测红框中的缺陷 代码如下

随机推荐

  • matlab 计算点云协方差矩阵

    目录 一 概述 1 算法概述 2 主要函数 二 代码示例 三 结果展示 四 参数解析 输入参数 输出参数 五 参考链接 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 概述
  • C++不定参数函数

    类似这样的函数定义 printf char fmt 示例 自定义一个可变函数 Func char s char fmt 特点是函数必须有一个char fmt作为变量 它一般用在可变参数的前一个参数 根据这个变量计算出后续参数的地址或值 它们
  • php中table的最小宽度,table宽度

    题目虽然是说table的宽度 但其实最让人抓狂的是单元格td的宽度 平时开发中也经常会遇到这方面的问题 所以我找资料学习table的宽度的算法 table layout table layout定义了表格布局算法 值为auto或fixed
  • pycharm同步代码到远程服务器

    首先有一个python的项目 可以新建一个 Tools gt Development gt Configurations 新建一个SFTM连接 在connection页面配置服务器的用户名与密码 Root path这里配置一个根目录 注意R
  • IOException parsing XML document from class path resource [spring-mvc.xml]

    如果你写的都没问题 那一定是静态资源导入问题 可以试试下面的这个
  • springboot中@Async的使用

    async注解的使用 springboot中的启动类中需要添加注解 EnableAsync来开启异步调用 在需要异步执行的方法上添加 Async taskExecutor 注解进行标注 启动类 EnableScheduling Enable
  • CUDA C/C++ 中如何优化数据传输

    设备内存和 GPU 之间的峰值带宽 例如 在 NVIDIA Tesla C2050 上为 144 GB s 远高于主机内存和设备内存之间的峰值带宽 在 PCIe x16 Gen2 上为 8 GB s 这种差异意味着您在主机和 GPU 设备之
  • c语言练习题55:IP 地址⽆效化

    IP 地址 效化 题 描述 给你 个有效的 IPv4 地址 address 返回这个 IP 地址的 效化版本 所谓 效化 IP 地址 其实就是 代替了每个 例 1 输 address 1 1 1 1 输出 1 1 1 1 例 2 输 add
  • Oracle:number类型的使用

    一 number m n 创建测试表 create table t1 a number b number 9 c number 9 2 d number 9 1 e number 6 f number 7 2 g number 7 2 插入
  • 深入理解数据结构——堆栈应用(括号匹配)

    include
  • Feed流系统设计

    Feed流系统简介 Feed 是一种数据格式 用于给订阅的用户提供持续更新的内容 内容大多是基于时间线的方式呈现 从上往下流动 通常称为Feed流 移动互联网时代 国内最具代表性的Feed流类产品包括微信 微博 抖音 它们各具特点 产品 特
  • ChatGLM-6B-PT,P-Tuning

    本仓库实现了对于 ChatGLM 6B 模型基于 P Tuning v2 的微调 P Tuning v2 将需要微调的参数量减少到原来的 0 1 再通过模型量化 Gradient Checkpoint 等方法 最低只需要 7GB 显存即可运
  • 华为ensp模拟器--通过IKE动态协商方式建立IPSec隧道的实验(不对对等体存活进行检测)

    组网需求 如图1所示 在Router1和Router3之间建立一个安全隧道 对PC 1代表的子网 10 1 1 x 与PC2代表的子网 20 1 1 x 之间的数据流进行安全保护 安全协议采用ESP协议 加密算法采用DES 认证算法采用SH
  • 利用linux系统安装caffe_fastrcnn参考链接

    1 2 3 4 5
  • Code Llama系列教程之 微调 CodeLlama 34B 以进行聊天(打造自己的代码AI)

    虽然 Meta 的 Llama2 在 AI 领域引起了广泛关注 但 34b 模型却缺席了相当长一段时间 对于许多人来说 这个 34b 模型是运行本地 LLM 的理想选择 因为它与使用 4 位量化的单个 4090 GPU 兼容 我一直在热切地
  • TCP报文格局详解

    TCP和谈只定义了一种报文格局 建立 拆除连接 传输数据应用同样的报文 TCP报文格局 TCP报文段首部 20个字节 源端口和目标端口 各占2个字节 16比特的端标语加上32比特的IP地址 共同构成相当于传输层办事接见点的地址 即 插口 这
  • (十九)STM32——输入捕获

    目录 学习目标 成果展示 内容 获取 配置 代码 总结 学习目标 本节内容我们要介绍的是输入捕获 其实也和定时器那部分知识是有关系的 所谓输入捕获 通俗一点来讲 其实就是通过检测上升沿和下降沿来计算你的输入持续时间 具体怎么去检测和捕获呢
  • c++实现图的操作(最小生成树和最短路径)

    题目描述 1 图的深度优先搜索演示 要求 图采用邻接表存储结构 编程实现图的创建 图的深度优先搜索递归算法 2 图的广度优先搜索演示 要求 图采用邻接表存储结构 编程实现图的创建 图的深度优先搜索递归算法 3 求带权无向图的最小生成树问题
  • VueRouter4简介

    第十四节 VueRouter4 x简介 基本用法 路由懒加载 打包分析 动态路由 路由嵌套 相关Api 一 简介和基本用法 1 简介 官网地址 https next router vuejs org zh introduction html
  • 详解随机梯度下降法(Stochastic Gradient Descent,SGD)

    深度学习最常用的优化方法就是随机梯度下降法 但是随机梯度下降法在某些情况下会失效 这是为什么呢 带着这个问题我们接着往下看 一个经典的例子就是假设你现在在山上 为了以最快的速度下山 且视线良好 你可以看清自己的位置以及所处位置的坡度 那么沿