【深度学习教程——01_深度基石(Foundation)】03_计算图是什么?PyTorch动态图机制解密

03_计算图是什么?PyTorch动态图机制解密

本章目标 :告别手算梯度!引入 PyTorch 的核心神经 ------ Autograd (自动微分) 系统。我们将看到 Tensor 如何自动记录历史,并一键计算所有梯度。


📖 目录

  1. 从手动挡到自动挡
  2. Tensor:不只是数组
  3. 动态图机制 (Dynamic Computational Graph)
  4. [实战:用 PyTorch 重写线性回归](#实战:用 PyTorch 重写线性回归)
  5. [关键细节:zero_grad 的必要性](#关键细节:zero_grad 的必要性)

1. 从手动挡到自动挡

上一章,我们手动推导了 L o s s = ( x ⋅ w − y ) 2 Loss = (x \cdot w - y)^2 Loss=(x⋅w−y)2 的梯度公式。

PyTorch 的出现,就是为了把我们带入**"自动挡"**时代。你只管写前向传播(怎么算 Loss),PyTorch 自动帮你算反向传播(怎么求梯度)。


2. Tensor:不只是数组

PyTorch 的核心数据结构是 Tensor。它看起来像 NumPy 的数组,但它多带了三个关键"挂件":

  1. data: 存储具体的数值。
  2. grad: 存储计算出来的梯度。
  3. grad_fn : 记录 "我是怎么来的" (比如通过乘法算出来的,记为 MulBackward)。

3. 动态图机制 (Dynamic Computational Graph)

PyTorch 采用的是 动态图 (Define-by-Run) 机制。

这意味着计算图不是预先定义好的(像 TensorFlow 1.x),而是在你运行代码的那一刻动态构建的

这意味着 :你可以用 Python 的 iffor 循环任意控制网络结构,PyTorch 都能照单全收。


4. 实战:用 PyTorch 重写线性回归

让我们把第1章的代码用 PyTorch 重写一遍。注意观察代码量的急剧减少。

python 复制代码
import torch

# 1. 准备数据
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# 2. 初始化权重 (这就是我们的 Model)
# 只要是模型参数,都需要 requires_grad=True
w = torch.tensor([1.0], requires_grad=True)

# 3. 前向传播函数
def forward(x):
    return x * w  # 这里的 * 是 Tensor 乘法,会自动构建计算图

# 4. 损失函数
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2

# 5. 训练循环
print("Predict (before training)", 4, forward(4).item())

for epoch in range(100):
    for x, y in zip(x_data, y_data):
        # A. 前向计算 Loss
        l = loss(x, y)

        # B. 【魔法步骤】反向传播
        l.backward() # 自动计算梯度存入 w.grad

        print(f"\tgrad: {x}, {y}, {w.grad.item():.2f}")

        # C. 更新权重
        # w.data 也就是只修改数值,不影响计算图
        w.data = w.data - 0.01 * w.grad.data

        # D. 【重要】清空梯度
        w.grad.data.zero_()

    print(f"Epoch: {epoch}, w={w.item():.3f}, loss={l.item():.3f}")

print("Predict (after training)", 4, forward(4).item())

5. 关键细节:zero_grad 的必要性

很多初学者容易栽在这里:为什么要 w.grad.data.zero_()

因为在 PyTorch 的设计中,.backward() 计算出的梯度是累加 (+=) 到 .grad 里的,而不是覆盖。

  • 这在 RNN 或者多任务学习中非常有用。
  • 但在普通的梯度下降中,我们需要的是"这一轮的梯度",所以必须把"上一轮的梯度"清零,否则 w 会跑飞。

➡️ 下一章:04_分类问题怎么解?逻辑回归与交叉熵的由来

相关推荐
智能交通技术3 分钟前
iTSTech:自动驾驶、无人机与机器人在物流中的协同应用场景分析 2026
人工智能·机器学习·机器人·自动驾驶·无人机
Learn Beyond Limits5 分钟前
循环神经网络的问题:梯度消失与梯度爆炸|Problems with RNNs: Vanishing and Exploding Gradients
人工智能·rnn·深度学习·神经网络·机器学习·自然语言处理·nlp
Swift社区21 分钟前
传统 App 架构,为什么不适合 AI 应用
人工智能·架构
ECT-OS-JiuHuaShan21 分钟前
硅基智能的本质:高维响应器
人工智能
码路飞22 分钟前
Java 25 发了但更让我兴奋的是这个:Spring AI 让 Java 调大模型终于不用手写 HTTP 了
java·人工智能·spring
LONGZETECH23 分钟前
新能源汽车维护仿真软件技术架构解析+ 教学落地实操
大数据·c语言·人工智能·架构·汽车·汽车仿真教学软件·汽车教学软件
墨染天姬34 分钟前
【AI】AutoResearch将一定程度上替代算法工程师
人工智能·算法
圣殿骑士-Khtangc39 分钟前
【论文精读】《Scaling Laws for Neural Language Models》解读:大模型缩放定律的核心秘密
人工智能·语言模型·自然语言处理·神经网络模型
慧知AI1 小时前
用OpenClaw的架构思路,我给公司搭了一套内部AI Agent系统,替代了3个外包岗位
人工智能
balmtv1 小时前
2026年Gemini 3 Pro技术拆解:深度推理、空间智能与Agentic系统的架构革命
人工智能·gpt·架构