Skip to content

04. FeedForward(前馈网络)

为什么需要"扩张-压缩"?SwiGLU 有什么优势?


🎯 学习目标

完成本模块后,你将能够:

  • ✅ 理解 FeedForward 的"扩张-压缩"结构
  • ✅ 理解为什么需要高维中间层
  • ✅ 理解 SwiGLU 激活函数的优势
  • ✅ 理解 FeedForward 与 Attention 的分工
  • ✅ 从零实现 SwiGLU FeedForward

📚 学习路径

1️⃣ 快速体验(10 分钟)

bash
cd experiments

# 实验 1:FeedForward 基础
python exp1_feedforward.py

🔬 实验列表

实验目的时间
exp1_feedforward.py理解扩张-压缩结构和 SwiGLU10分钟

💡 关键要点

1. FeedForward 的核心结构

FFN(x)=W2σ(W1x)

标准 FFN

  • W1:hidden_size → intermediate_size(扩张)
  • σ:激活函数(ReLU、GELU 等)
  • W2:intermediate_size → hidden_size(压缩)

MiniMind SwiGLU

SwiGLU(x)=Wdown(SiLU(Wgatex)Wupx)

2. 为什么要"扩张-压缩"?

直接变换的问题

  • 768 → 768:只是线性变换,表达能力有限
  • 无法拟合复杂的非线性函数

扩张-压缩的优势

  • 768 → 2048 → 768:经过高维空间
  • 高维空间中更容易分离不同的模式
  • 压缩回来时保留了有用信息

类比

  • 做菜:食材 → 切碎加工 → 装盘(维度相同但已加工)
  • 照片:像素 → 特征提取 → 优化像素(质量提升)

3. SwiGLU 激活函数

为什么不用 ReLU?

  • ReLU 简单但效果一般
  • GLU 系列在 LLM 中表现更好

SwiGLU 公式

python
hidden = SiLU(gate) * up  # 门控机制
output = down_proj(hidden)

三个投影

  • gate_proj:计算门控信号
  • up_proj:计算值信号
  • down_proj:压缩回原维度

SiLU(Swish)激活

SiLU(x)=xσ(x)

4. FeedForward 与 Attention 的分工

组件职责类比
Attention词与词的信息交换开会讨论
FeedForward每个词的独立处理各自思考

关键区别

  • Attention:有 seq_len × seq_len 的交互
  • FeedForward:完全独立,每个位置分别处理

Transformer Block 流程

x → RMSNorm → Attention → + → RMSNorm → FeedForward → +
              (信息交换)              (独立思考)

📖 文档


✅ 完成检查

学完本模块后,你应该能够:

理论

  • [ ] 解释为什么需要"扩张-压缩"结构
  • [ ] 解释 SwiGLU 的三个投影的作用
  • [ ] 解释 SiLU 激活函数的特点
  • [ ] 解释 FeedForward 与 Attention 的分工

实践

  • [ ] 从零实现标准 FFN
  • [ ] 从零实现 SwiGLU
  • [ ] 对比不同激活函数的效果

🔗 相关资源

论文

代码实现

  • MiniMind: model/model_minimind.py:330-380

🎓 下一步

完成本模块后,前往: 👉 05. Residual Connection(残差连接)

基于 MiniMind 项目的学习笔记