深度学习:神经网络中反向传播的使用(pytorch)

深度学习:神经网络中反向传播的使用(pytorch)

反向传播算法是深度学习中最关键的技术之一,用于有效计算神经网络中每个参数的梯度。这些梯度随后用于优化过程,即通过调整网络参数以最小化损失函数,从而提高模型在特定任务上的性能。反向传播结合了链式法则和微分的基本概念,使得可以在复杂网络结构中高效地计算梯度。

基本概念

在讨论反向传播之前,首先需要了解几个关键概念:

  • 梯度(Gradient):一个函数在某一点的梯度由该点所有偏导数组成的向量,表示该函数在该点最快增长的方向。
  • 链式法则(Chain Rule):是微积分中的一个基本规则,用于计算复合函数的导数。在神经网络的上下文中,链式法则使我们能够将输出层的误差反向传播到输入层,途中计算出相关的偏导数。

反向传播的工作原理

反向传播过程可以分为以下步骤:

  1. 前向传播:从输入层到输出层计算神经网络的输出。在这个阶段,每一层的输入都通过加权和和激活函数转换成输出,直到最后一层产生最终的预测结果。

  2. 计算损失:使用损失函数(如均方误差或交叉熵损失)计算网络输出和实际标签之间的差异。

  3. 反向传播误差

    • 从输出层开始,计算损失函数相对于每个输出节点的导数(这是链式法则的开始)。
    • 对于网络中的每一层,反向计算误差关于每个参数(权重和偏置)的偏导数。具体来说,每层的输出误差由该层的输出相对于输入的偏导数(即该层的局部梯度)与来自上一层的误差的乘积决定。
    • 继续这一过程直到达到输入层。
  4. 更新参数 :使用计算得到的梯度和选定的优化算法(如SGD、Adam等)更新网络的权重和偏置,通常使用如下规则:

    $w = w - \\eta \\cdot \\frac{\\partial L}{\\partial w} $

    其中 ( η \eta η ) 是学习率,( ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L ) 是损失函数关于权重 ( w w w ) 的梯度。

具体示例

假设一个简单的网络,包含一个输入层、一个隐藏层和一个输出层,每层只有一个神经元,无偏置,激活函数为恒等函数(即 ( f(x) = x )):

  • 输入层到隐藏层的权重 :( w 1 w_1 w1 )
  • 隐藏层到输出层的权重:( w_2 )
  • 输入值 :( x x x )
  • 真实输出:( y )
  • 预测输出 :( y ^ = w 2 ⋅ ( w 1 ⋅ x ) \hat{y} = w_2 \cdot (w_1 \cdot x) y^=w2⋅(w1⋅x) )
  • 损失函数 :均方误差 ( L = 1 2 ( y − y ^ ) 2 L = \frac{1}{2}(y - \hat{y})^2 L=21(y−y^)2 )
前向传播:

$ z_1 = w_1 \\cdot x$

z 2 = w 2 ⋅ z 1 z_2 = w_2 \\cdot z_1 z2=w2⋅z1

$ \\hat{y} = z_2$

反向传播:
  • 对 ( w 2 w_2 w2 ) 的梯度:

    ∂ L ∂ w 2 = ∂ L ∂ y \^ ⋅ ∂ y \^ ∂ w 2 = − ( y − y \^ ) ⋅ z 1 \\frac{\\partial L}{\\partial w_2} = \\frac{\\partial L}{\\partial \\hat{y}} \\cdot \\frac{\\partial \\hat{y}}{\\partial w_2} = -(y - \\hat{y}) \\cdot z_1 ∂w2∂L=∂y\^∂L⋅∂w2∂y\^=−(y−y\^)⋅z1

  • 对 ( w 1 w_1 w1 ) 的梯度:

    $\\frac{\\partial L}{\\partial w_1} = \\frac{\\partial L}{\\partial \\hat{y}} \\cdot \\frac{\\partial \\hat{y}}{\\partial z_1} \\cdot \\frac{\\partial z_1}{\\partial w_1} = -(y - \\hat{y}) \\cdot w_2 \\cdot x $

