超简单的pytorch反向传播举例

这篇博客通过一个简单的两层模型y=ax+b,展示了如何使用PyTorch进行反向传播。博主设定好输入x、目标y及初始参数a和b,采用MSE损失函数,仅运行一轮反向传播过程,详细解释了参数如何更新。读者可以设置断点,结合代码和图表深入理解反向传播机制。

本例设置了两层y=ax+b,前置条件包括x和目标y的值,初始的两组a和b的值,损失函数为mse loss,可以只跑一轮,看看反向传播各层参数是如何更新。建议在backward函数里打断点,然后将程序与图请对照着看。

在这里插入图片描述

# -*- coding:utf-8 -*-
# reference: https://pytorch.org/docs/stable/notes/extending.html
import torch
from torch import nn
from torch.autograd import Function, Variable
import numpy as np
from collections import OrderedDict

class LinearFunction2(Function):

    # Note that both forward and backward are @staticmethods
    @staticmethod
    # bias is an optional argument
    def forward(ctx, input, weight, bias=None):
        ctx.save_for_backward(input, weight, bias)
        output = input.mm(weight.t())
        if bias is not None:
            output += bias.unsqueeze(0).expand_as(output)
        return output

    # This function has only a single output, so it gets only one gradient
    @staticmethod
    def backward(ctx, grad_output):
        # This is a pattern that is very convenient - at the top of backward
        # unpack saved_tensors and initialize all gradients w.r.t. inputs to
        # None. Thanks to the fact that additional trailing Nones are
        # ignored, the return statement is simple even when the function has
        # optional inputs.

        # 第一个grad_output,是loss对y-y'的梯度。如loss_mse的梯度为2/n*(y-y'),
        # 其中n为一个batch数据的数目,该loss是nx1的矩阵。
        input
### 反向传播算法原理讲解 反向传播算法是一种用于训练人工神经网络的核心算法,其核心思想基于复合函数的链式求导法则,通过计算损失函数对网络中各权重参数的梯度,从而调整网络参数以最小化损失函数。算法分为两个主要阶段:前向传播和反向传播。 #### 前向传播 在前向传播过程中,输入数据通过网络逐层传递,每一层的神经元根据输入数据和当前权重计算输出值。最终,输出层产生预测结果,并通过损失函数衡量预测结果与真实值之间的差异。损失函数的选择取决于具体任务,例如均方误差(MSE)常用于回归任务,交叉熵损失(Cross-Entropy Loss)常用于分类任务。 #### 反向传播 反向传播阶段的核心是利用链式法则计算损失函数对每一层权重的梯度。具体来说,从输出层开始,逐层向前计算每个权重参数的梯度,并根据梯度下降法更新权重。更新公式如下: $$ w_{new} = w_{old} - \eta \cdot \frac{\partial L}{\partial w} $$ 其中,$ w $ 表示权重,$ \eta $ 是学习率,$ L $ 是损失函数,$\frac{\partial L}{\partial w}$ 是损失函数对权重的梯度。 #### 代码示例 以下是一个简单反向传播算法的Python实现,使用PyTorch框架完成一个简单的线性回归任务。 ```python import torch import torch.nn as nn import torch.optim as optim # 定义一个简单神经网络模型 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.linear = nn.Linear(1, 1) # 单层线性网络 def forward(self, x): return self.linear(x) # 创建模型实例 model = SimpleNet() # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 生成简单的训练数据 X = torch.tensor([[1.0], [2.0], [3.0], [4.0]]) y = torch.tensor([[2.0], [4.0], [6.0], [8.0]]) # 训练过程 for epoch in range(100): # 前向传播 outputs = model(X) loss = criterion(outputs, y) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}') # 打印最终的权重和偏置 print(f'Final weights: {model.linear.weight.data}') print(f'Final bias: {model.linear.bias.data}') ``` 上述代码中,`SimpleNet` 是一个简单的单层线性网络,`MSELoss` 作为损失函数用于衡量预测值与真实值之间的差异,`SGD` 优化器用于更新权重参数。在训练过程中,前向传播计算预测值和损失,反向传播计算梯度并更新权重。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值