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 的本质:反复做 线性变换 + 非线性激活,让数据在高维空间中变得"线性可分"。
🔗 相关章节推荐
- Softmax — MLP 输出层常用 Softmax 做分类
- Loss & 反向传播 — 理解 MLP 如何通过反向传播学习
- CNN — CNN 是 MLP 的空间感知版本