这些梯度随后可以用来更新权重 ( w_1 ) 和 ( w_2 )。反向传播算法的核心是有效和系统地计算这些梯度,这使得即使在非常深的网络中也能有效地训练。

通过反向传播,我们可以在整个网络中有效地计算每个参数的梯度,从而在迭代过程中逐步优化这些参数,以减小网络的预测误差。这种方法是现代神经网络训练不可或缺的一部分,并被广泛应用于各种机器学习任务中。

PyTorch中的实现

在PyTorch中,使用自动微分系统(autograd)来实现反向传播,大大简化了梯度的手动计算。下面是一个具体的例子,展示如何使用PyTorch训练一个简单的神经网络:

定义网络
python 复制代码
import torch
import torch.nn as nn

class SimpleNetwork(nn.Module):
    def __init__(self):
        super(SimpleNetwork, self).__init__()
        self.layer1 = nn.Linear(10, 20)  # 输入层到隐藏层
        self.relu = nn.ReLU()            # 激活函数
        self.layer2 = nn.Linear(20, 1)   # 隐藏层到输出层

    def forward(self, x):
        x = self.layer1(x)
        x = self.relu(x)
        x = self.layer2(x)
        return x
训练过程
python 复制代码
# 初始化模型
model = SimpleNetwork()

# 损失函数和优化器
criterion = nn.MSELoss()  # 均方误差
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # SGD优化器

# 示例数据
inputs = torch.randn(5, 10)  # 5个样本,每个样本10个特征
targets = torch.randn(5, 1)  # 真实值

# 前向传播
outputs = model(inputs)
loss = criterion(outputs, targets)

# 反向传播
optimizer.zero_grad()  # 清空之前的梯度
loss.backward()  # 自动计算所有梯度
optimizer.step()  # 参数更新

print("Loss:", loss.item())

在这个例子中,.backward()调用会自动计算loss关于网络参数的梯度,并存储在各参数的.grad属性中。optimizer.step()则使用这些梯度来更新参数。

通过上述步骤,PyTorch允许研究人员和开发者专注于模型的设计和训练过程,而无需手动实现复杂的梯度计算。这种自动化的微分和灵活的设计使得实现复杂的深度学习模型变得更加容易和高效。

相关推荐
胡耀超2 小时前
DataOceanAI Dolphin(ffmpeg音频转化教程) 多语言(中国方言)语音识别系统部署与应用指南
python·深度学习·ffmpeg·音视频·语音识别·多模态·asr
HUIMU_2 小时前
DAY12&DAY13-新世纪DL(Deeplearning/深度学习)战士:破(改善神经网络)1
人工智能·深度学习
mit6.8243 小时前
[1Prompt1Story] 注意力机制增强 IPCA | 去噪神经网络 UNet | U型架构分步去噪
人工智能·深度学习·神经网络
Coovally AI模型快速验证4 小时前
YOLO、DarkNet和深度学习如何让自动驾驶看得清?
深度学习·算法·yolo·cnn·自动驾驶·transformer·无人机
科大饭桶4 小时前
昇腾AI自学Day2-- 深度学习基础工具与数学
人工智能·pytorch·python·深度学习·numpy
努力还债的学术吗喽5 小时前
2021 IEEE【论文精读】用GAN让音频隐写术骗过AI检测器 - 对抗深度学习的音频信息隐藏
人工智能·深度学习·生成对抗网络·密码学·音频·gan·隐写
weixin_507929916 小时前
第G7周:Semi-Supervised GAN 理论与实战
人工智能·pytorch·深度学习
AI波克布林8 小时前
发文暴论!线性注意力is all you need!
人工智能·深度学习·神经网络·机器学习·注意力机制·线性注意力
weixin_456904278 小时前
一文讲清楚Pytorch 张量、链式求导、正向传播、反向求导、计算图等基础知识
人工智能·pytorch·学习
Blossom.1189 小时前
把 AI 推理塞进「 8 位 MCU 」——0.5 KB RAM 跑通关键词唤醒的魔幻之旅
人工智能·笔记·单片机·嵌入式硬件·深度学习·机器学习·搜索引擎