【PyTorch基础教程4】反向传播与计算图(学不会来打我啊)

简介: 一、基础回顾1.1 正向传递(1)正向传递求loss,反向传播求loss对变量的梯度。求loss实际在构建计算图,每次运行完后计算图就释放了。(2)Tensor的Grad也是一个Tensor。更新权重w.data = w.data - 0.01 * w.grad.data的0.01乘那坨其实是在建立计算图,而我们这里要乘0.01 * grad.data,这样是不会建立计算图的(并不希望修改权重w,后面还有求梯度)。(3)下面的w.grad.item()是直接把w.grad的数值取出,变成一个标量(也是为了防止产生计算图)。总之,牢记权重更新过程中要使

一、基础回顾

1.1 正向传递

image.png


1.2 反向传播

image.png


1.3 举栗子

现在以 f = x ⋅ ω f=x \cdot \omegaf=x⋅ω 为例:


(1)正向传递


image.png

(2)反向传播

image.png

注意虽然这里的image.png

二、计算图

2.1 线性模型的计算图

image.png

练习:

image.png

三、代码实战

# -*- coding: utf-8 -*-
"""
Created on Sun Oct 17 19:39:32 2021
@author: 86493
"""
import torch
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
# 向前传递
def forward(x):
    return x * w
# 这里使用SGD
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2
print("predict (before training)", 4,
      forward(4).item())
# 训练过程,SGD
for epoch in range(100):
    for x, y in zip(x_data, y_data):
        # 向前传播,计算loss
        l = loss(x, y)
        # 计算requires_grad为true的tensor的梯度
        l.backward()
        print('\tgrad:', x, y, w.grad.item())
        w.data = w.data - 0.01 * w.grad.data
        # 反向传播后grad会被重复计算,所以记得清零梯度
        w.grad.data.zero_()
    print("progress:", epoch, l.item())
print("predict (after training)", 4, 
      forward(4).item())   

注意:

(1)loss实际在构建计算图,每次运行完后计算图就释放了。

(2)Tensor的Grad也是一个Tensor。更新权重w.data = w.data - 0.01 * w.grad.data的0.01乘那坨其实是在建立计算图,而我们这里要乘0.01 * grad.data,这样是不会建立计算图的(并不希望修改权重w,后面还有求梯度)。

(3)w.grad.item()是直接把w.grad的数值取出,变成一个标量(也是为了防止产生计算图)。总之,牢记权重更新过程中要使用data。

image.png

(4)如果不像上面计算一个样本的loss,想算所有样本的loss(cost),然后就加上sum += l,注意此时sum是关于张量 l ll 的一个计算图,又未对sum做backward操作,随着l越加越多会导致内存爆炸。

正确做法:sum += l.item(),别把损失直接加到sum里面。

Tensor在做加法运算时会构建计算图

(5)backward后的梯度一定要记得清零w.grad.data.zero()。

image.png

(6)训练过程:先计算loss损失值,然后backward反向传播,现在就有了梯度了。通过梯度下降更新参数:


image.png

四、作业

image.png

相关文章
|
2月前
|
存储 物联网 PyTorch
基于PyTorch的大语言模型微调指南:Torchtune完整教程与代码示例
**Torchtune**是由PyTorch团队开发的一个专门用于LLM微调的库。它旨在简化LLM的微调流程,提供了一系列高级API和预置的最佳实践
215 59
基于PyTorch的大语言模型微调指南:Torchtune完整教程与代码示例
|
2月前
|
并行计算 监控 搜索推荐
使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
当处理大规模图数据时,复杂性难以避免。PyTorch-BigGraph (PBG) 是一款专为此设计的工具,能够高效处理数十亿节点和边的图数据。PBG通过多GPU或节点无缝扩展,利用高效的分区技术,生成准确的嵌入表示,适用于社交网络、推荐系统和知识图谱等领域。本文详细介绍PBG的设置、训练和优化方法,涵盖环境配置、数据准备、模型训练、性能优化和实际应用案例,帮助读者高效处理大规模图数据。
65 5
|
3月前
|
存储 并行计算 PyTorch
探索PyTorch:张量数值计算
探索PyTorch:张量数值计算
|
3月前
|
PyTorch 算法框架/工具 Python
Pytorch学习笔记(十):Torch对张量的计算、Numpy对数组的计算、它们之间的转换
这篇文章是关于PyTorch张量和Numpy数组的计算方法及其相互转换的详细学习笔记。
54 0
|
4月前
|
机器学习/深度学习
小土堆-pytorch-神经网络-损失函数与反向传播_笔记
在使用损失函数时,关键在于匹配输入和输出形状。例如,在L1Loss中,输入形状中的N代表批量大小。以下是具体示例:对于相同形状的输入和目标张量,L1Loss默认计算差值并求平均;此外,均方误差(MSE)也是常用损失函数。实战中,损失函数用于计算模型输出与真实标签间的差距,并通过反向传播更新模型参数。
|
5月前
|
并行计算 Ubuntu PyTorch
Ubuntu下CUDA、Conda、Pytorch联合教程
本文是一份Ubuntu系统下安装和配置CUDA、Conda和Pytorch的教程,涵盖了查看显卡驱动、下载安装CUDA、添加环境变量、卸载CUDA、Anaconda的下载安装、环境管理以及Pytorch的安装和验证等步骤。
949 1
Ubuntu下CUDA、Conda、Pytorch联合教程
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch中的自动微分机制:深入理解反向传播
【8月更文第27天】PyTorch 是一个强大的机器学习框架,它因其灵活性和易用性而受到广泛欢迎。其中一个关键特性就是它的自动微分机制,这个机制使得 PyTorch 能够自动计算任何张量操作的梯度,这对于训练深度学习模型至关重要。本文将详细介绍 PyTorch 中自动微分机制的工作原理,并通过具体的代码示例来展示如何使用这一机制来实现反向传播。
375 1
|
8月前
|
机器学习/深度学习 JSON PyTorch
图神经网络入门示例:使用PyTorch Geometric 进行节点分类
本文介绍了如何使用PyTorch处理同构图数据进行节点分类。首先,数据集来自Facebook Large Page-Page Network,包含22,470个页面,分为四类,具有不同大小的特征向量。为训练神经网络,需创建PyTorch Data对象,涉及读取CSV和JSON文件,处理不一致的特征向量大小并进行归一化。接着,加载边数据以构建图。通过`Data`对象创建同构图,之后数据被分为70%训练集和30%测试集。训练了两种模型:MLP和GCN。GCN在测试集上实现了80%的准确率,优于MLP的46%,展示了利用图信息的优势。
135 1
|
7月前
|
机器学习/深度学习 并行计算 PyTorch
【从零开始学习深度学习】20. Pytorch中如何让参数与模型在GPU上进行计算
【从零开始学习深度学习】20. Pytorch中如何让参数与模型在GPU上进行计算
|
8月前
|
PyTorch 算法框架/工具 异构计算
PyTorch 2.2 中文官方教程(十九)(1)
PyTorch 2.2 中文官方教程(十九)
151 1
PyTorch 2.2 中文官方教程(十九)(1)