内容提要
DeepSeek-V4.1 在第1、14层引入 Engram 条件记忆:按 token 的 2/3/4-gram 哈希查表,用中国剩余定理以 8 个头区分 n-gram,经门控加入残差流。两张表共 196B 参数,FP8 存储,不占激活参数。相比原版去掉因果卷积、改用 Sinkhorn 更新,推理与事实问答提升明显。
延伸解读
哈希碰撞与多头设计
Engram 用哈希把 n-gram 映射到固定大小的表,碰撞不可避免。每个头约 1600 万行,2-gram 平均 600 种撞到同一行。但 8 个头各用不同素数取模,两个不同 n-gram 最多在 2 个头里碰撞,其余 6 个头行号不同。这基于中国剩余定理:三个素数乘积约 4×10^21,大于 2^63,所以 8 行合起来能唯一确定混合值。
门控的工程细节
查表结果经线性层变成 4 个 key 和 1 个 value,每条残差流用自己的 key 计算门控。点积除以 sqrt(d) 使无关向量分数在 1 附近,相关向量可达几十。sigmoid 前多一步带符号平方根,将范围压到 ±8.5,避免饱和并放大小分数。论文公式未写此步,但代码如此,实现需以代码为准。
参数分配与效果
Engram 论文在 27B MoE 上实验,将部分 expert 换成 5.7B Engram 表,总参数和激活参数不变。结果推理类基准如 BBH 提升明显,事实问答 TriviaQA 提升较少。屏蔽 Engram 输出后,事实问答得分只剩 29%-44%,说明模型将事实知识存储在表中。V4.1 中 Engram 占不激活参数约 27%,接近论文建议的 20%-25% 区间。
存储与推理优化
两张表共 196B 参数,FP8 存储约 197GB,每行 256 字节加 8 字节 scale。每个 token 每层取 24 行,约 6.3KB,计算量仅一次 6144→25600 矩阵乘法,因此不计入激活参数。推理时表可放主机内存,靠 RDMA 预取,与第 0 层计算重叠。官方参考实现则按行切分到各 GPU,查表后 all-reduce 汇总。
Q&A
DeepSeek-V4.1 中的 Engram 是什么?它和 MoE 有什么区别?
Engram 是 DeepSeek-V4.1 在第 1 层和第 14 层引入的条件记忆模块。它按当前 token 结尾的 2、3、4-gram 做哈希查表,取出的向量经门控后加进残差流。与 MoE 的条件计算(每个 token 只激活一小部分 expert)不同,Engram 是条件记忆:每个 token 只从一张大表里取出几行。两者都让总参数远大于每个 token 实际用到的参数。
Engram 为什么用哈希而不是直接建 n-gram 表?
因为直接建 n-gram 表放不下。V4.1 的词表是 129280,2-gram 就有约 1.7×10^10 种,3-gram 约 2×10^15 种。所以退一步:准备一张 M 行的表,用哈希函数把 n-gram 映到 0 到 M-1 之间的行号。不同的 n-gram 会撞到同一行,这叫碰撞。Engram 的设计就是在处理「n-gram 种类太多」和「碰撞」这两件事。
Engram 的哈希函数具体是怎么计算的?
对位置 t 和阶 n,混合值 mixt,n = 异或_{i=0}^{n-1} (x'_{t-i} · m_i),其中 x' 是压缩后的 token id,m_i 是 4 个固定的大奇数,按位异或。然后对 8 个不同的素数取模得到 8 个行号:z_{t,n,k} = mixt,n mod p_{n,k},k=1..8。同一阶的 8 个头共用一个混合值,只是模的素数不同。
Engram 为什么用 8 个头?中国剩余定理在这里起什么作用?
每个头的表约 1600 万行,单个头碰撞严重。用 8 个头,每个头有自己的一段表,把取出的 8 行拼起来。根据中国剩余定理,一个小于 2^63 的数由它对任意 3 个约 1.6×10^7 的素数的余数唯一确定。两个混合值不同的 n-gram 最多在 2 个头里撞到同一行,其余 6 个头取出的行一定不同。所以 8 行合起来唯一对应一个混合值。
Engram 的门控机制是如何工作的?
查表得到的 6144 维向量 e_t 经一个线性层变成 4 个 key(每条残差流一个)和 1 个共用的 value。对每条残差流 h^(m),计算归一化点积 s^(m) = RMSNorm(h^(m))^T RMSNorm(k^(m)) / sqrt(d),然后经过带符号的平方根再 sigmoid 得到门 α^(m),最后 h^(m) ← h^(m) + α^(m) v。4 条流各有自己的门,加的是同一个 v。
Engram 的 196B 参数是怎么来的?如何存储和取用?
每层有 24 个头,每个头对应一个素数行数,两层共 768,022,850 行,每行 256 维,合计约 196.6B 参数。表用 FP8 存储,每个参数 1 字节,量化 scale 每行每 32 维一个。每个 token 每层取 24 行,每行 256 字节加 8 字节 scale,约 6.3 KB。计算量只有 wkv 那一次 6144→25600 的矩阵乘法,所以 196B 不算进激活参数。
DeepSeek-V4.1 相对原版 Engram 做了哪些改动?
有两处改动:一是去掉了短因果卷积。原版在门之后还有一步核大小为 4 的 depthwise 因果卷积,V4.1 去掉它,因为收益抵不上推理复杂度的增加。去掉后 Engram 在位置 t 的输出只依赖最近 4 个 token 的 id 和当前残差流,不需要跨步状态。二是表的优化器从 Adam 换成 Sinkhorn-balanced update,只需要一份动量,同时用在 token embedding 和预测头上。
Engram 论文报告了哪些效果?
在 27B MoE 模型上,把一部分 expert 换成 5.7B 的 Engram 表,总参数和激活参数不变。MMLU 从 57.4 涨到 60.4,CMMLU 从 57.9 涨到 61.9,BBH 从 50.9 涨到 55.9,ARC-Challenge 从 70.1 涨到 73.8,HumanEval 从 37.8 涨到 40.8,TriviaQA 从 48.8 涨到 50.7。推理类基准涨得最多,事实问答涨得少。屏蔽 Engram 输出后,事实问答得分只剩 29% 到 44%,阅读理解还剩 81% 到 93%。