pytorch反向传播原理

假设我们有一组数据如下表所示,,表示学习时长和分数的关系,我们要推断出当x=4时,y为多少

x(hours) y(points)
1 2
2 4
3 6
4 ?

通常情况下我们假设上述模型是一个线性模即y=w*x+b,这里为了简单省略为y=w*x。

下面模型模拟pytorch的计算过程:

下图是我个人关于整个求导的流程的理解,x=1,y^=2,w的初始值为1。

pytorch反向传播原理_第1张图片

然后根据w=w-learningrate*\frac{\partial loss}{\partial w}(learningrate=0.01)获得更新后的w=1.02

代码实现

在pytorch使用Autograd模块实现深度学习的反向传播求导,tensor类本身就支持了使用autograd功能,因此需要使用该功能时,可以将.requires_grad=True。通过grad属性保持对应的数据;因此,可以通过xxx.grad查看对应的梯度值。

PyTorch会自动追踪和记录对与张量的所有操作,当计算完成后调用.backward()方法自动计算梯度并且将计算结果保存到grad属性中。

import torch

#假设w的初始值为1.0,并通过设置 requires_grad标识为Ture来
#告诉Pytorch需要对该张量进行自动求导,PyTorch会记录该张量的每一步操作历史并自动计算
w=torch.tensor([1.0],requires_grad=True)
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]

#定义损失函数、

def forward(x):  # y^ = wx

    return x * w  # w是tensor 所以 这个乘法自动转换为tensor数乘 , x被转化成tensor 这里构建了一个计算图
def loss(x, y):  # 计算单个的误差 : 损失
 
    '''
    每调用一次loss函数,计算图自动构建一次
    :param x:
    :param y:
    :return:
    '''
    y_pred = forward(x)
    return (y_pred - y) ** 2


eli=[]
lli=[]
print('predict(before training)',4,forward(4).item())

for epoch in range(100):
    for x,y in zip(x_data,y_data):
     
        l=loss(x,y)
        l.backward()#自动求梯度
        print('\tgrad:', x, y, w.grad.item())
        w.data=w.data-0.01*w.grad.data
    
        #清空权重,不然梯度会累加
        w.grad.data.zero_()
       
       
    eli.append(epoch)
    lli.append(l.item())
    print('progress:',epoch,l.item())
print('predict(after training)',4,forward(4).item())

pytorch反向传播原理_第2张图片

其可视化结果如下图所示:

import matplotlib.pyplot as plt
plt.plot(eli, lli)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()

 

pytorch反向传播原理_第3张图片

参考文献:https://blog.csdn.net/Weary_PJ/article/details/105706318

                pytorch-handbook

你可能感兴趣的:(pytorch,python,深度学习)