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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mac 电脑android环境变量设置,mac上Android环境变量配置[通俗易懂]

    mac 电脑android环境变量设置,mac上Android环境变量配置[通俗易懂]1.AndroidSDK路径查看(1)AndroidStudio:菜单栏AndroidStudio>Preferences>Appearences&Behavior>SystemSettins>AndroidSDKtab中的SDKLocation。(2)Eclipse:菜单栏Eclipse>Preferences>Andr…

    2022年6月25日
    20
  • 给电脑装linux双系统(新手如何重装win10系统)

    原本在win10之外装了一个Ubuntu,由于Ubuntu的安装十分方便,它使用的grub2会自动配置,所以安装非常顺利,制作了启动盘之后直接从BOOT界面启动就行了,傻瓜式,它会自动检测是否有安装其他系统,可自动选择硬盘连续空间安装(也可手动选择)。Ubuntu用的时间久了感觉非常棒!可惜windows也有其不可替代的地方(比如游戏,虽然我也不怎么玩)。后来想玩一下kali-Linux,这

    2022年4月12日
    52
  • python怎么保留小数「建议收藏」

    python怎么保留小数「建议收藏」python如何保留小数点几位第一种round()函数a=1.23456print(round(a,2))print(round(a,3))1.231.234第二种format()函数print(format(1.23456,’.2%f’))1.23第三种’.2%f’%fq=1.234print(‘.2%f’%q)1.23

    2022年8月11日
    5
  • nginx中proxy_pass的使用(alias和root使用)

    nginx中proxy_pass的使用(alias和root使用)

    2021年8月3日
    266
  • numpy数据类型dtype转换

    numpy数据类型dtype转换这篇文章我们玩玩numpy的数值数据类型转换 导入numpy>>>importnumpyasnp 一、随便玩玩生成一个浮点数组>>>a=np.random.random(4)看看信息>>>aarray([0.0945377,0.52199916,0.62490646,…

    2022年5月4日
    34
  • LAMP配置相关

    LAMP配置相关为Ubuntu搭建LAMP(Apache+PHP+MYSQL)开发环境    由于LAMP大部分操作与/var/www目录相关,为了方便,修改该目录的权限为普通用户可访问     # chmod  777 /var/www配置phpMyAdmin http://blog.csdn.net/doupei2006/article/details/8005061

    2022年5月5日
    46

发表回复

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

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