共计 1472 个字符,预计需要花费 4 分钟才能阅读完成。
认识 BP 神经网络与过拟合
BP 神经网络通过反向传播算法调整权重,实现从输入到输出的复杂映射。过拟合的典型表现是:模型在训练集上准确率极高(比如 98%),但在测试集上表现骤降(如 70%),就像学生死记硬背考题却不会举一反三。

过拟合三大诱因的数学本质
-
数据量不足
当训练样本数 N 远小于权重参数数量 W 时,模型容易记住噪声而非规律。数学上表现为损失函数 $L = \frac{1}{N}\sum_{i=1}^N (y_i – \hat{y}i)^2$ 在训练集上收敛到极小值,但泛化误差 $E$ 依然很大。 -
网络复杂度过高
隐藏层神经元过多时,模型容量超过必要程度。用 VC 维度理论解释:假设网络有 d 个可调参数,其 VC 维约为 $O(d\log d)$,过高的 VC 维会导致泛化间隙(Generalization Gap)增大。 -
噪声数据干扰
标签错误或异常样本会误导权重更新。设噪声比例为 $\epsilon$,则梯度更新公式 $\Delta w = -\eta\frac{\partial L}{\partial w}$ 中约有 $\epsilon$ 比例的梯度方向是错误的。
解决方案对比
| 方法 | 实现难度 | 计算开销 | 适用场景 |
|---|---|---|---|
| L2 正则化 | ★★☆ | +5%~10% | 特征相关性强的结构化数据 |
| Dropout | ★☆☆ | 基本不变 | 全连接层居多的网络 |
| Early Stopping | ★☆☆ | 可忽略 | 训练曲线有明显拐点的情况 |
Keras 实战代码
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import ReduceLROnPlateau
model = Sequential([Dense(512, activation='relu', input_shape=(784,)),
Dropout(0.5), # 随机屏蔽 50% 神经元
Dense(256, activation='relu'),
Dropout(0.3), # 注意逐层降低 dropout 率
Dense(10, activation='softmax')
])
# 动态学习率调整
reduce_lr = ReduceLROnPlateau(
monitor='val_loss',
factor=0.2, # 学习率乘以 0.2
patience=3, # 连续 3 轮不改善触发
min_lr=1e-6
)
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
history = model.fit(
x_train, y_train,
validation_split=0.2,
batch_size=128, # 与 dropout 率协同调整
epochs=50,
callbacks=[reduce_lr]
)
调参避坑指南
- 正则化系数 λ 选择
- 先用网格搜索尝试 [0.001, 0.01, 0.1] 等典型值
-
观察验证集损失,选择使 Loss 下降但不过度平滑的值
-
Batch Size 与 Dropout 的协同
- 大 Batch Size(如 256)需配合更高 Dropout 率(0.5~0.7)
-
小 Batch Size(如 32)可用较低 Dropout 率(0.2~0.3)
-
验证损失震荡对策
- 先降低学习率(除以 5~10)
- 增加 Batch Size(至少翻倍)
- 检查数据 shuffle 是否充分
延伸思考
在小样本场景下,可以结合以下数据增强策略:
– 图像:旋转 / 翻转 / 添加高斯噪声
– 文本:同义词替换 / 回译 / 随机插入
– 时序数据:窗口切片 / 添加抖动
这种组合方案能有效扩充数据多样性,从根源上缓解过拟合。
正文完
