从 Bit 到 AGI第四章:神经元(Neuron)

MLP 是什么

从 Bit 到 AGI · 第四章:神经元(Neuron) · MLP 是什么

作者 David更新于 第 50 篇(共 186 篇)

MLP(Multi-Layer Perceptron,多层感知机)是最朴素的深度网络:输入层 → 若干全连接隐藏层(每层 ReLU)→ 输出层。Transformer 里的 FFN 本质上就是两个宽 MLP;搞懂 MLP,就搞懂了「深度」的基本形态。

直觉

把问题想成流水线:第一车间提取粗特征(边缘、组合),第二车间组合成部件,第三车间做决策。MLP 每层每个神经元都看全部上一层的输出——没有局部窗口,没有记忆状态,只有矩阵乘法和激活。

适合表格数据、固定长度向量;不适合长序列(用 RNN/Transformer)或大图像(用 CNN,否则参数量爆炸)。

定义

LL 层 MLP(含输入层共 L+1L+1 组神经元):

h(0)=x,h(l)=f ⁣(W(l)h(l−1)+b(l)),y=W(L)h(L−1)+b(L)\mathbf{h}^{(0)} = \mathbf{x}, \quad \mathbf{h}^{(l)} = f\!\left(\mathbf{W}^{(l)} \mathbf{h}^{(l-1)} + \mathbf{b}^{(l)}\right), \quad \mathbf{y} = \mathbf{W}^{(L)} \mathbf{h}^{(L-1)} + \mathbf{b}^{(L)}
  • W(l)∈Rdl×dl−1\mathbf{W}^{(l)} \in \mathbb{R}^{d_l \times d_{l-1}}:第 ll 层权重
  • ff:通常 ReLU(隐藏层);输出层 softmax(分类)或恒等(回归)

全连接(FC):dl−1d_{l-1} 个输入与 dld_l 个输出两两相连,参数量 dl×dl−1+dld_l \times d_{l-1} + d_l。

例子

例 1:MNIST 式小 MLP 参数量

结构:784 → 128 → 64 → 10

层权重形状参数量
FC1128×784100,352 + 128
FC264×1288,192 + 64
FC310×64640 + 10
合计109,386

float32 存储 ≈ 437 KB;一次前向(仅 MAC)≈ 109K × 2 FLOPs 量级。

例 2:手算两层

import numpy as np

def relu(z):
    return np.maximum(0, z)

# x ∈ R^3, h ∈ R^2, y ∈ R^1
x = np.array([1.0, 2.0, -1.0])
W1 = np.array([[0.5, -0.5, 1.0],
               [1.0,  0.0, 0.5]])
b1 = np.array([0.1, -0.2])
W2 = np.array([[1.0, -1.0]])
b2 = np.array([0.0])

h = relu(W1 @ x + b1)
y = W2 @ h + b2
print(f"h={h}, y={y}")  # h=[0. 0.3], y=-0.3

例 3:PyTorch 风格

# 逻辑等价(伪代码)
# model = Sequential(
#     Linear(784, 128), ReLU(),
#     Linear(128, 64),  ReLU(),
#     Linear(64, 10)
# )

量化

  • 宽度 dd、深度 LL 的方阵 MLP(每层 d×dd \times d):参数量 ≈L⋅d2\approx L \cdot d^2
  • d=4096,L=2d=4096, L=2(类似 Transformer FFN 一侧):单层 40962≈16.84096^2 \approx 16.8M 参数;两层 ≈ 33.6M
  • GPT-3 175B 中 FFN 占参数大头:每层约 4d24 d^2(up + down 投影),深度 × 层数极大
  • 复杂度:前向 O(∑ldldl−1)O(\sum_l d_l d_{l-1});无结构假设,数据需自己学局部性

Transformer 块 = Attention + MLP。Attention 做「看谁」,MLP 做「怎么想」——MLP 并未过时,而是换了个名字(FFN)住在每个块里。

常见误区

  1. 「MLP = 深度学习全部」——CNN/RNN/Attention 是结构归纳偏置;MLP 是通用但样本效率低。
  2. 「层越多越好」——深度需配合残差、归一化;裸深 MLP 难训(见从感知机到深度网络)。
  3. 「784→10 一层就够 MNIST」——单层线性可分版本有限;两层非线性可达 99%+ 准确率。

动手试一试

用 NumPy 实现三层 MLP 前向:

import numpy as np

def mlp_forward(x, weights, biases, activation=relu):
    h = x
    for W, b in zip(weights[:-1], biases[:-1]):
        h = activation(W @ h + b)
    return weights[-1] @ h + biases[-1]

Ws = [np.random.randn(4, 3) * 0.1,
      np.random.randn(2, 4) * 0.1,
      np.random.randn(1, 2) * 0.1]
