梯度下降算法原理及其计算过程

梯度下降算法原理及其计算过程1 写在前面还记得以前刚开始学习 AI 的时候 遇到了梯度下降算法 一直对很多概念搞不清楚 包括后来很长的一段时间也不是很明白梯度下降的实现原理 看了很多博客文章都是一知半解 总是有很多疑惑不能搞清楚 而且绝大多数的文章都是生涩的数学公式推理 对于像我这样的数学渣渣来说 理解梯度下降的确有难度 所以前段时间又重新回顾了一下梯度下降算法 结合网上不同来源的资料的学习总结 写了这篇博客 希望对同样刚刚接

1、写在前面

还记得以前刚开始学习AI的时候,遇到了梯度下降算法,一直对很多概念搞不清楚,包括后来很长的一段时间也不是很明白梯度下降的实现原理,看了很多博客文章都是一知半解,总是有很多疑惑不能搞清楚,而且绝大多数的文章都是生涩的数学公式推理,对于像我这样的数学渣渣来说,理解梯度下降的确有难度,所以前段时间又重新回顾了一下梯度下降算法,结合网上不同来源的资料的学习总结,写了这篇博客,希望对同样刚刚接触梯度下降算法的朋友有所帮助,当然这里只是为了更好的理解梯度下降算法,所以基本上没有书面用语,也希望看到这篇文章的朋友能够指出我理解错误的地方。

2、什么是梯度

3、梯度下降算法的作用

4、梯度下降的计算过程

第一步:随机初始化 θ θ θ

θ 0 = ( 0 , 0 , 0 ) \boldsymbol\theta^0=(0,0,0) θ0=(0,0,0),则损失函数值: J ( 0 , 0 , 0 ) = 1 2 ( 0 + 0 + 0 − 10 ) 2 = 50 J(0,0,0)=\dfrac 12(0+0+0-10)^2=50 J(0,0,0)=21(0+0+010)2=50
梯度: Δ 0 = < 0 + 0 + 0 − 10 , ( 0 + 0 + 0 − 10 ) ∗ 2 , ( 0 + 0 + 0 − 10 ) ∗ 2 > = < − 10 , − 20 , − 20 > \Delta^0=<0+0+0-10,(0+0+0-10)*2,(0+0+0-10)*2>=<-10,-20,-20> Δ0=<0+0+010,(0+0+010)2,(0+0+010)2>=<10,20,20>

第二步:进行梯度下降

