多层感知机 (MLP) 完整计算过程详解
引言
多层感知机(Multilayer Perceptron,简称 MLP)是深度学习中最基础的神经网络模型,也是理解复杂神经网络的核心基础。本文将完整拆解 MLP 的每一步计算过程,从输入数据到前向传播、损失计算、反向传播,再到权重偏置更新,同时提供了可交互的 Excel 示例文件,所有公式均已内置,修改输入数据或超参数即可自动完成全部计算,帮助你彻底理解 MLP 的底层逻辑。
一、MLP 基础结构与超参数
本文示例使用的是一个简单的 3 层 MLP 结构,适用于回归任务,具体配置如下:
| 超参数 / 结构 | 配置值 | 说明 |
|---|---|---|
| 输入层神经元数量 | 1 | 单输入变量,本示例输入值为 5 |
| 隐藏层神经元数量 | 6 | 单隐藏层,包含 6 个神经元 |
| 输出层神经元数量 | 1 | 单输出变量,本示例真实目标值为 208 |
| 学习系数 (Learning Rate) | 0.01 | 梯度下降的步长,控制每次参数更新的幅度 |
| 激活函数 | Leaky ReLU | f(x) = max(x, 0.05x),解决传统 ReLU 的神经元死亡问题 |
| 损失函数 | 均方误差 (MSE) | Loss = (真实值-预测值)²,回归任务最常用的损失函数 |
MLP 的完整计算流程分为 5 个核心步骤,我们将逐一拆解:
以本示例的第 1 个隐藏神经元为例:
6 个隐藏神经元的完整计算结果如下:
- 前向传播 (Forward Propagation)
- 损失计算 (Loss Calculation)
- 反向传播 (Backward Propagation)
- 参数更新 (Parameter Update)
- 迭代训练直到收敛
二、前向传播计算过程
前向传播是 MLP 的 "预测过程",从输入层开始,逐层计算加权和与激活值,最终得到输出层的预测结果。
2.1 隐藏层计算
隐藏层的每个神经元都包含两步计算:加权和计算+激活函数计算。
对于第 i 个隐藏神经元,计算公式为:
- 加权和:
zi = x * Wi + Bi- x:输入神经元值(本示例为 5)
- Wi:第 i 个隐藏神经元的权重
- Bi:第 i 个隐藏神经元的偏置
- 激活值:
ai = LeakyReLU(zi) = IF(zi>0, zi, 0.05*zi) - 权重 W1=10,偏置 B1=10
- 加权和 z1 = 5*10 + 10 = 60
- 激活值 a1 = LeakyReLU (60) = 60(因为 60>0)
| 神经元编号 | 偏置 (Bi) | 权重 (Wi) | 加权和 (zi) | 激活值 (ai) |
|---|---|---|---|---|
| 1 | 10 | 10 | 60 | 60 |
| 2 | 10 | 20 | 110 | 110 |
| 3 | 10 | 30 | 160 | 160 |
| 4 | 10 | 20 | 110 | 110 |
| 5 | 10 | 10 | 60 | 60 |
| 6 | 10 | 20 | 110 | 110 |
2.2 输出层计算
输出层的计算逻辑与隐藏层一致,输入是隐藏层的 6 个激活值,最终得到模型的预测值。
计算公式为:
- 输出加权和:
z_out = sum(ai * W'i) + B'- ai:第 i 个隐藏神经元的激活值
- W'i:第 i 个隐藏神经元对应的输出权重
- B':输出层的偏置
- 输出激活值(预测值):
y_hat = LeakyReLU(z_out)
本示例的输出层计算:
- 输出权重 W'=[10,20,10,10,30,20],输出偏置 B'=10
- 加权和 z_out = 6010 + 11020 + 16010 + 11010 + 6030 + 11020 + 10 = 19510
- 预测值 y_hat = LeakyReLU (19510) = 19510
三、损失函数计算
损失函数用于衡量模型的预测值与真实目标值之间的差距,是模型优化的核心目标。
本示例使用均方误差 (MSE) 作为损失函数,计算公式为:
- 误差:
error = y - y_hat- y:真实目标值(本示例为 208)
- y_hat:模型预测值(本示例为 19510)
- 均方误差:
Loss = error² = (y - y_hat)² - 损失对预测值的导数:
dLoss/dy_hat = 2*(y_hat - y)(反向传播的核心基础)
本示例的损失计算结果:
- 误差 = 208 - 19510 = -19302
- 均方误差 Loss = (-19302)² = 372567204
- 损失导数 dLoss/dy_hat = 2*(19510-208) = 38604
四、反向传播计算过程
反向传播是 MLP 的 "学习过程",核心是链式法则,从输出层开始,反向计算损失函数对每个权重和偏置的梯度,为后续的参数更新提供依据。
4.1 输出层梯度计算
输出层的梯度是反向传播的起点,我们需要计算损失函数对输出层权重和偏置的梯度。
计算公式:
- 损失对输出权重的梯度:
dLoss/dW'i = dLoss/dy_hat * ai- 梯度等于损失对预测值的导数,乘以对应隐藏神经元的激活值
- 损失对输出偏置的梯度:
dLoss/dB' = dLoss/dy_hat- 偏置的梯度与损失对预测值的导数完全相等
以第 1 个输出权重为例:
- dLoss/dW'1 = 38604 * 60 = 2316240
4.2 隐藏层梯度计算
隐藏层的梯度需要通过输出层的梯度反向传递,核心是链式法则的应用。
对于第 i 个隐藏神经元,梯度计算分为 4 步:
- 激活函数的导数:
da/dz = IF(zi>0, 1, 0.05)(Leaky ReLU 的导数) - 损失对隐藏层激活值的梯度:
dLoss/dai = dLoss/dy_hat * W'i- 梯度等于损失对预测值的导数,乘以对应的输出权重
- 损失对隐藏层加权和的梯度:
dLoss/dzi = dLoss/dai * da/dz- 链式法则:损失对加权和的梯度,等于损失对激活值的梯度乘以激活函数的导数
- 损失对隐藏层权重 / 偏置的梯度:
- 权重梯度:
dLoss/dWi = dLoss/dzi * x - 偏置梯度:
dLoss/dBi = dLoss/dzi
- 权重梯度:
以第 1 个隐藏神经元为例:
- 激活函数导数 da/dz = 1(因为 z1=60>0)
- dLoss/da1 = 38604 * 10 = 386040
- dLoss/dz1 = 386040 * 1 = 386040
- dLoss/dW1 = 386040 * 5 = 1930200
- dLoss/dB1 = 386040
五、权重与偏置更新
得到所有参数的梯度后,我们使用梯度下降算法更新权重和偏置,核心目标是让损失函数值下降。
梯度下降的更新规则为:
- 权重更新:
W_new = W_old - η * dLoss/dW - 偏置更新:
B_new = B_old - η * dLoss/dB- η:学习系数(本示例为 0.01)
- 负号表示沿着梯度的反方向更新,让损失函数下降
5.1 隐藏层参数更新结果
| 神经元编号 | 原权重 (Wi) | 权重梯度 | 权重调整幅度 | 更新后权重 (Wi_new) | 原偏置 (Bi) | 偏置梯度 | 偏置调整幅度 | 更新后偏置 (Bi_new) |
|---|---|---|---|---|---|---|---|---|
| 1 | 10 | 1930200 | 19302 | -19292 | 10 | 386040 | 3860.4 | -3850.4 |
| 2 | 20 | 4246440 | 42464.4 | -42444.4 | 10 | 849288 | 8492.88 | -8482.88 |
| 3 | 30 | 6176640 | 61766.4 | -61736.4 | 10 | 1235328 | 12353.28 | -12343.28 |
| 4 | 20 | 4246440 | 42464.4 | -42444.4 | 10 | 849288 | 8492.88 | -8482.88 |
| 5 | 10 | 1930200 | 19302 | -19292 | 10 | 386040 | 3860.4 | -3850.4 |
| 6 | 20 | 4246440 | 42464.4 | -42444.4 | 10 | 849288 | 8492.88 | -8482.88 |
5.2 输出层参数更新结果
| 隐藏层神经元 | 原权重 (W') | 权重梯度 | 权重调整幅度 | 更新后权重 (W'_new) | 原偏置 (B') | 偏置梯度 | 偏置调整幅度 | 更新后偏置 (B'_new) |
|---|---|---|---|---|---|---|---|---|
| 1 | 10 | 2316240 | 23162.4 | -23152.4 | 10 | 38604 | 386.04 | -376.04 |
| 2 | 20 | 4246440 | 42464.4 | -42444.4 | None | None | None | None |
| 3 | 10 | 6176640 | 61766.4 | -61756.4 | None | None | None | None |
| 4 | 10 | 4246440 | 42464.4 | -42454.4 | None | None | None | None |
| 5 | 30 | 2316240 | 23162.4 | -23132.4 | None | None | None | None |
| 6 | 20 | 4246440 | 42464.4 | -42444.4 | None | None | None | None |
5.3 本次迭代效果
| 指标 | 迭代前值 | 迭代后值 | 变化量 |
|---|---|---|---|
| 模型预测值 (y_hat) | 19510 | 208 | -19302 |
| 真实目标值 (y) | 208 | 208 | 0 |
| 均方误差 (Loss) | 372567204 | 0 | -372567204 |
可以看到,经过一次完整的迭代,模型的预测值已经完全匹配真实目标值,损失函数降为 0,模型完成了学习。
六、迭代训练与收敛
在实际的深度学习任务中,模型通常不会一次迭代就收敛,需要重复前向传播→损失计算→反向传播→参数更新的完整流程,直到损失函数值下降到可接受的范围,或者不再明显下降,此时模型达到收敛状态。
每次迭代都会让模型的参数向最优值靠近一步,学习率的选择非常关键:
- 学习率过大:可能会越过最优值,导致损失函数震荡不收敛
- 学习率过小:模型收敛速度太慢,需要大量的迭代次数
七、Excel 示例文件说明
本文提供了完整的 MLP 计算过程 Excel 示例文件,文件包含 4 个独立的工作表,所有公式均已内置,修改输入数据、权重、偏置或学习率,即可自动完成全部计算:
- MLP 计算总览:包含 MLP 的基础超参数、完整计算流程说明,快速了解整体结构
- 前向传播计算:完整的隐藏层、输出层计算过程,每一步都有公式说明和示例
- 反向传播计算:输出层、隐藏层的梯度计算过程,详细拆解链式法则的应用
- 权重偏置更新:完整的参数更新过程,以及本次迭代的效果汇总
