backward怎么计算的是torch.tensor(2.0, requires_grad=True)变量的梯度

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim

# 一个参数 w = 2
w = torch.tensor(2.0, requires_grad=True)
# 预测值
y_pred = w * 3  # 6
# 真实值
y_true = torch.tensor(10.0)
# 损失 = (预测 - 真实)^2
loss = (y_pred - y_true) ** 2  # (6-10)^2 = 16

loss.backward()  # 反向传播

print(w.grad)  # 打印梯度

因为requires_grad=True,有了这个标记,loss就会把w看作参数,loss.backward就会求梯度,并保存到w.grad中

保存到w.grad中怎么实现的?python哪怕不输入w,也可以修改w的参数

python 复制代码
class Param:
    def __init__(self, value):
        self.value = value
        self.grad = 0

# 可变对象,保存梯度
w = Param(2.0)

# 定义 loss 函数,直接用 w
def compute_loss():
    y_pred = w.value * 3
    y_true = 10
    loss = (y_pred - y_true) ** 2
    return loss

# 反向传播模拟
def backward(loss):
    # 直接访问 w 对象,修改 w.grad
    w.grad = 2 * 3 * (w.value*3 - 10)  

loss = compute_loss()
backward(loss)
print(w.grad)  # 24

自定义的类想要直接计算乘法需要写函数

python 复制代码
class Param:
    def __init__(self, value):
        self.value = value

    def __mul__(self, other):
        return self.value * other   # 定义 w * 3 的行为

    def __rmul__(self, other):
        return other * self.value   # 定义 3 * w 的行为

w = Param(2.0)
print(w * 3)   # 输出 6.0
print(3 * w)   # 输出 6.0

更新参数也不用传入该参数

python 复制代码
    # 用梯度更新参数 w
    with torch.no_grad():  # 禁止 autograd 跟踪
        w -= lr * w.grad   # w = w - lr * grad

    # 梯度用完要清零,不然会累积
    w.grad.zero_()
相关推荐
l1t1 小时前
利用DeepSeek辅助WPS电子表格ET格式分析
人工智能·python·wps·插件·duckdb
plusplus1681 小时前
边缘智能实战手册:攻克IoT应用三大挑战的AI战术
人工智能·物联网
果粒橙_LGC2 小时前
论文阅读系列(一)Qwen-Image Technical Report
论文阅读·人工智能·学习
Seeklike2 小时前
diffuxers学习--AutoPipeline
人工智能·python·stable diffusion·diffusers
CoovallyAIHub2 小时前
为高空安全上双保险!无人机AI护航,YOLOv5秒判安全带,守护施工生命线
深度学习·算法·计算机视觉
杨过过儿2 小时前
【Task01】:简介与环境配置(第一章1、2节)
人工智能·自然语言处理
小妖同学学AI2 小时前
deepseek一键生成word和excel并一键下载
人工智能·word·excel·deepseek
黎燃3 小时前
AI助力垃圾分类与回收的可行性研究:从算法到落地的深度解析
人工智能
强盛小灵通专卖员3 小时前
DL00291-联邦学习以去中心化锂离子电池健康预测模型完整实现
人工智能·机器学习·深度强化学习·核心期刊·导师·小论文·大论文