机器学习及Pytorch(二、梯度下降算法)

         我们不妨从一个实际情景开始。假如有一个凹形的小坑,我们把一颗球放在坡上,那么由于重力,小球会往回滚进坑底

                        

         在上一篇文章中,代码的运行结果与上图相似

                                

                                                              更正:图像中纵坐标应该是MSE ,即均方误差

         我们知道,学习任务就是找到让MSE最小的权重,假设我们权重选在w=3.5这一点,很显然此时MSE大概在12左右,不是最小值,为了得到目标权重,我们就应该让w=3.5这一个“小球”往函数值下降的地方走,也就是在w=3.5这一处放一颗小球,小球应该往坡度向下的方向滚。

        由导数的相关可知,导数的几何意义是斜率。为了普适多元线性模型的情况,我们用梯度来在某点处最大下降坡度,也就是小球滚下去的方向。我们就能得到梯度:\frac{\partial const}{\partial w}。接下来我们用迭代的方法来更新w的值:

                                                ​​​​​​​        w=w-\alpha \frac{\partial const}{\partial w}

        其中\alpha是学习率,一般取值范围是[0,1],上述公式中,我们在梯度前添了一个负号以达到w向const下降的方向更新。当const取值最小时,在该点处导数为0,此时w的值不再更新。

        如果我们不使用Pytorch框架,那么梯度需要我们自己推导出,再用代码实现。我们依然以上一篇文章的例子,\hat{y}=w*x.推导过程如下:

                               

        于是我们就可以用如下公式:

                                 

        至此我们推导出了梯度下降算法的公式,需要注意的是这里是基于一元线性回归模型的推导 

但是梯度下降算法也会有一个明显的缺点,那就是如果const有多个极值,那么经过该算法不一定得到最小值,而是极小值

        例如,我们从w=m开始进行更新,那么w将会在w=a时停止更新,但此时const并不是最小值,最小值在w=b处。

        接下来我们用代码来实现:

import torch
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
w = 1.0  #选取w的初始点
def forward(x):
    return x*w
def const(xs,ys):
    loss_sum = 0
    for x , y in zip(xs,ys):
        y_hat = forward(x)
        loss_sum += (y_hat - y) ** 2
    return loss_sum/len(xs)
def gradient(xs, ys): #计算梯度
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)
print('Predict (before training)', 4, forward(4))
for epoch in range(100):
    const_val = const(x_data, y_data)  #此时的MSE值
    grad_val = gradient(x_data, y_data)
    w -= 0.01 * grad_val  #学习率为0.01
    print('Epoch:', epoch, 'w=', w, 'loss=', const_val)
print('Predict (after training)', 4, forward(4))

        接下来看一下运行结果:

Epoch: 0 w= 1.0933333333333333 loss= 4.666666666666667
Epoch: 1 w= 1.1779555555555554 loss= 3.8362074074074086
Epoch: 2 w= 1.2546797037037036 loss= 3.1535329869958857
Epoch: 3 w= 1.3242429313580246 loss= 2.592344272332262
Epoch: 4 w= 1.3873135910979424 loss= 2.1310222071581117
Epoch: 5 w= 1.4444976559288012 loss= 1.7517949663820642
Epoch: 6 w= 1.4963445413754464 loss= 1.440053319920117
.........
.........
.........
Epoch: 82 w= 1.999706130243504 loss= 4.902541385825727e-07
Epoch: 83 w= 1.9997335580874436 loss= 4.0301069098738336e-07
Epoch: 84 w= 1.9997584259992822 loss= 3.312926995781724e-07
Epoch: 85 w= 1.9997809729060159 loss= 2.723373231729343e-07
Epoch: 86 w= 1.9998014154347876 loss= 2.2387338352920307e-07
Epoch: 87 w= 1.9998199499942075 loss= 1.8403387118941732e-07
Epoch: 88 w= 1.9998367546614149 loss= 1.5128402140063082e-07
Epoch: 89 w= 1.9998519908930161 loss= 1.2436218932547864e-07
Epoch: 90 w= 1.9998658050763347 loss= 1.0223124683409346e-07
Epoch: 91 w= 1.9998783299358769 loss= 8.403862850836479e-08
Epoch: 92 w= 1.9998896858085284 loss= 6.908348768398496e-08
Epoch: 93 w= 1.9998999817997325 loss= 5.678969725349543e-08
Epoch: 94 w= 1.9999093168317574 loss= 4.66836551287917e-08
Epoch: 95 w= 1.9999177805941268 loss= 3.8376039345125727e-08
Epoch: 96 w= 1.9999254544053418 loss= 3.154680994333735e-08
Epoch: 97 w= 1.9999324119941766 loss= 2.593287985380858e-08
Epoch: 98 w= 1.9999387202080534 loss= 2.131797981222471e-08
Epoch: 99 w= 1.9999444396553017 loss= 1.752432687141379e-08
Predict (after training) 4 7.999777758621207

        经过一百轮的训练,我们可以从数据中看出,在最后几轮,w的值非常接近于2.0,loss的值非常接近于0,因此我们可以认定,预测可以得出四个小时的学习,会得到8分。此外我们应该注意学习率的取值不能过大也不能过小,过大可能会错过目标w的取值,过小会会耗费内存资源 。

        (未完待更新.....)

        

 

 

 

 

 

                

                                       

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值