设置步长 α = 0.2 \alpha=0.2 α=0.2,当然了实际当中不可能取这么大的值。
θ 0 = ( 0 , 0 , 0 ) , Δ 0 = < − 10 , − 20 , − 20 > \theta^0=(0,0,0),\Delta^0=<-10,-20,-20> θ0=(0,0,0),Δ0=<10,20,20>
J ( θ 0 ) = 1 2 ( 0 + 0 + 0 − 10 ) 2 = 50 J(\theta^0)=\dfrac 12(0+0+0-10)^2=50 J(θ0=21(0+0+010)2=50
θ 1 = θ 0 − α ∗ Δ 0 = ( 0 , 0 , 0 ) − 0.2 ∗ ( − 10 , − 20 , − 20 ) = ( 2 , 4 , 4 ) , Δ 1 = < 8 , 16 , 16 > \theta^1=\theta^0-\alpha*\Delta^0=(0,0,0)-0.2*(-10,-20,-20)=(2,4,4),\Delta^1=<8,16,16> θ1=θ0αΔ0=(0,0,0)0.2(10,20,20)=(2,4,4),Δ1=<8,16,16>
J ( θ 1 ) = 1 2 ( 2 + 8 + 8 − 10 ) 2 = 32 J(\theta^1)=\dfrac 12(2+8+8-10)^2=32 J(θ1)=21(2+8+810)2=32
θ 2 = θ 1 − α ∗ Δ 1 = ( 1 , 2 , 2 ) − 0.2 ∗ ( 8 , 16 , 16 ) = ( − 0.6 , − 1.2 , − 1.2 ) , Δ 2 = < 8.8 , 17.6 , 17.6 > \theta^2=\theta^1-\alpha*\Delta^1=(1,2,2)-0.2*(8,16,16)=(-0.6,-1.2,-1.2),\Delta^2=<8.8,17.6,17.6> θ2=θ1αΔ1=(1,2,2)0.2(8,16,16)=(0.6,1.2,1.2),Δ2=<8.8,17.6,17.6>
J ( θ 2 ) = 1 2 ( − 0.6 − 2.4 − 2.4 − 10 ) 2 = 38.72 J(\theta^2)=\dfrac 12(-0.6-2.4-2.4-10)^2=38.72 J(θ2)=21(0.62.42.410)2=38.72
到了这一步,我们发现损失值变大了,说明我们的已经过了极小值点,所以我们把 α \alpha α值设置小一点。令 α \alpha α=0.01。






第三步:再次进行梯度下降

θ 0 = ( 0 , 0 , 0 ) , Δ 0 = < − 10 , − 20 , − 20 > \theta^0=(0,0,0),\Delta^0=<-10,-20,-20> θ0=(0,0,0),Δ0=<10,20,20>
J ( θ 0 ) = 1 2 ( 0 + 0 + 0 − 10 ) 2 = 50 J(\theta^0)=\dfrac 12(0+0+0-10)^2=50 J(θ0=21(0+0+010)2=50
θ 1 = θ 0 − α ∗ Δ 0 = ( 0 , 0 , 0 ) − 0.05 ∗ ( − 10 , − 20 , − 20 ) = ( 0.5 , 1 , 1 ) , Δ 1 = < − 5.5 , − 11 , − 11 > \theta^1=\theta^0-\alpha*\Delta^0=(0,0,0)-0.05*(-10,-20,-20)=(0.5,1,1),\Delta^1=<-5.5,-11,-11 > θ1=θ0αΔ0=(0,0,0)0.05(10,20,20)=(0.5,1,1),Δ1=<5.5,11,11>
J ( θ 1 ) = 1 2 ( 0.5 + 2 + 2 − 10 ) 2 = 15.13 J(\theta^1)=\dfrac 12(0.5+2+2-10)^2=15.13 J(θ1)=21(0.5+2+210)2=15.13
θ 2 = θ 1 − α ∗ Δ 1 = ( 0.5 , 1 , 1 ) − 0.05 ∗ ( − 5.5 , − 11 , − 11 ) = ( 0.075 , 1.55 , 1.55 ) , Δ 2 = < − 3.725 , − 7.45 , − 7.45 > \theta^2=\theta^1-\alpha*\Delta^1=(0.5,1,1)-0.05*(-5.5,-11,-11)=(0.075,1.55,1.55),\Delta^2=<-3.725,-7.45,-7.45> θ2=θ1αΔ1=(0.5,1,1)0.05(5.5,11,11)=(0.075,1.55,1.55),Δ2=<3.725,7.45,7.45>
J ( θ 2 ) = 1 2 ( 0.075 + 2 + 2 − 10 ) 2 = 6.94 J(\theta^2)=\dfrac 12(0.075+2+2-10)^2=6.94 J(θ2)=21(0.075+2+210)2=6.94
如此反复迭代下去,那什么时候停止呢?我们可以设置一个超参数 ξ = 0.5 \xi=0.5 ξ=0.5(当然实际中 ξ \xi ξ值很小,例如 1e-5),也就是说当前步骤的梯度值与前一步骤的梯度值的距离小于 ξ \xi ξ的时候,停止计算。例如上面的 Δ 0 = < − 10 , − 20 , − 20 > \Delta^0=<-10,-20,-20> Δ0=<10,20,20> Δ 1 = < − 5.5 , − 11 , − 11 > \Delta^1=<-5.5,-11,-11 > Δ1=<5.5,11,11> ∣ Δ 0 − Δ 1 ∣ = < 4.5 , 9 , 9 > |\Delta^0-\Delta^1|=<4.5,9,9> Δ0Δ1=<4.5,9,9>,所以要继续进行迭代,知道梯度值都小于 ξ \xi ξ时停止迭代。





总结(更新)

通过上述的计算过程,我们可以发现,越到后面,下降的就越慢,由于上述计算过程只是我举的例子,所以可能只需要迭代几次就可以到达停止条件,但是在实际当中,梯度下降需要迭代很多次,才能够到达损失函数的极小值点,当然这是基于一条数据进行梯度下降的,这种方式就叫随机梯度下降(SGD),如果我们用所有数据,就叫批量梯度下降(BGD),如果我们取小部分数据,就叫小批量梯度下降(MBGD)。一般来说在机器学习当中优先考虑SGD,在某些情况下(全局存在多个相对最优解),SGD有可能跳出某些小的最优解,虽然速度会慢点,当然所说的慢是指在相同数量的样本数据下,跑完所有样本所花费的时间,参数的更新速度肯定是SGD快的,因为每跑一条样本数据都会更新一次。BGD是一定能够得到局部最优解的,而在回归中是一定能够得到全局最优解。由于SGD每次都是一条样本对参数进行更新,从而导致模型对异常样本非常敏感,直接的表现就是参数会异常波动,而如果使用BGD参数更新又非常的慢,所以才有了MBGD,既保证了训练速度,也保证了模型准确率。

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

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

(0)
上一篇 2025年12月11日 上午11:01
下一篇 2025年12月11日 上午11:22


相关推荐

  • 类和结构体的区别

    类和结构体的区别面向对象之结构体和类的区别 1 结构体是一种值类型 而类是引用类型 值类型用于存储数据的值 引用类型用于存储对实际数据的引用 那么结构体就是当成值来使用的 类则通过引用来对实际数据操作 2 结构使用栈存储 StackAllocat 而类使用堆存储 HeapAllocati 栈的空间相对较小 但是存储在栈中的数据访问效率相对较高 堆的空间相对较大 但是

    2026年3月19日
    1
  • win10工作站激活码_通用破解码「建议收藏」

    win10工作站激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    184
  • ALLuxio_Alluxio公司怎么样

    ALLuxio_Alluxio公司怎么样一、什么是AlluxioAlluxio(之前名为Tachyon)是世界上第一个以内存为中心的虚拟的分布式存储系统。它统一了数据访问的方式,为上层计算框架和底层存储系统构建了桥梁。应用只需要连接Alluxio即可访问存储在底层任意存储系统中的数据。此外,Alluxio的以内存为中心的架构使得数据的访问速度能比现有常规方案快几个数量级。在大数据生态系统中,Alluxio介于计算框架(如Apache…

    2025年8月22日
    5
  • anaconda与pycharm配合使用_python环境搭建

    anaconda与pycharm配合使用_python环境搭建前天下了一个GitHub开源项目,但是项目的运行是可以用终端命令行运行,以前没用过,在网上也没找到教程说明。下面我来说个简单教程。这个是搭配anaconda的配置环境使用的。首先点pycharm的terminal,就会进入终端命令行,进去了一般是进入了cmd命令行界面,这个时候的环境是你系统自带的python环境,想要配合使用anaconda还要进一步配置点windows找到上面那个嘿嘿的Anacondaprompt,右键进入文件夹,再右键点击属性,进入下面的界面将包括cm

    2022年8月28日
    6
  • VS2013 产品密钥 – 所有版本

    VS2013 产品密钥 – 所有版本 VisualStudioUltimate2013KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9VisualStudioPremium2013KEY(密钥):FBJVC-3CMTX-D8DVP-RTQCT-92494VisualStudioProfessional2013 KEY(密钥): XD…

    2022年4月3日
    7.5K
  • k8s支持的存储_外部存储数据库

    k8s支持的存储_外部存储数据库k8sPV和PVC概述PVPVC生命周期配置存储ConfigMapSecretPV和PVC概述前面我们已经学习了使用NFS提供存储,此时就要求用户会搭建NFS系统,并且会在yaml配置nfs。由于kubernetes支持的存储系统有很多,要求客户全部掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用,kubernetes引入了PV和PVC两种资源对象。PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创

    2022年8月9日
    6

发表回复

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

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