MLP 实战
用 PyTorch 走完一次端到端 MLP 训练流程,并在同心圆数据集上与线性分类器正面对照。
端到端训练一个 MLP
前面四节依次介绍了多层感知机的四个核心组件: 全连接层、激活函数、反向传播、计算图与自动微分 。 本节将把这些组件组装成一个完整的 MLP, 用 PyTorch 在二维数据上完成一次端到端训练, 并与《分类模型训练》中的线性分类器进行对照。
训练流程包含五个步骤: 准备数据 → 定义模型 → 配置损失函数与优化器 → 运行训练循环 → 计算准确率 。 其中训练循环的代码结构与《分类模型训练》一节保持一致,下面逐步展开。
任务设定
本节继续使用《从线性到非线性》中的 同心圆 数据集: 输入为二维坐标,标签分为两类,内圈为一类、外圈为一类, 最优决策边界是一条闭合曲线。 线性分类器在该数据集上的准确率约为 50%(与随机猜测相当), 本节训练得到的 MLP 将与之形成对照。
数据采样沿用《从线性到非线性》中的实现—— 通过 torch.randn 生成径向噪声, 本节不再展开采样细节。
用 nn.Sequential 定义 MLP
《多层感知机》一节我们曾用 nn.Linear + 显式激活函数 手写 过一次前向传播, 目的是看清每一步的张量变化。工程实践中,更常见的做法是把这些层装到一个 容器 里,让它整体作为一个模型被调用——这就引出了 nn.Module 与 nn.Sequential 。
- nn.Module :PyTorch 中 所有模型 / 层 的基类。前面用过的 nn.Linear 、 nn.ReLU 其实都是 nn.Module 的子类——单层就是最小的 module
- nn.Sequential : nn.Module 的一个常用子类,按声明顺序把若干子 module 串成一条直线。 对外仍然是一个 nn.Module ,可以当作整体调用 model(x) ,省去手写 forward 的样板代码
下面用 nn.Sequential 定义一个 的 MLP,含 ReLU 激活:
nn.Sequential 适用于子模块按 线性堆叠 的网络结构, 本节定义的 MLP 即属于这种情况。 当模型需要在前向过程中插入更多控制(例如调试时打印中间张量,或后续课程中出现的更灵活的结构), 可以改为继承 nn.Module 并显式实现 forward 。
训练流程
从线性分类器切换到 MLP 时, 训练循环本身保持不变 , 被替换的只有 model 这一个对象。 损失函数计算、梯度清零、反向传播、参数更新这一组步骤, 与《分类模型训练》中训练 Softmax 分类器时使用的代码结构完全一致。
对照:线性分类器 vs MLP
在 同一份同心圆数据、同一套训练循环 下, 分别训练一个线性分类器和上一节定义的 MLP, 对比两者的网络结构、训练过程中的损失 / 准确率曲线, 以及最终学到的决策边界。
读图重点 :① 第一行的网络拓扑直观呈现两者的容量差距: 线性 只有一层 2 → 2 的权重直连, MLP 通过两层 16 维隐藏层把信号送到输出。 训练时连线粗细随权重大小同步变化。 ② 线性 的 loss 在前几个 epoch 后停在高位、不再下降,准确率稳定在约 50%; MLP 的 loss 持续下降直至接近 0,准确率单调上升至 99% 附近。 ③ 第三行决策面用背景色编码模型预测的类别概率(蓝 = 类 0 / 内圈,黄 = 类 1 / 外圈): 线性给出的是一条直线分界,无法分开两类同心圆; MLP 学出的是一条 包住内圈的闭合曲线 , 与样本分布高度吻合。
训练循环完全一致,但两个模型的最终结果差异显著。 原因在于两者的 假设空间 不同: 线性分类器只能表达直线决策面,无法拟合同心圆这类闭合边界; MLP 通过激活函数引入非线性,假设空间扩展到了包含闭合曲线, 因此能够学到将内圈与外圈分开的决策边界。
两个新问题
前一节的训练曲线在小规模数据上已收敛到接近理想的状态。 但当实验条件发生变化——例如样本量大幅增加,或网络容量增大并训练更长时间—— 当前的训练流程会暴露出两个新的问题。 本章后半段将分别围绕这两个问题展开。
问题 1:单步训练成本随数据量线性增长
上一节的训练循环在每个 epoch 中将 全部 N≈400 个样本 一次性输入模型,计算一次 loss 后反向传播。当样本数从 400 增加到数万乃至数十万时, 单个 epoch 的前向与反向开销会按比例上升,整体迭代速度显著降低。 一种常见的解决方式是每次仅使用一个小批样本估计梯度, 这种做法称为 批量训练 (mini-batch SGD)。
→ 下一课《批量训练》
问题 2:训练 loss 低,但预测准确率反而下降
当网络容量增大、训练轮数增加,训练集上的 loss 会持续下降直至接近 0。 但用未参与训练的样本进行预测时,准确率反而比小网络更低—— 模型在训练集上的误差与在新样本上的误差出现显著差距, 这种现象称为 过拟合 。
→ 后续 4 节课《训练验证测试集》《欠拟合与过拟合》《权重衰退》《Dropout》
至此,MLP 已经能在数据上完成一次完整的端到端训练。 本章后半段将围绕 训练效率、训练稳定性、模型泛化能力 三个方面继续展开。