小批量随机梯度下降法和梯度下降法的再理解---深度学习&机器学习第四天

深度学习 同时被 2 个专栏收录
5 篇文章 1 订阅
2 篇文章 1 订阅

小批量随机梯度下降法和梯度下降法的再理解

理解该篇文章的前提是:看懂上一篇关于讲解梯度下降法的内容和代码。
梯度下降法链接:梯度下降法


①梯度下降法的再理解:

在上一篇文章中,我们提到了在实现梯度下降法的关键步骤中有,损失函数(在这里我们用的是均方损失)。

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高级框架版+代码详解
码字不易,望三连!!!
结束!!
✨✨✨✨✨✨

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值