前向传播
使用当前参数从输入逐层计算预测,不更新参数。
学习目标
- 固定两层权重追踪中间结果
- 只调用 model(x) 会改变参数吗?
- 说明:前向输出正确不代表模型已经学会任务,也不代表参数已经更新。
为什么需要这个概念
前向传播是从输入出发,依次执行层运算得到输出的过程。它可能记录供反向传播使用的计算图,但本身不执行参数更新。
学习前需要掌握
背景与问题
训练前必须先回答一个确定的问题:给定这批输入和当前参数,模型到底会预测什么。前向传播按网络连接顺序计算中间表示,是计算损失和梯度的前提。
概念定义
前向传播是从输入出发,依次执行层运算得到输出的过程。它可能记录供反向传播使用的计算图,但本身不执行参数更新。
直观理解
可以把每一层当作带形状约定的工序。前一层交付的张量既要有正确数值,也要有下一层接受的维度;最终输出的含义由任务头决定。
核心原理
在线性层中,输入末维与 in_features 匹配,输出末维换成 out_features。以批量输入为例, 乘以权重转置后变成 ,偏置在 batch 维广播。激活再逐元素变换这个表示。
同一个模型在 train 和 eval 模式都会执行前向;Dropout、BatchNorm 等层会按模式采取不同计算。eval 不会自动关闭梯度,而 no_grad 或 inference_mode 控制的是是否跟踪计算。
前向成功只说明这一批运算能够完成。输出可能因广播、标签顺序或错误归一化而语义错误,因此需要检查若干可手算样本,不能只看程序没有报错。
数学表达
核心公式
前向传播是从输入出发,依次执行层运算得到输出的过程。它可能记录供反向传播使用的计算图,但本身不执行参数更新。
变量含义
x模型输入ŷ当前参数产生的预测
计算步骤
- 1第一层得到 (0,1)。
- 2ReLU 后仍为 (0,1)。
- 3第二层求和得到 1。
代码对应位置
示例 1固定两层权重追踪中间结果的最小验证:使用完整构造输入核对固定两层权重追踪中间结果,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
x | 模型输入 |
ŷ | 当前参数产生的预测 |
完整数值示例
固定两层权重追踪中间结果
已知条件
- 输入一条样本为 (1,2)
- 第一层两行权重为 (1,-1)、(2,0),偏置为 (1,-1)
- 第二层把两个隐藏值相加
计算步骤
- 第一层得到 (0,1)。
- ReLU 后仍为 (0,1)。
- 第二层求和得到 1。
计算结果
中间张量为 (1,2),最终输出张量为 (1,1),数值为 1。
处理前后对比
- 前向输出正确不代表模型已经学会任务,也不代表参数已经更新。
案例推演与判断
这里第一个隐藏单元的原始分数是 1−2+1=0,第二个是 2×1−1=1。逐个打印这些值,可以把“输入有误”“权重朝向有误”“激活位置有误”分别定位,而不是只盯最终损失。
如果目标是三分类,应把末层改为三个 logits,并重新明确标签含义;不能把一个实数输出直接解释成三类概率。无论任务如何,只有后续调用 backward 和优化器 step 才会训练参数。
计算与实现步骤
- 第一层得到 (0,1)。
- ReLU 后仍为 (0,1)。
- 第二层求和得到 1。
代码实现
示例 1
固定两层权重追踪中间结果的最小验证
example_01.py用途:使用完整构造输入核对固定两层权重追踪中间结果,输出只表示本例计算。
import torch
x = torch.tensor([[1., 2.]])
w1 = torch.tensor([[1., -1.], [2., 0.]])
b1 = torch.tensor([1., -1.])
h = torch.relu(x @ w1.T + b1)
y = h @ torch.ones(2, 1)
print("hidden:", h.tolist())
print("output:", y.tolist())代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对固定两层权重追踪中间结果,输出只表示本例计算。
y- 目标标签或连续目标值。
Step 1 · 1–8 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
x = torch.tensor([[1., 2.]])
w1 = torch.tensor([[1., -1.], [2., 0.]])
b1 = torch.tensor([1., -1.])
h = torch.relu(x @ w1.T + b1)
y = h @ torch.ones(2, 1)
print("hidden:", h.tolist())
print("output:", y.tolist())预期输出或运行结果
hidden: [[0.0, 1.0]] output: [[1.0]]
常见错误 · 3 条
- 直接调用 model.forward
- 认为前向会更新参数
- 设备不一致
实际应用
- 检查模型每层输入输出
- 保存模型后比较推理一致性
常见错误
- 直接调用 model.forward
- 认为前向会更新参数
- 设备不一致
常见问题
只调用 model(x) 会改变参数吗?
普通层不会因此执行梯度更新;但训练模式的 BatchNorm 会更新统计 buffer,带状态模块也可能改变内部状态。
这个示例能说明什么边界?
前向输出正确不代表模型已经学会任务,也不代表参数已经更新。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。