Engram¶
背景知识
原文:Cheng et al. Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models. 20261。本文提炼论文中的核心技术方案与设计权衡。
Engram 如何工作¶
Engram 给模型内置一个静态 N-gram 字典,存储固化的知识,在前几层通过判断当前上下文是否与这些知识相似,如果相似就将知识权重并入当前状态,从而提升模型效果。
核心目标¶
问题:标准 Transformer 在前几层需要消耗大量计算来重建静态知识。例如识别 "大数据" 需要多个早期层逐步组合特征,本质是昂贵的运行时静态查找表重建。
方案:Engram 将这些静态知识预先存储在 embedding 表中,在前几层直接判断当前上下文是否与这些知识相似,如果相似就将知识权重并入当前状态,避免重复计算。
Embedding 表制备¶
Engram 的 embedding 表通过端到端训练学习得到(使用 Adam 优化器,学习率比模型其他参数高 5×)。查询时需要额外的投影层:将通用 tokenizer 的原始 token IDs 通过 NFKC 规范化、小写等规则映射到压缩 IDs,对 128k tokenizer 可减少 23% 的有效词汇表规模,提升语义密度。Engram-27B 使用 5.7B 参数的 embedding 表,Engram-40B 扩展至 18.5B。
推理流程¶
1. 提取 N-gram¶
对输入序列中的每个位置,提取以该位置结尾的连续 token 序列(suffix N-gram)。一般 N=3,即使用 2-gram 和 3-gram。
2. 哈希查询¶
通过哈希函数查找对应的 embedding 向量(固化的知识)。
对 2-gram [ID_数, ID_据]:
hash([ID_数, ID_据]) → 索引 12345 → e_t = [0.1, 0.2, 0.3, ...]
对 3-gram [ID_大, ID_数, ID_据]:
hash([ID_大, ID_数, ID_据]) → 索引 67890 → e_t = [0.4, 0.5, 0.6, ...]
这些 embedding 向量是训练时学到的固化知识,编码了 "数据" 和 "大数据" 的语义。
3. 按权重并入知识¶
用当前隐藏状态与检索到的知识计算相似度,按相似度权重并入知识。
当前隐藏状态: h_t = [0.5, 0.6, 0.7, ...] ← 模型对当前上下文的内部理解
检索到的知识: e_t = [0.1, 0.2, 0.3, ...] ← 固化的 "数据" 知识
计算相似度权重:
α = σ(h_t · e_t) ← α ∈ [0,1]
按权重并入:
h_new = h_t + α · e_t
如果当前上下文确实在讲 "数据",α 接近 1,知识被充分并入;如果不是,α 接近 0,知识被抑制。
配置参数¶
| 参数 | 典型值 | 说明 |
|---|---|---|
| N-gram 阶数 N | 3 | 使用 2-gram + 3-gram |
| 哈希头数 K | 8 | 每个 N-gram 用 8 个哈希头减少冲突 |
| Engram 所在层 | 如第 2 层和第 15 层 | 早期插入可卸载局部模式重建,但需权衡上下文查询质量(详见论文 Section 6.2) |
| embedding 维度 | 1280 | 固化知识的向量维度 |
| embedding 表共享 | 全局共享 | 不同层的 Engram 使用同一个 embedding 表,避免重复存储相同知识 |
Engram vs RAG vs Fine Tuning¶
| 维度 | Engram | RAG | Fine Tuning |
|---|---|---|---|
| 知识存储 | 模型内部(embedding 表) | 外部系统(向量库) | 模型内部(权重) |
| 知识更新 | 重新训练 | 直接更新文档 | 重新训练 |
| 推理成本 | 极低(确定性查找) | 中等(检索+生成) | 无额外成本 |
| 知识时效性 | 训练时固定 | 实时更新 | 训练时固定 |
| 适用场景 | 静态高频(API、公式) | 动态外部(新闻、文档) | 领域适配、风格迁移 |
参考资料¶
-
Cheng et al. Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models. 2026. https://github.com/deepseek-ai/Engram ↩