小批量随机梯度下降法和梯度下降法的再理解
理解该篇文章的前提是:看懂上一篇关于讲解梯度下降法的内容和代码。
梯度下降法链接:梯度下降法
①梯度下降法的再理解:
在上一篇文章中,我们提到了在实现梯度下降法的关键步骤中有,损失函数(在这里我们用的是均方损失)。
loss(w) = (1 / 2) * (w * xi - yi)^2
其中乘以(1 / 2)是为了求导方便。
但是你有没有产生这样的疑惑,当w指定时,不同的xi和yi所产生的loss(w)的图像是不一样的,也就是在w指定是,不同的xi和yi产生的导数值是不一样的。首先,这个疑惑是正确的,但是在循环轮数很大的情况下,所产生的影响是微乎其微的。如图手动分析:
所以得出结论,w相同,xi和yi不同时,产生的函数图像是相似的。也就等同于该点的导数也是近似的。当然我画的函数图像可能有点夸张,产生不同变量函数的图像是很像的。所以产生的影响很小。
当理解完这一点后,我们就可以正式开始学习小批量随机梯度下降法了。
②小批量随机梯度下降法
随机:所谓的随机,就是我们理解的意思。选取随机的点进行梯度下降。
小批量:字面上理解,选取的点是一批一批的,而不单单是一个一个的取点。嗯,就是这个意思。
但是为什么要用小批量随机梯度下降法呢?
随机肯定是为了保证结果尽可能有说服力。
小批量:⑴在数据量特别大的情况下,我们一个一个点的求太慢了,并且我们模型函数不只一个变量,可能有上万个变量。所以用小批量加快了我们的运算速度。⑵假如我们有100000个点,100000个点各跑一遍和每次选取10个点一起跑,跑10000遍,产生结果的精度,不一定后者的就差。(当然我没有验证过🤣)
如何实现小批量随机梯度下降法?
随机很简单,一个随机函数shuffle()就可以。
小批量:在同一个w情况下,不同的xi, yi产生的函数图像是近似的,在该点的导数值也是近似的。所以我们选取n个由不同的xi,yi产生的导数值相加除以n,求其均值。记为这批点产生的平均导数值。这就是小批量的实现。
代码实现如下:
// 在这里只有小批量,还没有随机,加随机的请看完整代码,链接在底部
for i in range(0,500,10):
loss = ((w * x[i:(i+10)] - y[i:(i+10)]) ** 2) / 2
loss.sum().backward()
with torch.no_grad():
w -= lr * w.grad / 10
w.grad.zero_()
print(f'第 {i + 1} 轮,w的预测值为:{w}')
结果为:(在这里结果第几轮的几是不对的,把控制输出变量改一下就可以,无伤大雅🤣)
第 1 轮,w的预测值为:tensor([8.7910], requires_grad=True)
第 11 轮,w的预测值为:tensor([7.5585], requires_grad=True)
第 21 轮,w的预测值为:tensor([7.0972], requires_grad=True)
第 31 轮,w的预测值为:tensor([6.4384], requires_grad=True)
第 41 轮,w的预测值为:tensor([6.0033], requires_grad=True)
第 51 轮,w的预测值为:tensor([5.8827], requires_grad=True)
第 61 轮,w的预测值为:tensor([5.7091], requires_grad=True)
第 71 轮,w的预测值为:tensor([5.5823], requires_grad=True)
第 81 轮,w的预测值为:tensor([5.4687], requires_grad=True)
第 91 轮,w的预测值为:tensor([5.3987], requires_grad=True)
第 101 轮,w的预测值为:tensor([5.3272], requires_grad=True)
第 111 轮,w的预测值为:tensor([5.2702], requires_grad=True)
第 121 轮,w的预测值为:tensor([5.2038], requires_grad=True)
第 131 轮,w的预测值为:tensor([5.1736], requires_grad=True)
第 141 轮,w的预测值为:tensor([5.1183], requires_grad=True)
第 151 轮,w的预测值为:tensor([5.1074], requires_grad=True)
第 161 轮,w的预测值为:tensor([5.0836], requires_grad=True)
第 171 轮,w的预测值为:tensor([5.0763], requires_grad=True)
第 181 轮,w的预测值为:tensor([5.0454], requires_grad=True)
第 191 轮,w的预测值为:tensor([5.0400], requires_grad=True)
第 201 轮,w的预测值为:tensor([5.0368], requires_grad=True)
第 211 轮,w的预测值为:tensor([5.0319], requires_grad=True)
第 221 轮,w的预测值为:tensor([5.0273], requires_grad=True)
第 231 轮,w的预测值为:tensor([5.0245], requires_grad=True)
第 241 轮,w的预测值为:tensor([5.0197], requires_grad=True)
第 251 轮,w的预测值为:tensor([5.0144], requires_grad=True)
第 261 轮,w的预测值为:tensor([5.0105], requires_grad=True)
第 271 轮,w的预测值为:tensor([5.0080], requires_grad=True)
第 281 轮,w的预测值为:tensor([5.0042], requires_grad=True)
第 291 轮,w的预测值为:tensor([5.0033], requires_grad=True)
第 301 轮,w的预测值为:tensor([5.0030], requires_grad=True)
第 311 轮,w的预测值为:tensor([5.0019], requires_grad=True)
第 321 轮,w的预测值为:tensor([5.0015], requires_grad=True)
第 331 轮,w的预测值为:tensor([5.0012], requires_grad=True)
第 341 轮,w的预测值为:tensor([5.0008], requires_grad=True)
第 351 轮,w的预测值为:tensor([5.0005], requires_grad=True)
第 361 轮,w的预测值为:tensor([5.0004], requires_grad=True)
第 371 轮,w的预测值为:tensor([5.0003], requires_grad=True)
第 381 轮,w的预测值为:tensor([5.0003], requires_grad=True)
第 391 轮,w的预测值为:tensor([5.0003], requires_grad=True)
第 401 轮,w的预测值为:tensor([5.0002], requires_grad=True)
第 411 轮,w的预测值为:tensor([5.0002], requires_grad=True)
第 421 轮,w的预测值为:tensor([5.0002], requires_grad=True)
第 431 轮,w的预测值为:tensor([5.0002], requires_grad=True)
第 441 轮,w的预测值为:tensor([5.0001], requires_grad=True)
第 451 轮,w的预测值为:tensor([5.0001], requires_grad=True)
第 461 轮,w的预测值为:tensor([5.0001], requires_grad=True)
第 471 轮,w的预测值为:tensor([5.0000], requires_grad=True)
第 481 轮,w的预测值为:tensor([5.0000], requires_grad=True)
第 491 轮,w的预测值为:tensor([5.0000], requires_grad=True)
tensor([5.]) tensor([5.0000], requires_grad=True)
可以看到结果最终收敛,预测值和真实值相同。
完整代码链接:
㈠:一维简约版实现
㈡:一维完整版实现
㈢:多维完整版实现
㈣:Pytorch高级框架版+代码详解
码字不易,望三连!!!
结束!!
✨✨✨✨✨✨