共计 1265 个字符,预计需要花费 4 分钟才能阅读完成。
BP 神经网络通过反向传播算法调整权重,实现从输入到输出的复杂映射。但训练时经常遇到这种情况:模型在训练集上准确率高达 99%,测试集却只有 70%——这就是典型的过拟合现象。简单来说,模型把训练数据的噪声和细节也记住了,导致泛化能力变差。

过拟合的三大元凶
-
数据量不足
当训练样本数 $n$ 远小于参数数量 $W$ 时(即 $n \ll W$),模型容易记住所有样本。从数学上看,这使得损失函数 $J(θ)$ 有无数解,模型会选择最「精确」但最没用的那个。 -
网络复杂度过高
隐藏层神经元过多时,模型的 VC 维(衡量复杂度的指标)会急剧上升。举个例子,用 10 层网络拟合 MNIST 数字分类,就像用显微镜看报纸——连纸张纤维都成了「特征」。 -
噪声数据干扰
标签错误或异常值会导致模型学习到虚假规律。比如猫狗分类数据集中混入几张模糊图片,模型可能把「模糊度」当成判别依据。
解决方案横向对比
| 方法 | 实现难度 | 计算开销 | 适用场景 |
|---|---|---|---|
| L2 正则化 | ★★☆ | +5%~10% | 特征维度高且稀疏时 |
| Dropout | ★☆☆ | 几乎为零 | 全连接层居多的网络 |
| Early Stopping | ★☆☆ | 节省训练 | 验证集曲线明显上升时 |
Keras 实战示例
from keras.layers import Dropout
from keras.callbacks import ReduceLROnPlateau
model = Sequential([Dense(512, activation='relu', input_shape=(784,)),
Dropout(0.5), # 随机屏蔽 50% 神经元
Dense(10, activation='softmax')
])
# 当验证 loss 连续 3 次不下降时,学习率减半
reduce_lr = ReduceLROnPlateau(
monitor='val_loss',
factor=0.5,
patience=3,
verbose=1
)
model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit(X_train, y_train,
validation_split=0.2,
callbacks=[reduce_lr])
调参避坑指南
-
正则化系数 λ 选择
推荐从 0.001 开始尝试,观察验证集 loss 变化。如果训练 / 验证差距仍然大,每次乘以 10 调整;如果模型欠拟合,则除以 10。 -
Batch Size 与 Dropout 的默契
大批量训练(如 batch=256)时,Dropout 率要适当降低(建议 0.3~0.5);小批量(batch=32)则可提高到 0.5~0.7。 -
验证损失震荡怎么办
先检查学习率是否过大,然后尝试: - 增加 Batch Size
- 添加梯度裁剪(clipnorm=1.0)
- 换用带动量的优化器(如 Nesterov Adam)
思考延伸
当遇到医疗影像这类小样本数据时,单纯的 Dropout 可能不够。这时候可以结合旋转 / 平移等数据增强(Data Augmentation),甚至用 GAN 生成合成数据——但这又会带来新的问题:如何避免生成数据的偏差影响模型?留给读者在实践中探索。
