语言模型与架构模块三 · MoE / 长上下文代码概念约 16 分钟
MoE 与长上下文
用「稀疏激活」把参数做大、算力不涨;把窗口拉长
学完这节你能:
- 理解 MoE 的稀疏激活与路由
- 说清 MoE「省算力但费显存」的原因
- 了解长上下文的位置外推与二次复杂度问题
混合专家 MoE
MoE 把一个大 FFN 换成很多个「专家」子网络,加一个路由网络。每个 token 只被送到 Top-K 个专家(稀疏激活),所以总参数很大、但每步实际算的只有一小部分。
MoE 路由核心(对应样题填空:用 softmax 成分布,再 topk 选专家)
router_logits = self.gate(x_flat) # (tokens, num_experts)
router_probs = F.softmax(router_logits, dim=-1) # 沿专家维归一化
topk_w, topk_idx = torch.topk(router_probs, self.top_k, dim=-1) # 选 Top-K 专家🔑 MoE 一句话:计算量≈稠密模型(只激活少数专家),但显存远大(所有专家参数常驻)+ 有 All-to-All 通信开销。路由还要靠负载均衡避免专家旱涝不均。
长上下文
- 难点一:标准自注意力复杂度是 O(n²),序列翻倍计算量翻四倍;KV 缓存也随长度线性涨。
- 难点二:位置外推——ALiBi 在注意力分数上按距离加线性偏置、RoPE 插值等,让模型能处理比训练时更长的序列。
- 常用训练法:渐进式训练,先短序列再逐步加长;并需要高质量长文本数据。
自测关于 MoE,正确的是:
// 带走一句话
MoE=稀疏激活(Top-K 专家),算力省但显存大+需通信;长上下文卡在 O(n²) 与位置外推(ALiBi/RoPE 插值)。
独立练习
做到这些,才算完成本节
- 为 8 个 token、4 个专家、Top-2 路由写出派发矩阵并统计每个专家负载。
- 构造所有 token 路由到同一专家的失败案例,说明容量限制和负载均衡损失的作用。
- 在本地运行代码,打印每个关键张量的 shape。
- 关闭示例后从空文件重写核心部分,并补一个异常或边界测试。
- 合上正文,用自己的话解释核心概念。
- 写出一个相似概念,并说明两者最关键的区别。
学习记录
记录本节阅读进度
建议先独立回答自测。读完记录不等于已经掌握。