第 4 章 深度学习多层感知机过拟合

多层感知机:非线性与泛化

本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 4 章《多层感知机》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。

本章讲什么

上一章的线性模型有个根本局限:它假设输出随输入单调变化。但真实世界充满了非单调的关系——体温和死亡率是倒 U 形(37℃ 两侧风险方向相反),图像分类更是如此("这只猫"取决于像素的组合,而不是单个像素的强度)。本章的**多层感知机(MLP)**通过叠加多个层并引入非线性,打破了这一限制。

同时,模型变复杂会带来一个新问题:过拟合——模型记住了训练数据,却没有真正学会规律。本章后半部分深入讨论泛化、正则化(权重衰减、Dropout)、反向传播和数值稳定性。

为什么需要激活函数

一个关键的数学事实是:如果层与层之间只做线性变换,那么"多个线性层的叠加"本质上还是线性变换——无论叠多少层,都等价于一个单层线性模型。白加了层数。

所以,必须在每层线性变换之后施加一个非线性激活函数。这才是网络获得真正表达力的来源。

通用近似定理保证了:足够宽的单隐藏层网络可以逼近任意函数。但实践中,"更深而不是更宽"的网络更容易逼近复杂函数——这就是深度学习"深"的意义。

三种经典激活函数:

  • ReLU(修正线性单元):max(x, 0),输入为正就是它本身,为负就是 0。导数只有 0 和 1,优化友好,还能缓解梯度消失。它是最流行的激活函数。
  • sigmoid:把任意输入"挤压"到 (0,1) 之间,是可微的阈值单元近似。如今主要用于输出层表示二分类概率。
  • tanh:把输入压到 (-1,1),关于原点中心对称。

过拟合与欠拟合

训练模型时,我们真正关心的是泛化——模型在没见过的数据上表现好,而不是记住训练数据。

两个关键概念:

  • 训练误差:模型在训练集上的误差。
  • 泛化误差:模型在真实分布(无穷样本)上的期望误差。现实中无法精确计算,只能用独立的测试集来估计。

由此定义两个问题:

  • 过拟合:模型在训练数据上拟合得比在真实分布上更好——训练误差远低于测试误差。就像学生死记硬背了往年考题的答案(模拟考很好),却没理解原理(期末考失败)。
  • 欠拟合:模型表达能力不足,连训练误差都降不下去。

判断方法:训练和验证误差都高且差距小 → 欠拟合;训练误差远低于验证误差 → 过拟合。

影响泛化的三个因素:可调参数的数量(自由度)、参数取值的大小、训练样本的数量。

模型选择有个重要纪律:调参必须用验证集,绝不能碰测试集(否则会"过拟合测试数据")。数据稀缺时可以用 K 折交叉验证:把数据分成 K 份,轮流拿一份做验证,取平均误差。

监督学习有个根基假设:训练和测试数据独立同分布(i.i.d.)。现实中这个假设经常被违背,后面会讨论。

权重衰减:惩罚大参数

限制模型的复杂度,除了减少特征数量(太生硬),更精细的办法是正则化——在损失函数里加一个惩罚项,让参数不要太大。

权重衰减(即 L2 正则化)的核心思想是:用"函数与零函数的距离"来衡量复杂度(零函数最简单)。做法是把权重向量长度的平方作为惩罚项加进损失函数:总损失 = 拟合损失 + λ × 权重平方和。这里的正则化常数 λ 控制"拟合数据"和"保持简单"的权衡——λ 越大,权重被压得越狠。

为什么用 L2 而不是 L1?L2 对大分量惩罚重,倾向于把权重均匀分配到众多特征上,对应经典的岭回归;L1 会把一部分权重直接清成零,做特征选择,对应套索回归(Lasso)

从更新公式看,权重衰减相当于每一步更新都把权重往零方向收缩一点——名字就是这么来的。

Dropout:随机丢弃神经元

另一种正则化思路来自一个观察:好模型应该是平滑的——对输入的微小扰动不敏感。如果给输入加一点噪声训练,模型就会变得更平滑。

Dropout(暂退法)把这个思路推广到网络内部:训练时按概率 p 随机把一些神经元的输出置零。每次训练相当于用一个更小的、不同的子网络。这样做破坏了共适应性——各层过度依赖前层某些特定激活值的倾向——迫使网络把权重分散到多个特征上,学到更鲁棒的表征。原始论文用"有性繁殖"做类比:有性生殖会破坏共适应的基因组合,Dropout 破坏神经元的共适应性。

