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防过拟合 |
我个人习惯的做法是:
- 先从一个较小的宽度开始(比如32)
- 观察训练集和验证集的表现
- 如果欠拟合,逐步增大宽度(翻倍试试)
- 如果过拟合,减小宽度或加正则化
1.6 本实验的目标
通过这个实验,我们要搞清楚三件事:
- 宽度如何影响模型容量——从数学和实验两个角度
- 过拟合和欠拟合的边界在哪——什么宽度刚好合适
- 如何用实验验证理论——不靠猜,靠数据说话
说白了,就是让你亲手调一调宽度,亲眼看看模型是怎么从欠拟合走到过拟合的。这种体验,比看一百篇论文都管用。
记住:宽度不是越大越好,也不是越小越好。找到那个「刚好够用」的点,才是真本事。
下一章,我们会搭建实验环境,开始动手调宽度。到时候你会发现——原来过拟合和欠拟合,真的是一眼就能看出来的事。