首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | PyTorch:网红中的顶流明星
02 | NumPy(上):核心数据结构详解
03 | NumPy(下):深度学习中的常用操作
04 | Tensor:PyTorch中最基础的计算单元
05 | Tensor变形记:快速掌握Tensor切分、变形等方法
06 | Torchvision(上):数据读取,训练开始的第一步
07 | Torchvision(中):数据增强,让数据更加多样性
08 | Torchvision(下):其他有趣的功能
09 | 卷积(上):如何用卷积为计算机“开天眼”?
10 | 卷积(下):如何用卷积为计算机“开天眼”?
11 | 损失函数:如何帮助模型学会“自省”?
12 | 计算梯度:网络的前向与反向传播
13 | 优化方法:更新模型参数的方法
14 | 构建网络:一站式实现模型搭建与训练
15 | 可视化工具:如何实现训练的可视化监控?
16|分布式训练:如何加速你的模型训练?
17 | 图像分类(上):图像分类原理与图像分类模型
18 | 图像分类(下):如何构建一个图像分类模型?
19 | 图像分割(上):详解图像分割原理与图像分割模型
20 | 图像分割(下):如何构建一个图像分割模型?
21 | NLP基础(上):详解自然语言处理原理与常用算法
22 | NLP基础(下):详解语言模型与注意力机制
23 | 情感分析:如何使用LSTM进行情感分析?
24 | 文本分类:如何使用BERT构建文本分类模型?
25 | 摘要:如何快速实现自动文摘生成?
当前位置:
首页>>
技术小册>>
PyTorch深度学习实战
小册名称:PyTorch深度学习实战
### 12 | 计算梯度:网络的前向与反向传播 在深度学习领域,PyTorch作为一款强大的开源机器学习库,以其动态计算图、简洁的API和强大的GPU加速能力,成为了众多研究人员和工程师的首选工具。在构建和训练深度学习模型时,理解并有效实现前向传播(Forward Propagation)和反向传播(Backward Propagation)是至关重要的。本章将深入探讨这两个核心概念,特别是它们如何协同工作以计算梯度,进而优化神经网络。 #### 12.1 引言 深度学习模型的学习过程本质上是参数的优化过程,而这些参数优化的依据是损失函数(Loss Function)关于模型参数的梯度。前向传播定义了数据通过模型时的计算流程,生成预测结果;而反向传播则负责根据损失函数的值,计算模型参数的梯度,为参数的更新提供依据。 #### 12.2 前向传播 **12.2.1 定义与流程** 前向传播是神经网络中的信息流动方向,从输入层开始,经过隐藏层(如果有的话),最后到达输出层。在这一过程中,每一层的神经元接收来自前一层神经元的输入,通过激活函数处理后,产生本层的输出,并作为下一层的输入。这一过程不涉及任何参数的更新,只是简单地根据当前参数值计算网络的输出。 **12.2.2 PyTorch实现** 在PyTorch中,前向传播通常是通过定义模型类(继承自`torch.nn.Module`)并实现其`forward`方法来实现的。例如,一个简单的全连接神经网络层可以这样定义: ```python import torch import torch.nn as nn class SimpleNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) return x ``` 在这个例子中,`forward`方法定义了数据通过网络的路径,包括线性变换(`nn.Linear`)和激活函数(`nn.ReLU`)。 #### 12.3 反向传播 **12.3.1 原理** 反向传播算法是神经网络训练的核心,它利用链式法则(Chain Rule)来计算损失函数关于网络中每个参数的梯度。具体来说,反向传播从输出层开始,根据损失函数的值,逐层计算每个参数的梯度,直到输入层。这些梯度随后用于更新网络的参数,以最小化损失函数。 **12.3.2 PyTorch中的自动微分** PyTorch通过自动微分(Automatic Differentiation)极大地简化了反向传播的实现。在PyTorch中,所有在`torch.Tensor`上的操作都会被记录在计算图中,这个图是一个动态构建的有向无环图(DAG),记录了数据之间的依赖关系。当调用`.backward()`方法时,PyTorch会自动计算图中所有需要梯度的`Tensor`的梯度。 **示例** 继续上面的网络示例,假设我们有一个损失函数(如均方误差),并希望计算网络中所有参数的梯度: ```python # 假设数据 inputs = torch.randn(1, input_size) targets = torch.randn(1, output_size) # 实例化模型 model = SimpleNN(input_size, hidden_size, output_size) # 前向传播 outputs = model(inputs) # 定义损失函数 loss_fn = nn.MSELoss() loss = loss_fn(outputs, targets) # 反向传播 model.zero_grad() # 清除之前累积的梯度 loss.backward() # 反向传播,计算当前梯度 # 查看梯度 for name, param in model.named_parameters(): print(f"{name}: gradient = {param.grad}") ``` 在这个例子中,`loss.backward()`触发了反向传播过程,计算了损失函数关于网络中所有可训练参数的梯度,并将这些梯度存储在参数的`.grad`属性中。注意,在调用`.backward()`之前,我们调用了`model.zero_grad()`来清除之前累积的梯度,这是因为在训练循环中,我们通常需要累加或更新梯度,而不是让它们无限累积。 #### 12.4 梯度优化 得到梯度后,下一步是使用优化算法来更新模型的参数。PyTorch提供了多种优化器(如SGD、Adam等),它们可以根据计算出的梯度来更新模型的参数,以最小化损失函数。 ```python optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 假设这是一个训练循环的一部分 optimizer.zero_grad() # 清零梯度 outputs = model(inputs) loss = loss_fn(outputs, targets) loss.backward() # 反向传播 optimizer.step() # 更新参数 ``` 在这个例子中,`optimizer.step()`根据梯度更新了模型的参数。 #### 12.5 总结 本章深入探讨了深度学习中的前向传播和反向传播机制,以及它们在PyTorch中的实现。前向传播定义了数据通过网络的路径,生成预测结果;反向传播则利用链式法则计算损失函数关于模型参数的梯度。PyTorch通过自动微分简化了反向传播的实现,并提供了多种优化器来更新模型参数。理解并掌握这些基本概念和工具,对于成功构建和训练深度学习模型至关重要。
上一篇:
11 | 损失函数:如何帮助模型学会“自省”?
下一篇:
13 | 优化方法:更新模型参数的方法
该分类下的相关小册推荐:
AIGC原理与实践:零基础学大语言模型(一)
巧用ChatGPT做跨境电商
AI-Agent智能应用实战(上)
深入浅出人工智能(下)
ChatGPT商业变现
人工智能超入门丛书--知识工程
人工智能基础——基于Python的人工智能实践(中)
GitHub Copilot 实践
ChatGLM3大模型本地化部署、应用开发与微调(上)
ChatGPT中文教程
AI时代产品经理:ChatGPT与产品经理(中)
ChatGPT原理与实战:大型语言模型(上)