📘 动手学深度学习 - 5.1 多层感知器(MLP)
5.1 多层感知器(MLP)
在前面的章节中,我们已经掌握了使用 softmax回归 训练简单线性分类器的基本方法。
现在,我们将目光转向更加复杂、功能更强大的模型类别 —— 深度神经网络,并从最经典的 多层感知器(MLP) 开始探索。
5.1.1 隐藏层
5.1.1.1 线性模型的局限性
线性模型假设输出是输入的简单加权求和,这种假设太过强硬。
例如:
-
贷款预测中,收入与还款概率的关系并不是严格线性。
-
体温预测健康,温度过高或过低都危险,这种关系是非单调的。
-
图像分类中,单个像素的亮度变化不足以描述复杂的对象结构。
因此,简单的线性仿射变换不足以建模复杂的现实世界。
理论理解
-
线性模型(如Softmax回归)假设输入和输出是简单的加权求和关系。
-
这种假设过于强硬,无法表达现实世界复杂的非线性关系:
-
贷款概率与收入的关系是非线性且饱和的。
-
健康状况与体温关系呈倒U型,而不是单调递增或递减。
-
图像分类(如猫狗识别)无法只靠单像素亮度变化建模。
-
因此,仅靠线性模型难以处理复杂特征交互和上下文依赖问题。
企业实战理解
-
百度广告CTR预估中发现,仅靠简单线性模型(如LR)无法捕捉复杂特征交互,因此引入了深度网络(如DeepFM)。
-
字节跳动抖音推荐系统,在早期曾用浅层线性模型,后转向深度学习(Deep Interest Network)建模复杂兴趣演化。
-
Google AutoML发展史上,早期也尝试过扩展特征线性模型,但最终转向非线性搜索空间(DNN+NAS)。
5.1.1.2 合并隐藏层
为了解决上述问题,我们引入隐藏层(Hidden Layer):
-
将输入先通过一层或多层隐藏层非线性变换
-
再通过输出层生成预测
这样的结构,就是所谓的 多层感知器(MLP)。
如图5.1.1所示,一个MLP由输入层、隐藏层和输出层组成,每一层之间是全连接。
理论理解
-
为了增强表达能力,引入了隐藏层(Hidden Layer)。
-
将输入经过一个或多个隐藏层非线性映射后,再输出结果。
-
这种结构称为多层感知器(MLP)。
-
隐藏层使得神经网络可以自动学习到抽象的中间表示(representation)。
企业实战理解
-
OpenAI GPT-系列模型中,Transformer block实际上可以看作复杂版的MLP(Self-Attention + FFN),堆叠隐藏层构建复杂理解能力。
-
NVIDIA在图像识别(如ImageNet挑战)中用ResNet,实质上也是堆叠大量隐藏层提高表达力。
-
华为MindSpore框架中,隐藏层堆叠是标准配置,以提升模型抽象与泛化能力。
5.1.1.3 从线性到非线性
如果我们只叠加仿射变换(线性变换+偏置),即使有很多层,本质上还是整体线性的。
为了真正增加模型的表达能力,我们需要在仿射变换后加上非线性激活函数。
常见做法是,在每一层仿射之后应用激活,如ReLU。
这样才能打破线性,构建真正强大的非线性映射,从而解决复杂模式识别问题。
理论理解
-
如果没有非线性,多个仿射变换叠加仍然是整体线性!
-
必须在仿射变换后加上非线性激活函数,如ReLU,才能打破线性,提升模型复杂性。
-
非线性是深度神经网络真正强大和必要的核心。
企业实战理解
-
Google DeepMind AlphaFold 在蛋白质结构预测中,通过多层带非线性的神经网络学习复杂空间关系。
-
字节跳动内容推荐中,MLP子网络每一层都加ReLU,确保信息通过复杂非线性变换提升模型辨别力。
-
Amazon AWS广告投放系统也用ReLU激活来堆叠隐藏层,提升对广告点击行为的建模能力。
5.1.1.4 通用近似器
理论上,只要隐藏层节点足够多,单隐藏层神经网络就可以逼近任何函数(通用近似定理)。
不过:
-
实际训练中,单层网络往往效率低下,需要巨量节点。
-
深层(多层)网络,能够更高效、更优雅地表示复杂函数。
因此,现代深度学习强调“更深”而不是“更宽”。
理论理解
-
理论上,单隐藏层网络只要节点足够多,就能逼近任何函数(通用近似定理)。
-
但实际中,单层网络:
-
需要非常多节点
-
参数量爆炸
-
训练困难
-
-
因此,深层(多层)网络比宽层(巨量神经元)更高效、更实际。
企业实战理解
-
OpenAI CLIP模型通过堆叠深层Transformer模块学习复杂的文本-图像对应关系。
-
Google BERT 也是典型的深层结构(12层Transformer),而非单层巨宽网络。
-
字节跳动西瓜视频内容理解也倾向于使用深而窄的网络设计,以便提高训练效率和部署速度。
5.1.2 激活函数
为了打破线性,我们在每一层使用激活函数(Activation Function),添加非线性。
5.1.2.1 ReLU 函数
ReLU(Rectified Linear Unit) 是目前应用最广的激活函数。
定义非常简单:
-
输入大于0,输出自身
-
输入小于0,输出0
特点:
-
简单高效
-
计算量小
-
缓解了早期神经网络中常见的梯度消失问题
ReLU的导数在正区间是1,负区间是0,0点处取左导数为0。
理论理解
-
ReLU(Rectified Linear Unit)是目前应用最广的激活函数。
-
定义简单:输出=max(0,x)
-
特点:
-
保留正数,抑制负数
-
计算简单
-
有效缓解梯度消失问题
-
-
ReLU使得训练深层神经网络变得可行,是深度学习崛起的重要因素。
企业实战理解
-
NVIDIA Megatron-LM超大模型中广泛使用ReLU激活,保持训练稳定性。
-
**Google Vision Transformer(ViT)**虽然本体是Transformer结构,但内部FFN也使用ReLU作为激活。
-
字节跳动AI Lab也大量使用ReLU构建轻量级和大型深度网络,兼顾性能与推理速度。
5.1.2.2 Sigmoid 函数
Sigmoid 将任意实数输入压缩到(0,1)之间,非常适合输出概率。
优点:
-
直观,与概率解释吻合
缺点:
-
大输入值下梯度接近0,容易导致梯度消失问题
-
训练深层神经网络时不稳定
因此,现在Sigmoid主要用于输出层(如二分类问题),很少用于隐藏层。
理论理解
-
Sigmoid将输入压缩到(0,1),适合做概率输出。
-
曾经在早期神经网络中流行,但存在:
-
梯度消失问题
-
饱和区间训练困难
-
-
现代神经网络中,Sigmoid主要用于输出层(如二分类),而不用于隐藏层。
企业实战理解
-
OpenAI GPT系列输出层中,少数特殊任务使用Sigmoid作为二分类概率预测。
-
Google Cloud ML服务中,在某些多标签分类任务上使用Sigmoid输出多概率。
-
华为MindSpore框架在二分类头部模块中仍保留Sigmoid激活选项。
5.1.2.3 Tanh 函数
Tanh(双曲正切) 也是一个压缩函数,但输出区间是(-1,1),中心对称于0。
特点:
-
输出是零均值,更利于优化
-
但同样在极端输入下梯度接近0,存在梯度消失问题
相比Sigmoid,Tanh稍微稳定一些,但在现代深度学习中仍常被ReLU取代。
理论理解
-
Tanh(双曲正切)把输入压缩到(-1,1),并且中心对称于0。
-
在Sigmoid基础上改进,适合某些需要零均值特性的任务。
-
但Tanh仍然存在梯度消失问题,训练深层网络效果不如ReLU。
企业实战理解
-
**OpenAI LSTM模型(如WaveNet生成器)**曾经广泛使用Tanh在循环神经网络中。
-
DeepMind RNN结构中也曾偏好Tanh以保证输出零均值。
-
但在现今主流CNN/Transformer领域,Tanh逐渐被ReLU类激活取代。
5.1.3 总结与讨论
通过引入隐藏层和激活函数,我们可以构建功能丰富、表达力强的深度网络。
总结本节要点:
-
隐藏层增加了模型的非线性表达能力。
-
激活函数是实现非线性的关键,ReLU因其简单高效成为主流。
-
多层神经网络可以模拟非常复杂的函数关系。
-
深度学习复兴的重要原因之一,就是激活函数(如ReLU)的改进。
值得注意的是,研究仍在继续,近年来还出现了如GELU、Swish等更先进的激活函数,进一步提升了深度网络的训练性能和效果。
理论理解
-
引入隐藏层+激活函数,是深度学习区别于传统机器学习的根本。
-
ReLU极大缓解了梯度消失问题,是深度学习复兴的关键。
-
激活函数的研究仍在继续,例如:
-
GELU(Gaussian Error Linear Unit)
-
Swish(x * sigmoid(x))
-
-
新的激活函数不断带来更快收敛速度和更高准确率。
企业实战理解
-
**Google BERT改进版(e.g., ALBERT)**使用GELU作为默认激活,取得更好效果。
-
NVIDIA在DLSS 3.5图像生成中,部分模块使用Swish替代ReLU提升视觉质量。
-
OpenAI GPT-4内部自定义了类似Swish变体的激活函数,以优化大规模训练稳定性。
🎯 小结表
关键点 | 内容 |
---|---|
为什么引入隐藏层 | 打破线性限制,学习复杂模式 |
多层感知器(MLP) | 输入 → 隐藏层(非线性)→ 输出 |
常见激活函数 | ReLU、Sigmoid、Tanh |
深度网络表达力 | 更深通常比更宽更有效 |