STAGE 1 基础入门

MLP 多层感知机

神经网络的基本积木 — 学会 MLP,你就掌握了深度学习的骨架

📊 Excel 手推 ⏱️ 20 分钟 🎯 网络基础
1
📋 本章要点
  • MLP 由输入层、隐藏层、输出层组成,每层全连接
  • 激活函数引入非线性,使网络能拟合复杂函数
  • 前向传播:逐层计算 y = Wx + b,再过激活函数
  • 通用近似定理:足够宽的单隐藏层 MLP 可以逼近任意连续函数

什么是 MLP?

MLP(Multi-Layer Perceptron,多层感知机)是最基本的神经网络结构。它由输入层、隐藏层、输出层组成,数据从左到右单向流动。

核心思想:每一层都是线性变换 + 激活函数的组合。两层 MLP 的公式为:

y = ReLU( W₂ · ReLU( W₁ · x + b₁ ) + b₂ )

网络结构图

输入层
x₁
x₂
隐藏层
h₁
h₂
h₃
ReLU
act
输出层
o₁
o₂

数据从左到右流动:输入 → 线性变换 → ReLU激活 → 线性变换 → 输出

关键概念

📦 输入层

接收原始数据,比如图片的像素值、文字的嵌入向量

🔮 隐藏层

学习数据的特征表示,层数越多能学到越复杂的模式

🎯 输出层

产生最终预测结果,比如分类概率、回归值

2

Excel 手推前向传播

让我们用具体数字,一步步算完 MLP 的前向传播过程。

📋 给定参数

输入 x
[1.0, 0.5]
偏置 b₁
[0.1, -0.2, 0.05]
权重 W₁ (2×3)
[[0.5, -0.3, 0.8], [0.2, 0.7, -0.1]]

Step 2a:计算隐藏层原始输出 h₁_raw = W₁·x + b₁

隐藏层第1个神经元:h₁_raw
计算项 运算 权重 结果
x₁ × W₁[0,0] 1.0 × 0.5 0.5
x₂ × W₁[1,0] 0.5 × 0.2 0.1
偏置 b₁[0] + 0.1
h₁_raw = 求和 0.5 + 0.1 + 0.1 0.7
隐藏层第2个神经元:h₂_raw
计算项 运算 权重 结果
x₁ × W₁[0,1] 1.0 × -0.3 -0.3
x₂ × W₁[1,1] 0.5 × 0.7 0.35
偏置 b₁[1] + -0.2
h₂_raw = 求和 -0.3 + 0.35 + (-0.2) -0.15
隐藏层第3个神经元:h₃_raw
计算项 运算 权重 结果
x₁ × W₁[0,2] 1.0 × 0.8 0.8
x₂ × W₁[1,2] 0.5 × -0.1 -0.05
偏置 b₁[2] + 0.05
h₃_raw = 求和 0.8 + (-0.05) + 0.05 0.8
h_raw = [0.7, -0.15, 0.8]

Step 2b:ReLU 激活 — max(0, x)

ReLU 的规则很简单:正数保留,负数变零。它给网络引入了非线性。

神经元 原始值 ReLU: max(0, x) 激活后
h₁ 0.7 max(0, 0.7) 0.7 ✓
h₂ -0.15 max(0, -0.15) 0 ✗ 被截断
h₃ 0.8 max(0, 0.8) 0.8 ✓
h = ReLU(h_raw) = [0.7, 0, 0.8]

Step 2c:输出层计算

假设输出层权重 W₂ (3×2) 和偏置 b₂:

W₂
[[0.4, -0.2], [-0.1, 0.6], [0.3, 0.5]]
b₂
[0.1, -0.05]
输出 o₁
计算项 h 值 × W₂ 权重 结果
h₁ × W₂[0,0] 0.7 × 0.4 0.28
h₂ × W₂[1,0] 0 × -0.1 0
h₃ × W₂[2,0] 0.8 × 0.3 0.24
偏置 b₂[0] + 0.1
o₁ = 求和 0.28 + 0 + 0.24 + 0.1 0.62
输出 o₂
计算项 h 值 × W₂ 权重 结果
h₁ × W₂[0,1] 0.7 × -0.2 -0.14
h₂ × W₂[1,1] 0 × 0.6 0
h₃ × W₂[2,1] 0.8 × 0.5 0.4
偏置 b₂[1] + -0.05
o₂ = 求和 -0.14 + 0 + 0.4 + (-0.05) 0.21

Step 2d:Softmax 得到概率

步骤 计算 结果
原始输出 [0.62, 0.21]
e^o₁ e^0.62 1.859
e^o₂ e^0.21 1.234
求和 ∑ 1.859 + 1.234 3.093
P(类别1) 1.859 / 3.093 0.601 (60.1%)
P(类别2) 1.234 / 3.093 0.399 (39.9%)
预测结果: 类别1(概率 60.1%)
3

PyTorch 实现

用 PyTorch 实现上面手算的同一个 MLP,验证结果一致。

mlp_demo.py
import torch
import torch.nn as nn

# 定义两层 MLP
class SimpleMLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.layer1 = nn.Linear(2, 3)   # 输入2维 → 隐藏3维
        self.relu = nn.ReLU()
        self.layer2 = nn.Linear(3, 2)   # 隐藏3维 → 输出2维

    def forward(self, x):
        h = self.relu(self.layer1(x))     # 隐藏层 + ReLU
        y = self.layer2(h)                 # 输出层
        return y

# 创建模型并手动设置权重
model = SimpleMLP()

# 设置 W₁, b₁
model.layer1.weight.data = torch.tensor([
    [0.5, 0.2],    # → h₁
    [-0.3, 0.7],   # → h₂
    [0.8, -0.1]    # → h₃
])
model.layer1.bias.data = torch.tensor([0.1, -0.2, 0.05])

# 设置 W₂, b₂
model.layer2.weight.data = torch.tensor([
    [0.4, -0.1, 0.3],   # → o₁
    [-0.2, 0.6, 0.5]    # → o₂
])
model.layer2.bias.data = torch.tensor([0.1, -0.05])

# 前向传播
x = torch.tensor([1.0, 0.5])
output = model(x)
probs = torch.softmax(output, dim=0)

print(f"输出: {output}")
print(f"概率: {probs}")
# 输出: tensor([0.6200, 0.2100])
# 概率: tensor([0.6011, 0.3989])
4

📝 总结

1️⃣

线性变换

h_raw = W·x + b,矩阵乘法将输入映射到新的空间

2️⃣

激活函数

h = ReLU(h_raw),引入非线性,让网络能学习复杂模式

3️⃣

堆叠层数

重复 线性+激活,层数越深能表达越复杂的函数

4️⃣

输出概率

最后一层 + Softmax,输出分类概率或直接回归值

MLP 的本质:反复做 线性变换 + 非线性激活,让数据在高维空间中变得"线性可分"。

Easy Deep Learning · 用 Excel 手推理解每一个公式
🔗 相关章节推荐
  • SoftmaxMLP 输出层常用 Softmax 做分类
  • Loss & 反向传播理解 MLP 如何通过反向传播学习
  • CNNCNN 是 MLP 的空间感知版本