【PyTorch深度学习实践】03_反向传播

对于简单的模型,梯度变换可以用解析式表达进行手算,但是复杂模型(很多w,b)的损失函数需要挨个写解析式,非常不好计算(主要是求导)。因此,可以考虑使用某种算法,把整个网络看做一个计算图,在图上传播整个梯度。这种算法,就称为反向传播算法。

转载:梯度下降法是通用的优化算法,反向传播法是梯度下降法在深度神经网络上的具体实现方式。

1.计算图

单层
在这里插入图片描述

需要注意的是,神经网络的训练本质,就是对每层的w和b进行训练。

在这里插入图片描述每一层的结束都需要引入非线性的激活函数。
如果不加入激活函数,那么无论多少层,得到的结果都是线性的。

在这里插入图片描述

2.反向传播

2.1 链式求导法则

进行反向传播的关键就是链式求导。反向传播其实就是计算图中的梯度求解,通过链式求导得到L对x和w的导数(梯度),再根据更新规则进行更新。

链式求导的规则,非常形象的图:
在这里插入图片描述

2.2 反向传播过程

1.构建计算图(前馈)
在这里插入图片描述

2. 求输出关于x和w的梯度
在这里插入图片描述
3. 损失L关于输出z的偏导
在这里插入图片描述
4. 运用链式求导法则,求L关于x和w的偏导(反馈)

在这里插入图片描述
一个简单线性模型(仿射模型)的前馈+反馈过程
在这里插入图片描述

3.Pytorch中前馈和反馈的计算

3.1 Tensor

参考博客
Tensor本身是一个类,是用来存数据的,可以存标量、向量、矩阵等。里面包含两个比较重要的成员data(比如权重值)和grad(损失函数对权重的导数)有两个重要的成员,一个是data(保存权重w),一个是grad(保存损失函数对权重的导数)。
在PyTorch中,torch.Tensor类是存储和变换数据的重要工具,相比于Numpy,Tensor提供GPU计算和自动求梯度等更多功能,在深度学习中,我们经常需要对函数求梯度(gradient)。PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。

在这里插入图片描述
在这里插入图片描述

3.2 代码演示

import torch
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w = torch.Tensor([1.0])
w.requires_grad = True   # 表明w是需要计算梯度的

def forward(x):     # 前馈过程
    return x * w    
# 因为w是tensor,因此x会自动类型转换变成tensor,输出的结果也变为tensor,而且输出的结果也会计算梯度

def loss(x, y):             # 损失函数,本质是在构建文章首部的计算图
    y_pred = forward(x)
    return (y_pred - y) ** 2

loss_list = []
epoch_list = []

print("predict(before training)",4, forward(4).item())   # 因为数值是一维标量,所以可以直接用item取,不是标量(如向量,矩阵)得用data

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.03 * w.grad.data   # 更新:.data得到的也是张量,但是只是数值改变的运算。不取data会构建计算图,占用内存
        # .data是进入张量里修改,.item()是直接取数字
        # .data返回的还是一个tensor,.item()只能对只有一个元素的tensor使用,返回一个标量(具体的数值)
        w.grad.data.zero_()  # 把权重的梯度数据清零,不然后面几轮会累加计算

    epoch_list.append(epoch)
    loss_list.append(l.item())
    print("progress:", epoch, l.item())

print("predict(after training)", 4, forward(4).item())

plt.plot(epoch_list, loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

得到的图像如下:

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pytorch中进行深度学习实践的步骤如下: 1. 准备数据集:使用Pytorch提供的工具包torchvision,可以方便地下载和加载一些常见的数据集,如MNIST和CIFAR-10。你可以使用train_set和test_set来分别加载训练集和测试集。 2. 构建模型:在Pytorch中,你可以使用类(Class)来设计和构建深度学习模型。你需要定义一个继承自nn.Module的类,并实现其中的forward方法,该方法描述了如何从输入数据中计算出模型的输出。在这个过程中,你可以根据输入数据的维度来确定权重矩阵w和偏置项b的大小。 3. 定义损失函数和优化器:在深度学习中,我们需要定义一个损失函数来衡量模型的预测结果与真实标签之间的差异。常见的损失函数有交叉熵损失函数(CrossEntropyLoss)和均方误差损失函数(MSELoss)。然后,你可以选择一个优化器来更新模型的参数,常见的优化器有随机梯度下降法(SGD)和Adam优化器。 4. 训练模型:在训练模型之前,你需要定义一些超参数,如学习率、迭代次数和批量大小。然后,你可以使用一个循环来迭代地训练模型。在每一次迭代中,你需要将输入数据传递给模型,计算模型的输出,计算损失函数并进行反向传播,最后使用优化器来更新模型的参数。重复这个过程直到达到设定的迭代次数。 5. 模型评估:在训练完成后,你可以使用测试集来评估模型的性能。通过传递测试集的输入数据给模型,计算模型的预测结果,并与真实标签进行比较,可以得到模型的准确率或其他性能指标。 综上所述,这是一个基本的Pytorch深度学习实践流程,你可以根据具体的任务和数据集进行相应的调整和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值