bs = [np.zeros(4), np.zeros(2), np.zeros(1)]
x = np.random.randn(3)
print(mlp_forward(x, Ws, bs).shape)  # (1,)

Transformer 里的 FFN 就是 MLP

每个 Transformer 块含两个子层:Attention + FFN(Feed-Forward Network)。FFN 典型结构:

FFN(x)=W2⋅GELU(W1x+b1)+b2\mathrm{FFN}(x) = W_2 \cdot \mathrm{GELU}(W_1 x + b_1) + b_2

其中 W1∈R4d×dW_1 \in \mathbb{R}^{4d \times d},W2∈Rd×4dW_2 \in \mathbb{R}^{d \times 4d}——先扩 4 倍再压回,中间 GELU 非线性。Llama 用 SwiGLU 三门控,参数更多,但仍是「宽 MLP」家族。

d=4096d=4096 的单层 FFN 参数:4096×16384+16384×4096≈1344096 \times 16384 + 16384 \times 4096 \approx 134M;96 层 GPT-3 里 FFN 参数量 超过 Attention 的 QKV 投影总和——所以说「LLM 主要是大 MLP 堆叠」并不夸张。

何时仍用纯 MLP

  • 表格数据(用户特征、风控):树模型仍强,但 Embedding + MLP 是推荐深度学习基线
  • 推荐系统 recall/ranking 最后一层
  • 小型分类头:CNN/Transformer backbone 后接 1~2 层 FC

样本量小、特征有明确结构时,MLP 不如带归纳偏置的模型(CNN、GNN)样本效率高;数据大、结构未知 时 MLP/Transformer 占优。

宽度与深度的参数量权衡

同参数量 PP:深窄网络层数多、每层矩阵小;浅宽网络层数少、单层 GEMM 大——GPU 对 大矩阵乘 更友好,极深窄 MLP 有时 GPU 利用率低。

参数共享无:MLP 每层独立 WW——与 CNN 共享核、RNN 共享 WhhW_{hh} 不同;表达灵活但 sample complexity 高。

Tabular DL:2021 后 TabTransformer、FT-Transformer 把类别特征 embed 后过 Transformer 层——本质仍是 结构化 MLP/Attention 混合,表格数据深度学习 SOTA 方向之一。

动手与阅读建议

建议对照 PyTorch 文档 torch.nn 模块,把本篇公式与 Linear、ReLU、LSTM、MultiheadAttention 的 forward 签名一一对应。读论文时先圈出 张量 shape(如 (B,T,d)(B, T, d))再读公式,比死记符号快得多。

若训练 loss 不降:先画 train loss 曲线(逐步、非 epoch 平均),看是震荡、plateau 还是 NaN。NaN 从 lr 减半 与 gradient clip 开始试;plateau 查 wd 是否过大 或 数据是否标错。验证集只用于 选超参,勿反复调 test。

本章内容在第五章 Transformer 会全部复现:QKV 是 Attention,FFN 是 MLP,Pre-LN 是 LayerNorm。掌握本章 = 读 GPT 论文的最低门槛。完成 MNIST 或 XOR 小实验(CPU 即可)再进入下一章,手感差异很大。

术语对照(中英)

Neuron/Unit 神经元;Activation 激活函数;Hidden layer 隐藏层;Logit 预激活 zz;Embedding 把离散 id 映射为连续向量;Epoch 全数据扫一遍;Iteration/Step 一个 batch 更新一次;Learning rate 学习率 η\eta;Weight decay 权重衰减(L2 或 AdamW);Fine-tune 微调预训练权重。读英文文档时这些词与中文教材一一对应,避免混用「单元/神经元/节点」造成概念漂移。

算力与显存(复习)

参数量 PP 个 float32 权重约占 4P4P 字节。训练显存粗估:权重 + 梯度 + 优化器状态(Adam 约 3×3\times 权重)+ 激活(与 batch、序列长度、层数成正比)。推理 mainly 权重 + KV cache(生成式 LLM)。先会估算 PP 和一次 forward 的 FLOPs,再读第九章 GPU 与第七章分布式,数字才能对齐。

下一篇链接在文末 小结 中;建议按 meta.json 顺序阅读,跳读易漏掉「RNN 消失 → LSTM → Attention」这条叙事链。遇到公式卡住,回第二章查 链式法则 与 softmax。

量化自检:本篇至少包含两个带数字的例子(参数量、FLOPs、梯度量级或准确率)。复现时请用自己的随机种子跑代码,核对数量级一致即可,不必逐位相同——浮点顺序会导致末位差异。

写笔记时用一句话概括本篇核心定理或结论,便于复习。

小结

MLP = 堆叠的全连接层 + 非线性激活;参数量由层宽决定,是「万能但费参数」的基线。图像用 CNN、序列用 RNN/Attention,但 FFN 仍是现代 LLM 的核心组件。

→ 下一篇:CNN 为什么成功

本页目录