多层感知机(MLP)入门:从感知机到深度神经网络的关键一步
多层感知机(MLP)入门:从感知机到深度神经网络的关键一步
在深度学习的发展历程中,多层感知机(MLP)是从 “简单线性模型” 迈向 “复杂非线性模型” 的里程碑 —— 它通过引入 “隐藏层” 和 “激活函数”,解决了感知机无法处理的线性不可分问题,成为现代神经网络(如 CNN、Transformer)的基础架构。今天我们从经典感知机讲起,拆解多层感知机的核心逻辑、激活函数、训练方法,帮你理解 “深度” 如何赋予模型更强的表示能力。
一、感知机:深度学习的 “单细胞” 原型
感知机是 1957 年由 Frank Rosenblatt 提出的最简单神经网络模型,它模拟生物神经元的工作方式:接收输入信号,通过权重和偏置计算总和,再用激活函数输出结果。
1. 感知机的基本结构与数学表达
一个简单的感知机包含 3 个部分:
- 输入层:接收 d 个特征(如\(x_1, x_2\));
- 权重与偏置:权重\(w_1, w_2\)控制输入信号的重要性,偏置b调整神经元的激活难度;
- 激活函数:常用 “阶跃函数”,将输入总和转换为二分类输出(0 或 1)。
数学公式为:
\(y = \begin{cases} 0 & (b + w_1x_1 + w_2x_2 \leq 0) \\ 1 & (b + w_1x_1 + w_2x_2 > 0) \end{cases}\)
例如,输入\(x_1=1, x_2=1\),权重\(w_1=0.5, w_2=0.5\),偏置\(b=-0.7\),则总和为\(0.5×1 + 0.5×1 - 0.7 = 0.3 > 0\),输出\(y=1\)。
2. 感知机的应用:实现简单逻辑电路
感知机可以直接模拟“与门”“或门”“与非门”等基础逻辑电路,只需调整权重和偏置:
- 与门:仅当两个输入都为1时输出1。 示例参数:\(w_1=0.5, w_2=0.5, b=-0.7\)(验证:\(x_1=1,x_2=1\)时总和=0.3>0→输出1;\(x_1=1,x_2=0\)时总和=-0.2≤0→输出0)。
- 或门:只要有一个输入为1就输出1。 示例参数:\(w_1=0.5, w_2=0.5, b=-0.3\)(验证:\(x_1=1,x_2=0\)时总和=0.2>0→输出1)。
- 与非门:与“与门”相反,两个输入都为1时输出0。 示例参数:\(w_1=-0.5, w_2=-0.5, b=0.7\)(验证:\(x_1=1,x_2=1\)时总和=-0.3≤0→输出0)。
3. 感知机的致命局限:无法处理线性不可分问题
感知机的输出是“线性决策边界”(二维空间中的直线、三维空间中的平面),只能处理“线性可分”的数据。但面对“异或门”这样的线性不可分问题,感知机完全失效:
- 异或门真值表:\(x_1=0,x_2=0\)→0;\(x_1=1,x_2=0\)→1;\(x_1=0,x_2=1\)→1;\(x_1=1,x_2=1\)→0。
- 问题本质:找不到一条直线能将“输出1”和“输出0”的样本完全分开(如下图,红色点为输出1,蓝色点为输出0,无法用直线分割)。
正是这个局限,导致感知机在20世纪60年代陷入低谷——而解决这个问题的关键,就是“多层感知机”。
二、多层感知机:用“隐藏层”突破线性局限
多层感知机(MLP)的核心改进是引入“隐藏层”——在输入层和输出层之间增加一个或多个神经元层,通过“多层线性变换+非线性激活函数”,让模型能够拟合复杂的非线性关系。
1. 多层感知机的基本结构
一个典型的多层感知机包含3类层:
- 输入层:接收原始特征(如手写数字图像的784个像素值);
- 隐藏层:位于输入层和输出层之间,可多层堆叠(隐藏层数量是超参数),每层包含多个神经元(神经元数量也是超参数);
- 输出层:输出模型结果(分类任务用Softmax输出概率,回归任务输出连续值)。
以“单隐藏层MLP”为例(处理异或问题):
- 输入层:2个神经元(\(x_1, x_2\));
- 隐藏层:2个神经元(\(h_1, h_2\)),分别对应“与非门”和“或门”;
- 输出层:1个神经元(y),对应“与门”。 计算过程:\(h_1 = 与非门(x_1,x_2)\),\(h_2 = 或门(x_1,x_2)\),\(y = 与门(h_1,h_2)\)——最终实现异或逻辑(验证:\(x_1=1,x_2=1\)时,\(h_1=0,h_2=1\)→\(y=0\);\(x_1=1,x_2=0\)时,\(h_1=1,h_2=1\)→\(y=1\))。
2. 激活函数:赋予模型非线性能力的“关键”
多层感知机的隐藏层和输出层必须使用“非线性激活函数”——如果只用线性变换,多层叠加后依然是线性模型(无法解决线性不可分问题)。激活函数的作用是“将神经元的输入总和转换为非线性输出”,常用的激活函数有3种:
(1)Sigmoid函数:将输入映射到(0,1)
\(\sigma(x) = \frac{1}{1 + e^{-x}}\)
- 特点:输出在0~1之间,可表示“概率”;但存在梯度消失问题(输入绝对值过大时,导数接近0,训练深层网络困难)。
- 适用场景:二分类任务的输出层(输出概率)。
(2)Tanh函数(双曲正切):将输入映射到(-1,1)
\(\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}\)
- 特点:输出中心在0,比Sigmoid的梯度更稳定;但同样存在梯度消失问题。
- 适用场景:早期MLP的隐藏层,目前逐渐被ReLU替代。
(3)ReLU函数(线性修正单元):最常用的激活函数
\(\text{ReLU}(x) = \max(0, x)\)
- 特点:输入为正时直接输出x(梯度=1,无梯度消失),输入为负时输出0(计算简单、训练速度快);解决了深层网络的训练难题,是目前深度学习的“默认激活函数”。
- 适用场景:MLP、CNN、Transformer的隐藏层。
3. 多层感知机的数学表达
以“单隐藏层+ReLU激活+Softmax输出”的MLP为例(多分类任务):
- 隐藏层计算:输入X(m×d,m为样本数,d为特征数)通过线性变换+ReLU激活,得到隐藏层输出H: \(H = \text{ReLU}(XW_1 + b_1)\)
- \(W_1\)(d×h,h为隐藏层神经元数):输入层到隐藏层的权重矩阵;
- \(b_1\)(1×h):隐藏层的偏置向量。
- 输出层计算:隐藏层H通过线性变换+Softmax激活,得到分类概率Y: \(Y = \text{Softmax}(HW_2 + b_2)\)
- \(W_2\)(h×k,k为类别数):隐藏层到输出层的权重矩阵;
- \(b_2\)(1×k):输出层的偏置向量;
- Softmax将线性输出转换为概率分布(和为1)。
三、多层感知机的训练:前向传播与反向传播
多层感知机的训练核心是“最小化损失函数”,通过“前向传播计算损失”和“反向传播更新参数”实现,具体流程如下:
1. 前向传播:计算预测结果与损失
- 步骤:从输入层开始,依次计算隐藏层、输出层的输出,最后用损失函数量化“预测值与真实值”的差距。
- 损失函数选择:
- 分类任务:交叉熵损失(衡量概率分布差距);
- 回归任务:平方损失(衡量连续值差距)。
2. 反向传播:计算梯度并更新参数
反向传播(Backpropagation)是训练深层网络的核心算法,通过“链式法则”从输出层向输入层反向计算每个参数的梯度,再用梯度下降更新参数:
- 计算输出层梯度:根据损失函数,计算输出层权重\(W_2\)和偏置\(b_2\)的梯度;
- 计算隐藏层梯度:将输出层的梯度反向传播到隐藏层,计算隐藏层权重\(W_1\)和偏置\(b_1\)的梯度;
- 更新参数:沿梯度反方向调整所有权重和偏置(使用小批量随机梯度下降,学习率和批量大小为超参数)。
关键:反向传播的效率很高,避免了暴力计算每个参数梯度的巨大开销,让深层网络的训练成为可能。
四、多层感知机的超参数与模型优化
多层感知机的性能很大程度上依赖“超参数调优”和“过拟合抑制”,这也是实战中的核心难点。
1. 核心超参数:控制模型复杂度
- 隐藏层数量:
- 太少(如0层,即感知机):无法处理非线性问题;
- 太多(如10层以上):训练难度大、易过拟合(除非用残差连接等技术);
- 建议:从1~3层开始,根据任务复杂度调整。
- 隐藏层神经元数量:
- 太少:模型表示能力不足(欠拟合);
- 太多:参数冗余、训练慢、易过拟合;
- 建议:每层神经元数从64、128开始,逐层递减(如输入层784→隐藏层128→隐藏层64→输出层10)。
2. 模型评估:验证集与K-折交叉验证
为了准确衡量模型的泛化能力(避免“训练集表现好,新数据表现差”),需要合理划分数据集:
- 训练集:用于训练模型参数(占比70%~80%);
- 验证集:用于调优超参数(如选择隐藏层数量),不能与训练集混用(占比10%~15%);
- 测试集:仅用于评估最终模型性能,严格来说只能用一次(占比10%~15%)。
当数据量较小时(如样本数<1000),推荐用K-折交叉验证:
- 将训练集划分为K个互斥子集(常用K=5或10);
- 每次用K-1个子集训练,1个子集验证;
- 重复K次,取K次验证误差的平均值作为最终评估结果。
3. 过拟合与欠拟合:如何让模型“恰到好处”
多层感知机容易出现“过拟合”(训练误差小,泛化误差大)或“欠拟合”(训练误差和泛化误差都大),需要针对性优化:
(1)欠拟合:模型太简单,没学会数据规律
- 表现:训练集准确率低,验证集准确率也低;
- 解决方法:
- 增加隐藏层数量或神经元数量(提高模型复杂度);
- 延长训练时间(确保模型充分学习);
- 增加特征维度(如对数据做特征工程)。
(2)过拟合:模型太复杂,学到了训练集噪声
- 表现:训练集准确率高,验证集准确率低;
- 解决方法:
- 权重衰减(L2正则化):在损失函数中加入权重的平方和,抑制权重过大(避免模型过度依赖某几个特征);
- 暂退法(丢弃法):训练时随机“关闭”部分隐藏层神经元(如50%概率),迫使模型学习更鲁棒的特征;
- 增加训练数据:最有效的方法,通过数据增强(如图像旋转、翻转)扩充样本;
- 早停(Early Stopping):训练过程中监控验证误差,当验证误差不再下降时停止训练(避免继续学习噪声)。