SGD随机梯度下降_随机梯度法

SGD随机梯度下降_随机梯度法BGDvsSGDBGDvsSGD名词解释功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入BGDvsSGD…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

名词解释

名词 定义
original-loss 整个训练集上的loss
minibatch-loss 在一个mini batch上的loss
BGD 最原始的梯度下降算法,为了计算original-loss上的梯度,需要使用训练集全部数据
SGD (近似)计算original-loss梯度时,只使用一个mini batch,相当于用minibatch-loss上的梯度去近似original-loss梯度
奇点(只是为了方便说明而起的名字) local minimal和saddle point

SGD vs BGD

下面将通过BGD与SGD的对比,来对SGD进行深入理解。

效率方面

深度学习使用的训练集一般都比较大(几十万~几十亿)。而BGD算法,每走一步(更新模型参数),为了计算original-loss上的梯度,就需要遍历整个数据集,这显然是不现实的。而SGD算法,每次随机选择一个mini-batch去计算梯度,在minibatch-loss上的梯度显然是original-loss上的梯度的无偏估计,因此利用minibatch-loss上的梯度可以近似original-loss上的梯度,并且每走一步只需要遍历一个minibatch(一~几百)的数据。

优化方面

SGD优势

(a)BGD容易陷入original-loss的奇点,而SGD不容易陷入;
(b)SGD也不会陷入minibatch-loss的奇点。
解释:
(a)original-loss存在很多奇点,而BGD每次下降的方向就是original-loss的负梯度,因此BGD很容易陷入某个奇点,而无法达到global minimal(或者比较好的local minimal)。SGD一定程度上可以避免这个情况,这可以从2个角度来理解。
从引入randomness的角度来看,SGD中计算的梯度是对original-loss梯度的近似,相当于在original-loss梯度的基础上加了randomness,因此即使当前走到了original-loss的奇点,SGD计算的梯度因为引入了randomness,所以也不接近0,比较容易跳出奇点。
另一个角度,SGD计算的不是original-loss的梯度,而是minibatch-loss的梯度。显然original-loss和minibatch-loss的形状不同,奇点分布也不同,如果当前这个点在original-loss上是奇点,但这个点在minibatch-loss中并不是奇点,此时使用minibatch-loss的负梯度作为下降方向,自然就不会陷入这个点了。
(b)主要是因为每次迭代,都会使用不同的mini batch,而不同的minibatch-loss的形状不同。就算此时陷入了当前minibatch-loss的奇点,那么下一次迭代,这个点也不一定就是下一个minibatch-loss的奇点,如果不是的话,自然就跳出来了。

SGD劣势

SGD走的路径比较曲折(震荡),尤其是batch比较小的情况下。
解释:
为了方便说明,假设loss函数是凸函数(没有奇点,local minimal就是global minimal)。即使loss函数不是凸函数也是相同的道理。 需要记住,不管使用什么优化方法,待优化的目标都是original-loss,分析问题都要从这一点出发。
BGD每次走的方向是original-loss的负梯度方向,是original-loss在当前点上的最速下降方向。而SGD每次走的方向是minibatch-loss的负梯度方向(或者理解成original-loss的负梯度+randomness),显然这个方向和original-loss的负梯度方向不同,也就不是original-loss在当前位置的最快下降方向(如果这个mini batch的大部分数据点的target是错误的,甚至有可能是original-loss在当前位置的上升方向),所以使用SGD算法从当前点走到global minimal的路径会很曲折(震荡)。
为了减少震荡,一个方法是增大batch size,原因是minibatch-loss的梯度是对original-loss梯度的无偏估计(bias为0),并且variance随着batch size的变大而减小。当batch size足够大(比如接近训练集),此时SGD就退化成了BGD,就会带来上面说的那些问题。因此batch size需要选择合适大小,一般是几十到几百。
减少震荡的方法还包括动量、Rmsprop等,详情参考另一篇博客《Momentum Rmsprop Adam》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195201.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月21日 下午10:01
下一篇 2025年10月21日 下午10:43


相关推荐

  • 我不知道你是在一个多线程out该–【ITOO】

    我不知道你是在一个多线程out该–【ITOO】

    2022年1月13日
    49
  • Android AsyncTask 源码解析

    Android AsyncTask 源码解析转载请标明出处 http blog csdn net lmj article details 本文出自 张鸿洋的博客 1 概述相信大家对 AsyncTask 都不陌生 对于执行耗时任务 然后更新 UI 是一把利器 当然也是替代 Thread Handler 的一种方式 如果你对 Handler 机制还不了解 请看 Android 异步消息处理机制让你深入理解 Lo

    2026年3月19日
    2
  • MySQL通过 case when 批量更新数据

    MySQL通过 case when 批量更新数据MySQL通过 case when 批量更新数据

    2022年4月24日
    111
  • goeasy的简单应用

    goeasy的简单应用首先你需要一个 goeasy 账号 账号可以在在 goeasy 官网上注册官网地址 goeasy 官网每个新用户都有一年的免费试用时间 够我们学习试用的了 1 页面 js 环境的引入在页面我们需要引用动态的 goeasy js scriptsrc http s 填写你的 CDNHost goeasy js gt 注意 这 scriptsrc http s

    2026年3月16日
    1
  • dnSpy_dnspy官网

    dnSpy_dnspy官网https://github.com/0xd4d/dnSpy下载压缩包之后,解压,发现目录里面有3个exe文件需要用管理员运行dnSpy.exe,然后打开exe文件,设置好断点,然后start使

    2022年8月3日
    9
  • 算法导论答案汇总

    算法导论答案汇总本文汇总网上的算法导论答案 不断更新 希望对大家有所帮助 第 22 章 22 1 5 平方图 22 1 6 通用的汇 22 2 6 好选手和坏选手问题 nbsp 问题说明 nbsp 解决方案 22 2 7 树的直径 nbsp nbsp nbsp 代码和证明 nbsp nbsp 网易面试题 22 4 2s 到 t 的通路数目 22 4 3 无向图是否包含回路

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号