从 Feed Forward Network、上投影 / 下投影、GELU、SiLU、GLU、SwiGLU 到 MoE 专家,理解 Transformer block 里另一半计算和容量从哪里来
| 模块 | 回答的问题 | 直觉 | 容易忽略什么 |
|---|---|---|---|
| Attention | 当前位置应该读取哪些上下文信息 | 跨 token 信息路由 | 它不是 Transformer 的全部 |
| FFN / MLP | 读到信息后,当前位置内部怎样加工 | 逐位置非线性变换和特征组合 | 大量参数和计算常常在这里 |
| Activation | 为什么多层线性变换不退化成一层线性 | 给模型加入弯曲、门槛和选择性 | 激活函数会影响稳定性、稀疏性和吞吐 |
| Gate | 哪些中间特征应该被放大或抑制 | 用一个分支调制另一个分支 | SwiGLU / GEGLU 改变权重形状和转换逻辑 |
Attention 像“从上下文里取料”,FFN 像“在当前位置做加工”。只懂 Attention,会漏掉现代 LLM 很大一部分参数、计算和能力形成位置。
| 步骤 | 形状直觉 | 做什么 | 工程含义 |
|---|---|---|---|
| Up Projection | hidden_size → intermediate_size | 把每个 token 的表示扩到更宽的中间空间 | 中间维度越大,参数和 GEMM 计算越多 |
| Activation | 逐元素非线性 | 让网络能表达复杂函数,而不是多层线性叠加 | GELU、SiLU、ReLU 等会影响速度和数值特性 |
| Down Projection | intermediate_size → hidden_size | 把加工后的中间特征压回 residual stream 的宽度 | 必须和残差主路形状对齐 |
| Residual Add | x + FFN(x) | 把 FFN 的增量写回隐藏状态 | 尺度过大或量化误差会污染后续层 |
FFN(x) = W_down * activation(W_up * x) 是非门控 FFN 的简化直觉。现代 LLM 常用门控变体,所以权重名会变成 gate_proj、up_proj、down_proj。
| 机制 | 核心直觉 | 常见位置 | 注意点 |
|---|---|---|---|
| ReLU | 负值截断,正值保留 | 早期神经网络常见 | 简单快,但表达和梯度特性不是现代 LLM 主流选择 |
| GELU | 按概率平滑地放过输入 | BERT、GPT 早期路线常见 | 比 ReLU 平滑,计算略复杂 |
| SiLU / Swish | x * sigmoid(x),小值平滑抑制,大值保留 | 门控 FFN 的基础激活之一 | 常出现在 SwiGLU 里 |
| GLU | 一个分支生成内容,一个分支生成门控 | 门控前馈网络 | 权重形状和普通 FFN 不同 |
| SwiGLU | SiLU(gate) * up 后再下投影 | 许多现代 decoder-only LLM 常用 | 能力和效率都好,但转换、量化和 LoRA 目标层要识别 gate/up/down |
门控 FFN 不是简单多一个激活函数,而是让模型学会“哪些中间特征现在该开、哪些该关”。这会影响容量、稀疏性、权重命名和微调目标层选择。
| 成本来源 | 受什么影响 | 优化方向 | 风险 |
|---|---|---|---|
| GEMM 计算 | hidden size、intermediate size、batch、sequence length | 融合 kernel、张量并行、批处理 | 小 batch 可能吃不满 GPU |
| 激活内存 | 训练时需要保存中间激活反传 | gradient checkpointing、重计算 | 吞吐下降,训练时间变长 |
| 权重带宽 | 参数量、量化格式、设备内存带宽 | INT8 / 4bit 量化、权重预取 | 质量退化和后端兼容风险 |
| 门控分支 | gate / up / down 多组投影 | 算子融合、正确识别权重名 | 转换和 LoRA 配置容易漏层 |
| 模型类型 | FFN 怎么变 | 好处 | 工程代价 |
|---|---|---|---|
| Dense Transformer | 每层每个 token 都经过同一组 FFN 权重 | 实现简单、吞吐稳定、部署成熟 | 总参数和激活参数一致,扩容成本高 |
| MoE Transformer | 部分 FFN 被替换成多个专家,token 只路由到少数专家 | 总容量变大,单次激活参数可控 | 路由、负载均衡、跨卡通信和尾延迟复杂 |
| Shared Expert | 共享 FFN + 路由专家混合 | 保留通用能力,同时增加专家容量 | 实现和权重格式更复杂 |
| Fine-tuned Expert | 只调部分专家或 adapter | 可降低微调成本 | 容易造成路由偏移和任务不均衡 |
FFN 本来就是逐 token 的非线性加工层,把它拆成多个专家比较自然。Attention 负责全局信息路由,FFN / Expert 负责局部特征加工,两者分工不同。
| 场景 | 要看什么 | 常见坑 | 继续深入 |
|---|---|---|---|
| 权重转换 | gate_proj、up_proj、down_proj、激活函数配置 | 把 SwiGLU 当普通 FFN 转,能加载但质量坏 | 参数 / 权重 / Checkpoint |
| LoRA / Adapter | target modules 是否包含 gate / up / down | 只调 attention,忽略 FFN 可能限制任务适配 | 微调 / 对齐 |
| 量化 | FFN 大矩阵的量化误差和校准集覆盖 | 看似困惑度变化小,复杂任务退化明显 | 压缩 / 量化 |
| 推理引擎 | 激活函数、门控乘法、down projection 是否融合 | 后端不支持某种激活或 kernel 慢 | 推理计算 |
| 可解释性 | MLP 神经元、特征方向和残差写入 | 把单个神经元过度解释成单一概念 | 模型内部表征 |
FFN 问题常在权重转换、量化、kernel 融合和 adapter 目标层里暴露。证据包要证明 gate / up / down、激活函数和残差写入都对齐。
| 证据节点 | 必须记录字段 | 用来排查什么 |
|---|---|---|
| ffn_config | hidden_size、intermediate_size、activation_fn、gate_proj_shape、up_down_shape | 架构配置和权重张量是否一一匹配 |
| adapter_target | target_modules、rank、adapter_scale、merge_script_hash、eval_slice | LoRA / Adapter 是否正确写入 FFN 路径 |
| kernel_path | activation_kernel、fused_mlp_version、dtype、backend_name、logits_diff | 推理后端和原框架的激活、门控实现是否一致 |
| quant_error | quantization_recipe、calibration_set_id、per_layer_error、rollback_target | FFN 大矩阵量化后是否伤害复杂任务和长尾能力 |
Transformer 页给出 block 骨架;Norm / Residual 页解释稳定主路;本页解释子层内部的非线性加工和容量来源。理解它之后,再看 MoE、权重文件、量化、LoRA 和可解释性,会更容易把“参数在哪里、计算在哪里、能力在哪里”对上。