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_()
相关推荐
10年前端老司机1 分钟前
RAG 检索效果量化测评落地:完整流程、指标实现与踩坑总结
人工智能·llm·aigc
武子康2 分钟前
权重装进了 24 GiB,四路 32K 上下文还装得下吗?
人工智能·llm·agent
Python私教2 分钟前
DeepSeek本地部署Ollama+知识库,附3个报错解决
人工智能·llm·deepseek
知几蜗牛2 分钟前
工具还在跑,AI为什么还能继续说?看懂多模态异步事件流
人工智能
天天被压力2 分钟前
【Python 量化取数指南 #13】Python 把行情落库:sqlite 一键存,回测随用随取
java·人工智能·python
天天被压力2 分钟前
【Python 量化取数指南 #14】Python 清洗行情数据:复权停牌对齐,回测不翻车
java·人工智能·python
冬奇Lab2 分钟前
LLM 自动化测试系列(04):Web UI 自动化——Midscene 的视觉驱动脚本化
人工智能·测试
Python私教2 分钟前
Python环境配置:conda+PyCharm+换源,附6个坑
人工智能·python·pycharm
大白话AI2 分钟前
揭秘 Auto Mode 安全分类器
人工智能
知几蜗牛3 分钟前
模型后训练别一上来就凭感觉打分:奖励顺序比阶段数量更重要
人工智能