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_()
相关推荐
JJJJ_iii3 分钟前
【机器学习07】 激活函数精讲、Softmax多分类与优化器进阶
人工智能·笔记·python·算法·机器学习·分类·线性回归
Pocker_Spades_A8 分钟前
机器学习之生成对抗网络(GAN)
人工智能·深度学习·生成对抗网络
IT_陈寒11 分钟前
Python性能优化:5个被低估但效果惊人的内置函数实战解析
前端·人工智能·后端
北堂飘霜19 分钟前
新版简小派的体验
人工智能·求职招聘
Theodore_102235 分钟前
机器学习(2) 线性回归和代价函数
人工智能·深度学习·机器学习·线性回归·代价函数
新子y40 分钟前
【小白笔记】关于 Python 类、初始化以及 PyTorch 数据处理的问题
pytorch·笔记·python
Akamai中国1 小时前
运维逆袭志·第4期 | 安全风暴的绝地反击 :从告警地狱到智能防护
运维·人工智能·云计算·云服务·云存储
ygwelcome1 小时前
如何使用最简单的get请求融合众多AI API,包括ChatGPT、Grok等
人工智能
努力也学不会java1 小时前
【Spring】Spring事务和事务传播机制
java·开发语言·人工智能·spring boot·后端·spring