中文名:多层感知机 / 多层前馈神经网络
英文名:Multilayer Perceptron (MLP) / Feedforward Neural Network
多层感知机(MLP) 是一种基础的前馈神经网络,由输入层、隐藏层和输出层构成,通过模拟人脑神经元的连接方式实现数据的非线性映射与预测。
是最基础的深度学习模型之一,由输入层、若干隐藏层和输出层构成。每层由若干“神经元”组成,层与层之间用可训练的权重(矩阵)和偏置(向量)连接,经过线性变换 + 非线性激活函数,形成从输入到输出的映射。
1. 网络结构:输入层接收原始数据,隐藏层通过激活函数(如ReLU、Sigmoid)引入非线性,输出层根据任务输出预测结果(分类用Softmax,回归用线性输出)。
2. 训练机制:通过反向传播算法计算预测误差,利用梯度下降法调整各层权重和偏置,最小化损失函数(如交叉熵、均方误差),实现模型参数优化。
3. 非线性拟合:隐藏层的激活函数打破了线性模型的局限,使MLP能学习数据中的复杂非线性关系,适配各类复杂任务。
4. 表示学习:MLP 通过多层线性变换与非线性激活将原始输入映射到更高阶的特征空间,从而能拟合复杂非线性函数。
5. 学习方式:使用训练数据通过最优化(如梯度下降)最小化损失函数(例如均方误差或交叉熵),反向传播算法计算梯度并更新参数。
6. 关键构件:权重矩阵 $(W)$、偏置向量 $(b)$、激活函数 $(\phi)$、损失函数 $(\mathcal{L})$、优化器($SGD/Adam$ 等)。
单个神经元的线性变换与激活
* $(x)$ — 输入向量(上一层的输出或原始输入)。
* $(w)$ — 权重向量(该神经元对应)。
* $(b)$ — 偏置(标量)。
* $(z)$ — 预激活(linear pre-activation)。
* $(a)$ — 神经元输出(激活值)。
--------------------------------------------------------------------------------
整层的矩阵形式(第 (l) 层)
* $(W^{(l)})$ — 第 (l) 层的权重矩阵(维度 $(n_l\times n_{l-1})$)。
* $(b^{(l)})$ — 第 (l) 层的偏置向量(维度 $(n_l)$)。
* $(a^{(l-1)})$ — 第 (l-1) 层的激活(输入)。
* $(z^{(l)})$ — 第 (l) 层的预激活向量。
* $(a^{(l)})$ — 第 (l) 层输出(逐元素应用激活函数)。
--------------------------------------------------------------------------------
Softmax(多分类输出概率)
* $(z)$ — 输出层的实数分数向量;$(z_j)$ 为第 $(j)$ 类的分数。
* $({softmax}(z)_j)$ — 第 $(j)$ 类的预测概率(所有概率和为 1)。
--------------------------------------------------------------------------------
损失函数(以平均损失为例)
* $(\theta)$ — 模型参数集合(所有 $(W^{(l)}, b^{(l)})$)。
* $(N)$ — 样本数(批大小或全部样本)。
* $(\ell(\cdot,\cdot))$ — 单样本损失(分类常用交叉熵,回归用 MSE)。
* $(\hat y^{(i)})$ — 模型对第 $(i)$ 个样本的预测,$(y^{(i)})$ 为真实标签。
--------------------------------------------------------------------------------
参数更新(梯度下降)
* $(\eta)$ — 学习率(learning rate)。
* $(\nabla_\theta \mathcal{L}(\theta))$ — 损失对参数的梯度。
--------------------------------------------------------------------------------
| 参数名 | 描述 | 值范围 | 默认值 | 建议值 |
|---|---|---|---|---|
| learning_rate | 学习率 | 0.0001-0.1 | 0.001 | 0.0001-0.001 |
| epochs | 训练轮数 | - | - | 50–200 |
| Units | 单元数 神经元数量 | 8 - 256 | - | 128 - 512 |
前向、反向与训练流程(要点)
1. 前向传播(Forward pass):输入 $(x)$ 逐层计算 $(a^{(1)}, a^{(2)},\dots,\hat y)$。输出层根据任务产生数值或概率。
2. 计算损失:用损失函数 $(\mathcal{L}(y,\hat y))$ 衡量预测与真实标签差距。
3. 反向传播(Backpropagation):用链式法则从输出层向前逐层计算梯度$(\partial \mathcal{L}/\partial W^{(l)}, \partial \mathcal{L}/\partial b^{(l)})$。
4. 参数更新:用优化器(SGD、Momentum、Adam 等)和学习率 $(\eta)$ 更新参数。
5. 迭代训练:重复上述步骤若干 epoch,直到满足停止准则(如验证集不再提升或达到最大 epoch)。
6. 验证与调参:通过验证集/交叉验证调节超参数,避免过拟合/欠拟合。
7. 测试与部署:在测试集评估后部署,可能应用量化/加速/模型剪枝等。
拟合能力强,可处理复杂的非线性数据,在分类、回归等任务中表现优异。
结构灵活,可通过调整隐藏层数量和神经元个数适配不同数据规模与任务需求。
兼容性高,能与特征工程、正则化等技术结合,提升模型泛化能力,广泛应用于图像、文本、语音等领域。
使用 236、366、599、688、122 预测第六位数(逻辑过程演示)
假设我们用 5 组三位数,预测第六组的下一位数字。
---
步骤 1:准备输入特征
对每一组三位数(如 236):
* 拆分为数字:2、3、6
* 归一化到 0–1
* (如果你有熵特征,也一起加入)
最终一条样本输入示例:
[2, 3, 6, 熵特征1, 熵特征2]
因此,五条数据整理为五行输入。
---
步骤 2:前向传播(每层做两件事)
对数据批量送入 MLP 网络:
第一层:线性组合 + 激活
* 网络计算每条输入与权重的加权求和
* 激活函数(ReLU)筛选重要特征
* 输出一组新的特征向量(MLP 通过它学习数字之间的关系)
---
第二层(隐藏层):继续组合 + 激活
* 再做一次特征转换
* 强化数字变化规律(连续性、大小关系、频率模式等)
---
第三层(输出层):生成预测
* 输出层会生成一个数字(如:0 到 9 的概率)
* 选择概率最高的数字作为预测
---
步骤 3:输出预测结果(示例)
假设 MLP 输出的概率分布是:
| 数字 | 概率 |
| -- | ---- |
| 0 | 0.02 |
| 1 | 0.05 |
| 2 | 0.10 |
| 3 | 0.12 |
| 4 | 0.08 |
| 5 | 0.30 |
| 6 | 0.20 |
| 7 | 0.09 |
| 8 | 0.03 |
| 9 | 0.01 |
概率最大的是 5,所以:
预测第六组的三位数下一位数字 = 5
---
步骤 4:这个数字是如何被使用?
* 用于序列预测(你模型中的下一期数字预测)
* 可与其他模型(LSTM / GRU / Transformer / XGBoost)进行投票集成
* 可用于概率排名(你项目中的排序输出)
---
七、你可能没想到但必须了解的点
1. MLP 对序列记忆较弱
不像 LSTM / GRU,它不能记住长时间序列依赖。
因此你必须使用滑动窗口(你的 train_model 已支持)。
2. 需要特征工程
MLP 本质就是矩阵乘法 + 非线性,需要你添加更多特征(你项目中的熵特征非常合适)。
3. MLP 很依赖归一化
输入特征必须进行 Min-Max 或 StandardScaler,否则训练不稳定。
4. 超参数敏感
尤其是:
* 隐藏层大小
* 激活函数
* 学习率
---
无