PyTorch学习之误差反向传播

本文详细介绍了如何使用PyTorch进行误差反向传播和梯度下降来训练线性模型。首先定义了数据和权重,接着通过前向传播计算预测值,然后定义损失函数并计算损失。在梯度下降过程中,利用反向传播求取权重的梯度,并进行权重更新。最后展示了损失值和权重随训练迭代的变化情况,验证了模型的收敛性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

误差反向传播是指,对于每次求出的Loss(损失),通过链式求导法则和梯度下降法,更新所有要学习的参数。
例如,对于线性模型:
y ^ = x ∗ ω + b \hat{y}=x*\omega+b y^=xω+b
其可训练的参数就是 ω \omega ω b b b

PyTorch提供了很好的基于计算图的误差反向传播机制,也就是当我们建立完各个参数之间的运算关系之后,一步backward(),就可以求出它对于所有require_grad = True的变量的偏导数,以方便进一步进行梯度下降(GD)运算。

注:PyTorch的两点反人类设计,一是默认不求偏导,requires_grad = True需要手动设置,二是梯度默认累积,需要手动清零

一、自定义数据

x_data = [1.,2.,3.]
y_data = [3.,6.,9.]
#使用PyTorch,最好把所有数据预先转换成Tensor格式,方便处理
x_data,y_data = map(
    torch.tensor,(x_data,y_data)
)

我们依旧用此数据,寻找最合适的 ω \omega ω

二、初始化权重
权重初始化的方式很多,对于一个14*128的权重矩阵,我们可以这样定义。需要注意,dtype要说明为float类型,定义requires_grad = True.

w1 = torch.randn((14,128),dtype = float,requires_grad = True)

本例子中,只有一个 ω \omega ω,因此我们这样初始化该权重:

w = torch.tensor([10.],requires_grad = True)

需要注意,不要先将w设置为int类型,然后在设置其require_grad。应该在一句话中设置其为float类型的tensor,并设置requires_grad = True.

三、前向传播

#前向传播
def forward(x):
    return x*w

四、定义损失函数(返回值为tensor变量,是 ω \omega ω的函数,即返回值可以对 ω \omega ω求偏导)

#定义损失函数
def loss(x,y):
    tot = sum((x-y)**2)
    return tot/len(x)

五、梯度下降过程
**格外注意,每次使用完梯度后,要对该变量的梯度清零,否则梯度是累加的

for epoch in range(100):
    e_l.append(epoch)
    
    #1.计算预测值,y_pred是w的函数
    y_pred = forward(x_data)
    
    #2.计算损失值,由于y_pred是w的函数,ls也是w的函数
    ls = loss(y_pred,y_data)
    
    #注,只使用tensor变量的数值时,用item()
    ls_l.append(ls.item())
    
    #3.误差在计算图上依据链式法则反向传播
    ls.backward()
    
    w_l.append(w.item())
    
    #4.梯度下降更新权值
    w.data = w.data - 0.01*w.grad.data#只修改数值,则用.data,否则会生成额外的计算图
    
    #梯度值清零,否则会累加
    w.grad.zero_()

六、实验结果
1、损失随epoch的变化

2、w随epoch的变化(最后稳定在3,和事实符合得很好)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值