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


相关推荐

  • 新的历程-近两个月的工作总结

    新的历程-近两个月的工作总结

    2021年11月15日
    47
  • git commit后_git回退已经push的代码

    git commit后_git回退已经push的代码Git 返回 commit 内容

    2022年4月21日
    71
  • Ubuntu18.04安装Anaconda+PyCharm+VS Code[通俗易懂]

    Ubuntu18.04安装Anaconda+PyCharm+VS Code[通俗易懂]PyCharm安装、桌面快捷方式建立及设置中文输入

    2022年8月28日
    2
  • win10指纹识别用不了_windowshello指纹识别驱动

    win10指纹识别用不了_windowshello指纹识别驱动目前市面上除游戏本以外大多数新出的Windows10笔记本电脑都支持WindowsHello(面容、指纹、虹膜等),但是对于台式机来说,很少会有消费者专门去购置一台支持WindowsHello的主机,同时外置的USB指纹识别器价格也不便宜,所以很多人即便想和对Windows10说声Hello也不行,久而久之,即便用户想和Windows10交流也没办法,最终只能形…

    2022年8月10日
    6
  • HD地址批量生成 java

    HD地址批量生成 java前言:HD钱包全称为是分层确定性(HierarchicalDeterministic)钱包的缩写HDWallets。首次创建HD钱包或者备份钱包时,会产生一个助记词,助记词是一连串的英⽂单词,这一串单词序列就可以创建种子,种子又可以创建所有的私钥。单词顺序也是钱包的备份,可以恢复钱包。而种⼦对应的就是所确定性钱包的随机数。HD钱包的优点在于只需要主公钥,…

    2022年7月8日
    42
  • 软件测试的用例设计方法_测试用例设计

    软件测试的用例设计方法_测试用例设计1、测试用例定义测试用例又叫testcase,是为某个特殊目标而编制的一组测试输入,执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。2、测试用例的特性有效性:测试用例能够被使用,且被不同人员使用测试结果是一致的可复用性:良好的测试用例具有重复使用的功能,如:回归测试易组织性:好的测试用例会分门别类地提供给测试人员参考和使用可评估性:从测试管理的角度,测试用例的通过率和软件缺陷的数目是软件产品质量好坏的测试标准可管理性:从测试管理的角度,测试用例的通过率和软件缺陷的数目

    2022年10月12日
    4

发表回复

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

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