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+0−10)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+0−10,(0+0+0−10)∗2,(0+0+0−10)∗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+0−10)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+8−10)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.6−2.4−2.4−10)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+0−10)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+2−10)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+2−10)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
