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_()
相关推荐
IT_陈寒17 分钟前
Redis持久化丢失数据的坑,这次终于被我填平了
前端·人工智能·后端
树獭非懒2 小时前
从零构建ReAct智能体:让AI学会边想边做
人工智能·llm·agent
冬奇Lab12 小时前
Workflow 系列(04):Multi-Agent 协调——编排器边界、并发控制与上下文隔离
人工智能·工作流引擎
冬奇Lab12 小时前
每日一个开源项目(第147篇):HyperGraphRAG - 用超图表示 N 元关系,RAG 的第三代范式
人工智能·开源·graphql
甲维斯13 小时前
Github + 阿里云oss实现类似codex的自动更新!
人工智能
阿里云大数据AI技术15 小时前
光轮智能 × 阿里云:共建 Physical AI 云上数据、评测与持续学习基础设施
人工智能·机器学习
机器之心15 小时前
实锤了:Claude Code偷查用户,时区、中国AI实验室全是关键词
人工智能·openai
网易云信15 小时前
Cursor点燃个人开发者,企业级AI为何频频受挫?Agent工厂从提效工具到AI员工的跃迁
人工智能·开源