为了不改变期望,保留的神经元要除以 (1-p) 做缩放。测试时不用 Dropout。实践技巧:靠近输入的层用较小的丢弃概率(如 0.2),深层用较大的(如 0.5)。

反向传播:梯度是怎么算出来的

前面反复说"计算梯度",但梯度到底怎么算?答案是反向传播(backpropagation)

  • 前向传播:按输入到输出的顺序,计算并存储每层的结果。
  • 反向传播:根据微积分链式法则,按相反的顺序(输出到输入)遍历网络,计算每个参数的梯度。

关键机制是:反向传播复用前向传播存储的中间值,避免重复计算。这解释了为什么训练比预测占用更多内存——中间值和层数、批量大小成正比,所以大批量、深网络容易内存不足。

在自动微分出现之前,研究人员要手工推导所有导数,论文里花大量篇幅写更新规则。现在这一切都由框架自动完成。

数值稳定性与初始化

训练深层网络,梯度是很多矩阵连乘的结果。连乘有个危险:特征值小于 1 的项指数级衰减(梯度消失,参数几乎不动、模型学不动),大于 1 的项指数级放大(梯度爆炸,更新过大、无法收敛)。

sigmoid 是梯度消失的元凶之一:输入远离 0 时导数趋近 0,多层连乘后梯度被"切断"。这正是 ReLU 取代它的现实原因。

另一个问题是参数对称性:如果隐藏单元初始化成相同值,它们的前向激活、反向梯度都相同,网络永远无法打破对称,退化成单个单元。所以随机初始化是必须的。

由此引出 Xavier 初始化:让权重方差取一个合适的值,使得前向传播的输出方差和反向传播的梯度方差都不随层数变化。虽然推导中有"无非线性"的理想假设,但 Xavier 在实践中被证明非常有效。

环境和分布偏移

训练时用的分布和部署时遇到的分布可能不一样,模型会灾难性失败。更隐蔽的是,模型决策本身还会反过来改变数据分布,形成反馈循环

三类典型的分布偏移:

  • 协变量偏移:输入分布变了,但"输入→标签"的规律没变。比如训练用的是真实照片,测试时遇到卡通图。
  • 标签偏移:标签的分布变了,但"标签→输入"的规律没变。比如某种疾病的流行率随时间变化。
  • 概念偏移:标签的定义本身变了。比如精神疾病的诊断标准变了,"软饮"在不同地区叫法不同。

书中有个发人深省的例子:贷款模型发现穿牛津鞋的人还款率高,于是开始只给穿牛津鞋的人放贷——结果顾客全都改穿牛津鞋,但信用并没有提升。模型改变了环境,也破坏了自己赖以训练的数据分布。

分布偏移的纠正很困难,现实中的务实做法是持续用新数据更新模型。这个问题也引出部署 AI 的伦理议题:公平性、责任,以及预测性警务可能失控的反馈循环。

小结

  • 多层感知机通过堆叠层并施加非线性激活函数,打破了线性模型的单调性限制。
  • 过拟合是模型记住了训练数据、无法泛化;欠拟合是模型表达能力不足。
  • 权重衰减在损失中惩罚大参数,Dropout 随机丢弃神经元,都是对抗过拟合的正则化方法。
  • 反向传播用链式法则沿网络反向计算梯度,复用前向中间值。
  • 梯度消失/爆炸来自多层连乘;随机初始化和 Xavier 初始化是训练深网络的必要手段。
  • 训练分布和部署分布不一致会导致模型失败,甚至形成反馈循环。

关键术语

术语 一句话解释
多层感知机(MLP) 含一个或多个隐藏层并施加激活函数的网络
激活函数 线性变换后的非线性运算,表达力的来源
ReLU / sigmoid / tanh 三种经典激活函数
过拟合 / 欠拟合 记住训练数据 / 表达能力不足
泛化误差 模型在真实分布上的期望误差
K 折交叉验证 数据分 K 份轮流验证,取平均误差
权重衰减 / L2 正则化 在损失中加权重平方和惩罚项
岭回归 / 套索回归 L2 正则化的回归 / L1 正则化的回归
Dropout 训练时随机丢弃神经元的正则化方法
反向传播 用链式法则从输出到输入计算梯度
梯度消失 / 梯度爆炸 多层连乘导致梯度衰减 / 放大
Xavier 初始化 让各层方差稳定、不随层数缩放的初始化
分布偏移 训练与部署分布不一致
协变量 / 标签 / 概念偏移 输入分布 / 标签分布 / 标签定义发生变化