1、实验背景与目标:为什么关注宽度?过拟合与欠拟合的直观理解

说实话,我第一次接触MLP(多层感知机)时,最困惑的就是中间层的宽度该怎么设。

设小了,模型学不动。设大了,又怕它死记硬背。我踩过不少坑,今天咱们就聊聊这个宽度到底在搞什么鬼。

1.1 宽度是什么?

先明确概念。MLP的中间层宽度,说白了就是那一层里神经元的个数。

比如一个三层的MLP:输入层→隐藏层→输出层。隐藏层的神经元数量,就是宽度。

# 一个简单的MLP示例
import torch.nn as nn

model = nn.Sequential(
    nn.Linear(10, 64),   # 输入10维,隐藏层宽度64
    nn.ReLU(),
    nn.Linear(64, 1)     # 输出1维
)

上面这个模型,隐藏层宽度就是64。你可能会问:为什么是64?不是32?不是128?

嗯,这个问题我当年也问过自己。

1.2 宽度与模型容量的关系

宽度越大,模型的容量就越大。容量是什么?就是模型能记住多少种模式的能力。

我习惯用一个比喻来理解:

  • 窄的隐藏层 = 一个只有3个抽屉的柜子
  • 宽的隐藏层 = 一个有100个抽屉的柜子

柜子抽屉越多,能装的东西就越多。但问题来了——

如果数据里只有5种规律,你却给了100个抽屉。模型会干嘛?它会用多余的抽屉去装噪声、装随机波动。这就是过拟合。

反过来,如果数据里有50种规律,你只给了3个抽屉。模型装不下,只能硬挤。结果就是欠拟合。

核心观点:宽度控制着模型的表达能力。太窄学不到,太宽容易背。

1.3 过拟合的直观理解

我在项目中遇到过这样一个案例:

做一个房价预测,训练集只有200个样本。我一开始用了宽度512的隐藏层。结果训练集误差降到0.001,测试集误差却高达0.5。

为什么会这样?

模型把每个训练样本的细节都记住了——包括那套房子的门牌号、邻居家的狗叫不叫。这些跟房价没关系啊!

过拟合的表现:

  • 训练集表现极好,测试集表现差
  • 损失曲线:训练损失一直降,验证损失先降后升
  • 模型参数变得很大,权重分布很散

我曾经犯过的错:看到训练损失还在下降,就以为模型还在变好。其实验证损失早就开始反弹了。记住:验证集才是你的真朋友。

1.4 欠拟合的直观理解

欠拟合就简单了——模型太笨,学不动。

还是那个房价预测的例子。我把宽度改成4,训练了100轮。结果训练误差0.8,测试误差0.82。两者差不多,但都很大。

这说明什么?模型连训练集都没学好。

欠拟合的表现:

  • 训练集和测试集表现都差
  • 损失曲线:训练损失降不下去,卡在一个较高的值
  • 模型预测结果往往偏向均值,缺乏变化

一个小技巧:如果你发现训练损失和验证损失差不多,但都很大。先别急着调正则化,先试试增大模型宽度或深度。

1.5 宽度选择的经验法则

你想想看,有没有一个万能公式能直接算出最佳宽度?

很遗憾,没有。但我可以分享一些经验:

数据量 任务复杂度 建议宽度范围 我的备注
小(<1k) 简单 16-64 优先用小宽度,配合正则化
中(1k-10k) 中等 64-256 可以尝试不同宽度对比
大(>10k) 复杂 256-1024 注意加Dropout防过拟合

我个人习惯的做法是:

  1. 先从一个较小的宽度开始(比如32)
  2. 观察训练集和验证集的表现
  3. 如果欠拟合,逐步增大宽度(翻倍试试)
  4. 如果过拟合,减小宽度或加正则化

1.6 本实验的目标

通过这个实验,我们要搞清楚三件事:

  • 宽度如何影响模型容量——从数学和实验两个角度
  • 过拟合和欠拟合的边界在哪——什么宽度刚好合适
  • 如何用实验验证理论——不靠猜,靠数据说话

说白了,就是让你亲手调一调宽度,亲眼看看模型是怎么从欠拟合走到过拟合的。这种体验,比看一百篇论文都管用。

记住:宽度不是越大越好,也不是越小越好。找到那个「刚好够用」的点,才是真本事。

下一章,我们会搭建实验环境,开始动手调宽度。到时候你会发现——原来过拟合和欠拟合,真的是一眼就能看出来的事。