banner
约 10,800 字
36 分钟

Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models 论文阅读

摘要

结合 DeepSeek 与北京大学的 Engram 论文 v2 及官方演示代码,逐步解释 N-gram 哈希查表、上下文门控、多分支融合、训练与主机内存预取,并用手算例子和实验条件说明效果边界。另按知识更新、引用、权限、成本及无线感知研究场景,对比 Engram 与文档 RAG 的适用范围。

理解 Engram,需要把模型的两个动作分开看:一部分计算用于处理当前上下文,另一部分计算反复重建已经学过的局部模式。例如,模型读到 Alexander the Great,仍要通过若干层计算,把几个 token 组合成一个实体表示。DeepSeek 与北京大学的这项工作尝试给这种模式增加一条查表路径:根据局部 token 序列确定地址,取出训练得到的向量,再由当前上下文决定注入多少。

Engram 扩展的是模型内部的可训练记忆容量。RAG 检索的是模型能够读取的外部材料。两者都涉及检索,但存储内容、更新方式和接入位置差别很大。论文没有提供 Engram 与文档 RAG 的直接对照实验,不能根据几个基准分数判断谁能够替代谁。

项目

核验信息

论文

Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models

作者与机构

Xin Cheng、Rui Tian、Wangding Zeng、Damai Dai 等,北京大学与 DeepSeek-AI,完整名单见原文

版本

arXiv:2601.07372,首版 2026-01-12,本次阅读 v2,修订日期 2026-07-12

发表状态

按已核验的 arXiv 预印本介绍,不推定会议或期刊录用

原文

摘要与版本记录、v2 全文、v2 PDF

官方实现

deepseek-ai/Engram,本次检查提交 fb7f84a21f91223715394a33a1dc24bbfb7f788e

研究任务

自回归语言建模,在参数与训练计算预算约束下改进模型能力及存储效率

阅读前提

token、Embedding、Transformer 残差连接,以及 MoE 的总参数与激活参数区别

证据范围

数值来自作者实验,代码部分来自官方演示实现的静态检查,本次未复现预训练或吞吐测试

下面这张总览图可以先沿着箭头读一遍:底部 token 同时进入主干与哈希分支,查表结果经过投影、门控和卷积,最后加回主干的隐藏状态。

Engram 原论文图 1:局部 N-gram 查表与 Transformer 主干的融合
Engram 原论文图 1:局部 N-gram 查表与 Transformer 主干的融合

来源:Xin Cheng、Rui Tian 等,论文 v2 图 1,第 3 页,CC BY 4.0。图片裁去页面边缘,保留架构主体。左侧是插入位置,右侧是 Engram 内部流程。

从 MoE 的条件计算,到 Engram 的条件记忆

先区分总参数、激活参数和存储开销

一个 MoE 模型可以保存很多专家,每个 token 只经过其中少量专家。总参数决定需要保存多大的模型,激活参数与实际执行的算子决定每个 token 的主要计算量。两者不能混用。

MoE 的路由依据隐藏状态,回答的是当前 token 应由哪些计算模块处理。Engram 根据局部 token ID 直接计算地址,回答的是应取出哪些已经学到的向量。前者提供动态计算能力,后者增加一类稀疏访问的参数容量。

论文提出的假设是:高频实体、固定表达和局部组合中,有一部分表示重建工作可以交给查表完成。主干因此可能把更多计算用于上下文整合和后续推理。这个假设有实验与表示分析支持,适用范围仍取决于训练数据、模型配置和具体任务。

这里的记忆究竟存了什么

Engram 表中的一行是一组浮点参数。它在训练中受到语言建模损失的更新,携带某些局部模式的统计表示。单独读出一行,通常得不到一条可读的事实陈述。

例如,把 无线信道状态信息 的若干 token 映射到地址之后,取出的向量可能有助于后续语义建模,但这行参数没有附带论文 DOI、作者、来源日期或实验设置。它也没有天然对应一份可以删除、替换、授权访问的文档。

因此,要区分几类容易同名的记忆:

机制

保存的主要内容

生命周期

Engram

训练得到的 N-gram 相关向量参数

跨请求保留,随训练或参数更新变化

Attention 的 KV Cache

当前序列各层已计算的 Key、Value

服务于当前推理序列

Agent 会话记忆

对话、任务记录、摘要或用户偏好

由应用负责写入、更新和删除

文档 RAG

外部文档、索引及来源元数据

可独立于生成模型维护

把 Engram 表移到 CPU 内存,改变的是参数的物理存放位置。它仍然属于模型参数。

一个 token 怎样经过 Engram

先看单分支形式。设输入序列为 x1,…,xTx_1,\ldots,x_T,某个插入层的隐藏状态为 H(ℓ)∈RT×dH^{(\ell)}\in\mathbb{R}^{T\times d}。Engram 同时接收原始 token ID 和这一层的隐藏状态,输出同形状的增量 YY:

H(ℓ)←H(ℓ)+Y.H^{(\ell)}\leftarrow H^{(\ell)}+Y.

随后继续执行该块中的 Attention 与 MoE。原论文图 1 把 Engram 放在这两个子模块之前。主实验只在指定层插入,并非每个 Transformer 块都加一张大表。

完整路径可以写为:

纯文本
原始 token ID
  → 查表专用的 ID 规范化
  → 构造当前位置的后缀 2-gram、3-gram
  → 每个阶数做多头哈希
  → 读取若干 Embedding 行并拼接
  → 生成 Key 和 Value
  → 用当前隐藏状态计算门控
  → 因果短卷积与局部残差
  → 加回 Transformer 隐藏状态
  → Attention、MoE 及后续层

这条路径包含几个不同的设计问题:怎样减少重复存储,怎样控制组合空间,怎样处理歧义,怎样让局部信息进入已有主干。下面逐项拆开。

查表专用的 tokenizer 压缩

普通 tokenizer 要支持文本还原,所以大小写、空格前缀、部分字符变体可能占用不同 token ID。Engram 预先建立一个映射:

P:V→V′,xt′=P(xt).P:V\rightarrow V',\qquad x'_t=P(x_t).

VV 是原词表,V′V' 是规范化后的查表词表。官方演示代码包含 Unicode 规范化、去除重音、转小写及空白处理。论文附录 C 给出的有效词表缩减比例为 23.43%。

这里压缩的是查表地址使用的词表。原始 token 仍进入主干,序列长度 TT 没有因此减少。不能把这项结果解释成输入 token 数减少 23%,也不能据此推算 KV Cache 缩小 23%。

这样做能让一些形式相近的 token 共享地址表示,节省稀疏表容量。代价也明确:查表分支会丢失某些大小写或重音区别。主干仍能看到原始 token,但是否能在具体任务中补回这些区别,需要实验验证。

为什么取当前位置的后缀 N-gram

对阶数 nn,当前位置 tt 的查表键为:

gt,n=(xt−n+1′,…,xt′).g_{t,n}=(x'_{t-n+1},\ldots,x'_t).

它只使用当前 token 和之前的 token,符合自回归生成的因果约束。序列开头不足长度时,演示实现使用 padding。这里的 gram 单位是 token,不能默认等同于一个完整单词或一个汉字。

主实验使用 2-gram 与 3-gram。单 token 的基本表示已有输入 Embedding 承担,Engram 着重补充短序列的组合信息。它仍依赖 Attention 处理更长范围的关系。

多头哈希怎样控制表的大小

直接为所有可能的三元组建立独立条目,组合数会随词表大小迅速增加。Engram 给每个阶数配置 KK 个哈希头,每个头把 N-gram 映射到有限长度的表:

zt,n,k=φn,k(gt,n),et,n,k=En,k[zt,n,k].z_{t,n,k}=\varphi_{n,k}(g_{t,n}),\qquad e_{t,n,k}=E_{n,k}[z_{t,n,k}].

En,kE_{n,k} 是可训练表,zt,n,kz_{t,n,k} 是整数行号。不同头使用不同的素数表长。官方代码先对各位置的 token ID 做乘法,再以 XOR 混合,最后分别取模。乘法系数还随插入层变化。

各个头取出的向量直接拼接:

et=Concatn=2NConcatk=1Ket,n,k∈Rdmem.e_t=\mathop{\mathrm{Concat}}_{n=2}^{N}\mathop{\mathrm{Concat}}_{k=1}^{K}e_{t,n,k} \in\mathbb{R}^{d_{\mathrm{mem}}}.

主实验 N=3N=3、K=8K=8,所以每个 token、每个 Engram 层需要读取 16 个头的条目。不同 N-gram 可以在某个头上碰撞,但在全部头上获得同一组地址的机会更低。碰撞仍然存在,不能把这种设计称为无冲突的精确检索。

论文所说的 O(1)O(1) 查找,需要固定最大阶数和头数,主要表示定位条目不必扫描整张表。实际耗时仍包括哈希、随机读取、向量搬运、投影和同步。整段输入的成本还随序列长度增长。

上下文门控为什么必要

局部词组相同,含义可能不同。哈希碰撞也会把无关模式压到同一行。直接把所有查表结果加进主干,容易注入噪声。

Engram 让当前隐藏状态 hth_t 充当 Query,查表向量 ete_t 生成 Key 和 Value:

kt=WKet,vt=WVet.k_t=W_K e_t,\qquad v_t=W_V e_t.

两边经过 RMSNorm,再计算缩放点积与 sigmoid:

st=RMSNorm(ht)⊤RMSNorm(kt)d,αt=σ(st),v~t=αtvt.s_t=\frac{\mathrm{RMSNorm}(h_t)^\top\mathrm{RMSNorm}(k_t)}{\sqrt d}, \qquad \alpha_t=\sigma(s_t),\qquad \widetilde v_t=\alpha_t v_t.

αt\alpha_t 是当前位置的标量,范围在 0 到 1 之间。它控制整个 Value 向量的注入强度。这里没有对全表做 softmax,也没有逐行比较全部记忆向量。

前面层的 Attention 已让 hth_t 汇集一部分因果上下文,所以同一个局部键在不同前文下可以获得不同门值。投影和门控也会随训练学习适配关系。

门值反映模型学到的匹配程度。它没有核查证据来源的接口,无法保证错误事实、歧义或碰撞一定被排除。把它称为事实校验器,会超出设计与实验的支持范围。

因果短卷积补了哪一部分

单个 v~t\widetilde v_t 主要来自当前位置的局部键。作者再沿序列方向加入逐通道的因果短卷积:

Y=SiLU(Conv1D(RMSNorm(V~)))+V~.Y=\mathrm{SiLU}\left(\mathrm{Conv1D}\left(\mathrm{RMSNorm}(\widetilde V)\right)\right)+\widetilde V.

主配置的卷积核大小为 4,膨胀率等于最大 N-gram 阶数,即 3。对某个输出位置,卷积读取门控 Value 序列中的 t,t−3,t−6,t−9t,t-3,t-6,t-9,只看过去,不读未来。按这些中间位置计算,感受野跨度为 10。

这个跨度不能作为模型总体上下文长度。每个门控 Value 还依赖已经包含上下文的隐藏状态,后续也有 Attention。短卷积承担的是低成本的局部混合与非线性变换。

公式中保留了 +V~+\widetilde V。主实验把卷积参数初始化为零,起点有 Y=V~Y=\widetilde V,于是卷积子块暂时保持其输入。这不等于整个 Engram 输出为零,更不能据此说初始模型与完全不含 Engram 的主干严格相同。

接入多分支主干后,张量怎样变化

论文默认使用 mHC,残差状态有 M=4M=4 个分支。加入批次维度后,隐藏状态形状可写成:

H∈RB×T×M×d.H\in\mathbb{R}^{B\times T\times M\times d}.

一组查表向量由所有分支共享,Value 投影 WVW_V 也共享。每个分支有独立的 Key 投影 WK(m)W_K^{(m)},并用自己的 ht(m)h_t^{(m)} 计算门值:

αt(m)=σ(RMSNorm(ht(m))⊤RMSNorm(WK(m)et)d),ut(m)=αt(m)WVet.\alpha_t^{(m)}=\sigma\left( \frac{\mathrm{RMSNorm}(h_t^{(m)})^\top \mathrm{RMSNorm}(W_K^{(m)}e_t)}{\sqrt d} \right),\qquad u_t^{(m)}=\alpha_t^{(m)}W_Ve_t.

共享表避免复制昂贵的存储,独立门控允许不同残差分支使用同一份记忆时有不同强度。论文还说明这些投影可以融合为一次较大的 FP8 矩阵乘法,这是系统实现方向,不代表公开演示代码已经包含同样的融合内核。

Engram 的基本思路不要求模型必须使用 mHC。论文中的默认结果包含这项主干配置,迁移到其他结构时需要重新验证。

手算一次查表与注入

下面是依据原文机制设计的教学例子,ID、哈希表长、乘法系数和门控分数均为示意数值,不对应作者模型里的真实条目,也没有运行原模型。

取原图中的片段 Alexander the Great,为便于手算,假设三个词恰好各对应一个 token。规范化 ID 分别为:

纯文本
Alexander → 11
the       → 7
Great     → 23

在 Great 的位置,2-gram 是 (7,23),3-gram 是 (11,7,23)。按从当前 token 向过去的顺序,选乘法系数 (3,5,7):

mix2=(23×3)XOR(7×5)=69XOR35=102.\mathrm{mix}_2=(23\times3)\mathbin{\mathrm{XOR}}(7\times5) =69\mathbin{\mathrm{XOR}}35=102.
mix3=102XOR(11×7)=102XOR77=43.\mathrm{mix}_3=102\mathbin{\mathrm{XOR}}(11\times7) =102\mathbin{\mathrm{XOR}}77=43.

为把计算缩短到纸上,这里每个阶数只用两个头,表长分别取互不相同的素数:

阶数与头

混合值

表长

取出的行

2-gram,头 1

102

11

102 mod 11=3102\bmod11=3

2-gram,头 2

102

13

102 mod 13=11102\bmod13=11

3-gram,头 1

43

17

43 mod 17=943\bmod17=9

3-gram,头 2

43

19

43 mod 19=543\bmod19=5

随后读取四张逻辑表中的四行,拼成 ete_t。同样的行号属于不同头时仍指向不同参数,不能把这些头当成一张表的重复读取。

投影得到 ktk_t 和 vtv_t,用当前 hth_t 计算门控。假设归一化点积得到 st=1.2s_t=1.2,则:

αt=σ(1.2)≈0.769,v~t≈0.769vt.\alpha_t=\sigma(1.2)\approx0.769,\qquad \widetilde v_t\approx0.769v_t.

卷积结合过去的门控 Value,产生 YtY_t,再执行 ht←ht+Yth_t\leftarrow h_t+Y_t。更新后的表示继续通过 Attention、MoE 和后续层,最终由输出头产生下一 token 的概率。

查表不会在这里直接返回一句有关亚历山大的百科解释。它提供一个可供后续计算使用的表示增量。若把前文换掉、保留相同局部键,取出的表项仍可相同,而 hth_t 和门值会变化。地址由局部 token 决定,融合强度由上下文决定。

这些向量怎么学,推理时又怎样读取

训练信号来自下一 token 预测

Engram 与主干一起优化语言建模目标:

L=−∑tlog⁡pθ(xt+1∣x≤t).\mathcal L=-\sum_t\log p_\theta(x_{t+1}\mid x_{\le t}).

一次前向中,被地址命中的行参与投影、门控和残差计算。反向传播时,梯度经过这些算子回到对应表项及主干。哈希函数负责离散寻址,不需要对整数行号求导。

如果两个 N-gram 在某个头中碰撞,它们会更新同一行参数。多头和门控能够缓解共享带来的干扰,但没有把共享彻底消除。表很大时,低频条目得到的训练信号也可能不足。

因此,不能拿一份新闻正文放进某个地址,就期待模型立刻具备相应知识。参数表示必须与投影、主干及训练目标协同适配。论文没有给出把文档直接写进 Engram、立即替换事实的通用接口。

训练的大表为什么仍有系统成本

图 2 左侧给出训练时的分片与通信关系。大表可以按参数分布在多张设备上,查表时通过 All-to-All 等通信取回所需行,反向再传递梯度。

Engram 原论文图 2:训练分片与推理阶段的主机内存预取
Engram 原论文图 2:训练分片与推理阶段的主机内存预取

来源:Xin Cheng、Rui Tian 等,论文 v2 图 2,第 5 页,CC BY 4.0。裁剪保留训练、推理两部分。

每次只读少量行,能控制激活计算,却不能消除全表的存储、优化器状态、分布式通信和长尾访问成本。主实验对 Embedding 使用 Adam,优化状态本身还会增加训练内存需求。推理卸载结果不能直接推导为训练也能无成本卸载。

CPU 预取为什么比动态专家路由更容易安排

Engram 地址只依赖 token ID。当前输入一旦确定,后面多个 Engram 层要读哪些条目就可以提前计算。

在 prompt 的 prefill 阶段,整个输入序列已经给定,可以批量生成地址。在逐 token 解码时,新生成的 token 进入下一轮计算后,才能确定它相关的后缀地址。未来尚未生成的 token 无法提前知道。

这给了系统一段可重叠的时间:GPU 计算前面的 Transformer 层,主机同时准备后面 Engram 层需要的向量,并发起传输。动态 MoE 路由依赖对应层的隐藏状态,无法仅凭原始 token 提前确定全部后续专家选择。

插入位置需要同时考虑建模和系统条件。太晚注入,主干可能已经花掉局部组合的计算。太早注入,门控上下文较弱,能用于隐藏 I/O 的前序计算也较少。论文在较早层和中间层共同插入,正是在处理这些约束。

解码时需要保留哪些状态

从算法上看,哈希分支可以维护最近 N−1N-1 个规范化 token ID,不必每次重新扫描完整前缀。因果卷积也可以缓存所需的历史门控 Value。Attention 的 KV Cache 仍按原主干维护。

这是一种增量实现思路。官方演示脚本按完整输入做 NumPy 哈希和卷积,没有提供完整的逐 token 缓存、CPU/GPU 重叠传输或生产调度实现。

论文讨论了利用访问频率偏斜,把高频条目留在较快存储、长尾条目放在较慢层级的方向。后文的具体吞吐数据来自主机 DRAM 卸载测试,不能拿它保证 NVMe、普通笔记本或任意服务负载也有相同开销。

参数预算怎么分:MoE 与记忆的配比

加一张更大的表容易带来更多总参数。论文先处理一个更严格的问题:固定总参数与训练 FLOPs,把稀疏容量从专家挪给 Engram,是否仍然有效。

设总参数为 PtotP_{\mathrm{tot}},每 token 激活参数为 PactP_{\mathrm{act}},可分配的非激活稀疏容量为:

Psparse=Ptot−Pact.P_{\mathrm{sparse}}=P_{\mathrm{tot}}-P_{\mathrm{act}}.

在第 3 节的预算定义下,ρ\rho 表示分给 MoE 的比例:

PMoE(sparse)=ρPsparse,PEngram=(1−ρ)Psparse.P_{\mathrm{MoE}}^{(\mathrm{sparse})}=\rho P_{\mathrm{sparse}},\qquad P_{\mathrm{Engram}}=(1-\rho)P_{\mathrm{sparse}}.

这里的比例针对稀疏预算,不能换成整个模型总参数的比例。该节统计还排除了基础词表与输出头,阅读其他表格时要保留口径差异。

Engram 原论文图 3:有限预算下的配比分配与放宽存储预算后的扩表结果
Engram 原论文图 3:有限预算下的配比分配与放宽存储预算后的扩表结果

来源:Xin Cheng、Rui Tian 等,论文 v2 图 3,第 7 页,CC BY 4.0。左图横轴为分给 MoE 的稀疏预算比例,右图横轴为 Embedding 槽位数,对数刻度。左图两组实验使用不同纵轴,不能直接比较曲线高度。

左图使用 2×10202\times10^{20} 与 6×10206\times10^{20} FLOPs 两档预算,对应约 5.7B/9.9B 总参数及 568M/993M 激活参数。验证损失随配比呈 U 形:全部分给 MoE 没有利用查表容量,过度挪给记忆又会减少动态计算容量。较优区域的 ρ\rho 约为 0.75 到 0.80,即稀疏预算约有 75% 到 80% 分给 MoE。其中较大实验的验证损失由纯 MoE 的 1.7248 降至约 1.7109。

这个范围来自特定模型、数据和预算的实验。它适合用来设计新的配比搜索,不能当成所有模型都应采用的常数。

右图换了问题:固定一个约 3B 总参数、568M 激活参数的 MoE 主干,允许额外增加 Engram 存储,训练 100B token。槽位数从约 2.58×1052.58\times10^5 增到 10710^7,最多增加约 13B 参数,验证损失继续下降。作者将这组实验称作无限记忆场景,它实际表达的是放宽存储约束,实验规模仍然有限。

右图也包含 OverEncoding 作为对照,后者在该设置下把 N-gram 表示与词表 Embedding 融合。曲线支持 Engram 在所测槽位区间扩表有效,不能外推为任何规模都保持同一收益,更没有抹去大表的内存与训练成本。

主实验应该怎样读

先把公平比较的条件对齐

论文第 4 节使用相同数据及数据顺序训练 262B token。主干为 30 个 Transformer 块,隐藏维度 2560,32 头 MLA,mHC 扩展率为 4。上下文长度 4096,批次大小 1280,训练 50000 步。词表大小为 129280。

配置

MoE-27B

Engram-27B

Engram-40B

总参数

26.7B

26.7B

39.5B

每 token 激活参数,不含 token Embedding

约 3.8B

约 3.8B

约 3.8B

路由专家数

72

55

55

共享专家数

2

2

2

每 token 激活路由专家数

6

6

6

Engram 参数

无

5.7B

18.5B

Engram-27B 从专家容量中重新分配参数,构成等总参数、等训练 FLOPs 的主要对照。Engram-40B 保持同类计算预算、继续增加表容量,总参数已经不同,适合回答扩表问题。

主 Engram 配置在第 2、15 层插入,使用 2/3-gram、每阶 8 头,论文记拼接维度 dmem=1280d_{\mathrm{mem}}=1280。主干优化器为 Muon,Embedding 使用 Adam,后者学习率为基础学习率的 5 倍且不使用权重衰减。基础学习率为 4×10−44\times10^{-4}。这些设置来自第 4.1 节与附录 A,不能把演示脚本中的默认维度直接当作训练配方。

数据规模与结构配置已经披露,但公开仓库没有给出这套大规模训练的完整数据流水线、训练脚本与配套检查点。仅凭演示文件无法严格复现表 1。

主结果包含能力增益,也包含很小的变化

以下选取论文 v2 表 1 的结果,完整基准与 shot 配置见原表。表内准确率、EM、pass@1 的差值按百分点计算,DROP 的差值按 F1 分数计算。

基准与口径

MoE-27B

Engram-27B

差值

MMLU,5-shot Acc.

57.4

60.4

+3.0 个百分点

MMLU-Redux,5-shot Acc.

60.6

64.0

+3.4 个百分点

CMMLU,5-shot Acc.

57.9

61.9

+4.0 个百分点

C-Eval,5-shot Acc.

58.0

62.7

+4.7 个百分点

BBH,3-shot EM

50.9

55.9

+5.0 个百分点

ARC-Challenge,25-shot Acc.

70.1

73.8

+3.7 个百分点

DROP,1-shot F1

55.7

59.0

+3.3 分

HumanEval,0-shot pass@1

37.8

40.8

+3.0 个百分点

GSM8K,8-shot EM

58.4

60.6

+2.2 个百分点

MATH,4-shot EM

28.3

30.7

+2.4 个百分点

PopQA,15-shot EM

19.2

19.4

+0.2 个百分点

WinoGrande,5-shot Acc.

67.6

67.8

+0.2 个百分点

来源:论文 v2 第 4 节、表 1。摘要与引言仍写 MMLU +3.4,第 4.2 节与表 1 对应 +3.0。这里采用表格及该节的口径,不把 MMLU-Redux 的增益移到 MMLU。

这些结果支持在这组控制条件下,查表分支的收益能扩展到推理、代码和数学任务。它们没有直接说明知识与推理在参数中已经被完全分离。PopQA 和 WinoGrande 的变化也提醒我们,不同任务对新增容量的响应并不一致。

Engram-40B 的预训练损失更低,但部分基准低于 Engram-27B。例如 HumanEval 从 40.8 降至 38.4,MBPP 从 48.2 降至 46.2,C3 从 63.6 降至 61.8。作者讨论了更大记忆可能需要更多训练的解释,这仍是对观察结果的解释,不能写成已经验证的唯一原因。

附录 B 给出了训练过程中的基准曲线,有助于查看差距是否只出现在单个终点。主表没有给出足以把每个小差值都判定为统计显著的多种子置信区间。它们也是预训练研究模型的结果,不应直接等同于线上聊天产品的表现。

长上下文实验验证了什么

第 5 节用 YaRN 将上下文扩展到 32768,并额外训练 5000 步,约 30B 长上下文 token。不同起始检查点接受同样的扩展训练。

作者刻意比较了几种起点:MoE 预训练 50k 步,Engram 分别预训练 41k、46k 和 50k 步。其中 Engram-46k 与 MoE-50k 的预训练损失相同,均约为 1.63,用来构造同损失比较。

起始检查点

预训练损失

多查询 NIAH

变量追踪 VT

MoE-27B,50k 步

1.63

84.2

77.0

Engram-27B,41k 步

1.66

89.5

83.2

Engram-27B,46k 步

1.63

97.0

87.2

Engram-27B,50k 步

1.62

97.0

89.0

来源:论文 v2 第 5 节、表 2。数值越高越好。NIAH 关注从给定长输入中找回信息,VT 要求追踪输入中的变量关系。

同损失设置下仍有差距,使结果更难被简单解释为 Engram 起点质量更好。论文据此提出,局部模式由记忆承担后,Attention 可能有更多容量处理全局信息。

这组测试检索的是已经放在上下文里的信息,没有外部文档库、召回器和重排器,因此不构成 RAG 效果测试。它也没有把模型的最大上下文自动变为无限长度。

作者所说的 82% 预训练计算,对应 41/5041/50 的预训练步数比例。所有模型之后又接受同一套长上下文训练,不能把这个数字解释成整个训练流程或每次推理统一节省 18%。表 2 中也存在没有改善的子任务,需要连同完整表格判断。

表示分析与消融:哪些解释有证据

有效深度是怎样推断的

图 4 从两个角度分析中间表示。左图是 LogitLens:把各层隐藏状态映射到输出分布,计算它与该模型最终输出分布之间的 KL 散度。Engram 在一些早期层更早接近最终分布。

Engram 原论文图 4:LogitLens 与层间 CKA 表示对齐
Engram 原论文图 4:LogitLens 与层间 CKA 表示对齐

来源:Xin Cheng、Rui Tian 等,论文 v2 图 4,第 13 页,CC BY 4.0。右侧热图比较 Engram 层与 MoE 层的表示相似性。

KL 更低意味着中间预测更接近自己的最终预测,并不自动意味着更接近真实答案。这个分析适合观察预测形成过程,不能单独衡量正确率。

右侧使用 CKA 比较两套模型在 Few-NERD 实体末尾 token 上的中间表示。CKA 对表示之间的相似结构进行度量,论文用基于 HSIC 的归一化形式,并从每个 Engram 层对应的相似度中选取最高的 5 个 MoE 层,按相似度加权得到一个软对齐深度。

图中一些 Engram 浅层对应到更深的 MoE 层,例如 Engram-27B 第 5 层约对齐 MoE 第 12 层。这与提前形成实体表示的解释一致。

这种层间对应是一种机制证据。它没有严格证明模型在所有输入上等价于增加 7 层,也没有证明每次推理都节省某个固定层数。两个模型最终仍执行各自配置的全部网络块。

插入位置与结构消融

图 5 使用 12 层、约 3B 总参数、0.56B 激活参数的 MoE,训练 100B token,并附加 1.6B Engram 容量。这里与第 4 节的 27B 主对照不是同一实验。

Engram 原论文图 5:插入层选择与组件消融
Engram 原论文图 5:插入层选择与组件消融

来源:Xin Cheng、Rui Tian 等,论文 v2 图 5,第 15 页,CC BY 4.0。纵轴存在断轴,读图应看标注数值,不能按线段距离推算收益。

纯 MoE 的验证损失为 1.808。只放一个 Engram 时,第 2 层较优,约为 1.770。把同样的 1.6B 记忆拆到第 2、6 层,参考配置进一步降到 1.768。

第 2 层优于第 1 层,与门控需要一些已计算上下文相符。越晚注入又会错过早期表示构建。这个结论来自该设置的扫描,新的主干仍要重新选择插入点。

组件消融中,取消分支独立融合、取消 tokenizer 压缩、取消上下文门控,都会产生较大的损失回退。取消短卷积影响较小。在固定 Engram 参数预算下增加 4-gram 也没有改善,这可能涉及容量在不同阶数间的重新分摊,不能据此断言所有更长 N-gram 都无用。

其中 w/o multi branch 的含义需要读正文:作者保留 mHC 主干,把 Engram 改成在预映射后的隐藏状态上进行一次融合。它没有把整套 mHC 网络删除,所以这项消融不能用来量化 mHC 本身的全部收益。

关闭 Engram 与门控可视化

第 6.3 节在推理时屏蔽已训练的 Engram。事实知识相关任务的分数保留约为原分数的 29% 到 44%,阅读理解相关任务保留约 81% 到 93%。这些是相对于原模型分数的保留比例,不能直接读成任务准确率只有 29%。

实验说明模型确实学会依赖这条分支,而且不同任务依赖程度不同。训练后突然移除模块也造成分布变化,结果不能证明所有事实只存在 Engram,或阅读能力与它完全无关。

图 7 给出门控案例,颜色越深表示选中门控的数值越大。

Engram 原论文图 7:若干文本中的门控强度
Engram 原论文图 7:若干文本中的门控强度

来源:Xin Cheng、Rui Tian 等,论文 v2 图 7,第 19 页,CC BY 4.0。原文从两个插入层、四个分支共八组门控中选择语义相关性较强的一组展示。

实体和固定表达中确实能看到较强门值,但这是一组筛选后的案例。红色位置没有标注事实真伪,也不构成整个模型的完整因果解释。它适合帮助观察模块学到的响应模式。

千亿参数卸载的性能数据,需要连同条件看

第 6.4 节单独测试推理吞吐。作者使用 H800 和定制的 nano-vLLM 测试框架,选择 Dense-4B 与 Dense-8B 主干,以避免 MoE 专家并行的干扰。在第 2 块插入含 100B(1000 亿)参数的 Engram,把表完整放在主机 DRAM,利用前序计算预取。

测试包含 512 条序列,长度均匀分布于 100 到 1024。表 4 报告:

主干

不含 Engram 的吞吐

含卸载 Engram 的吞吐

按表中数值计算的下降

Dense-4B

9031.62 token/s

8858.28 token/s

约 1.92%

Dense-8B

6315.52 token/s

6140.02 token/s

约 2.78%

来源:论文 v2 第 6.4 节、表 4。下降比例按 (基线−Engram)/基线(\text{基线}-\text{Engram})/\text{基线} 计算。

这项实验说明,确定性地址与预取在特定硬件、批量和输入分布下可以隐藏大部分搬运开销。它没有同时测量所有线上场景的首 token 延迟、逐 token 尾延迟、并发争用和服务成本,也没有用主预训练实验里的 MoE-27B 完成同一测试。

存储不会消失。作为容量估算,若 100B 参数全按 BF16 保存,表本身约需 200GB 十进制容量,尚未计入其他权重、缓存和运行时开销。更低位宽可以改变这个数值,但需要额外验证量化误差和实现。低吞吐损失不能理解成普通笔记本免费获得 100B 记忆。

Engram 与 RAG:放在同一张图上比较

先限定 RAG 的比较范围

这里的 RAG 主要指常见的外部文档检索增强生成:维护文档与索引,根据问题召回材料,把材料交给生成模型。检索可采用向量、关键词、混合方式或结构化查询,不必强制使用某一种向量数据库。

Lewis 等人的原始 RAG 论文将参数模型与外部非参数记忆结合,使用 DPR 与 BART,并讨论检索器、生成器的联合训练。今天使用冻结模型搭建的应用流水线只是其中一类实现,所以也不能把 RAG 统一定义成无需训练的应用层技巧。

用简化的 RAG-Sequence 表达,可以写成:

p(y∣q)≈∑d∈TopK(q)pη(d∣q) pθ(y∣q,d).p(y\mid q)\approx\sum_{d\in\mathrm{TopK}(q)}p_\eta(d\mid q)\,p_\theta(y\mid q,d).

qq 是问题,dd 是候选文档片段,η\eta 与 θ\theta 分别代表检索器和生成器参数。常见应用实现会直接把若干检索结果拼到上下文,不一定显式执行这项概率边缘化。相关组件与当前实践可参看 Hugging Face RAG 文档及 LangChain 检索文档。

还有把外部检索深度接入模型训练的系统,例如 RETRO。因此,应用层与模型层的对比适合帮助理解常见部署,不能作为所有检索研究的绝对边界。

检索路径与生成路径的差别

纯文本
Engram 路径
当前 token 及短前缀 → 哈希地址 → 已训练向量
                                       ↓
模型隐藏状态 → 上下文门控与注入 → 后续网络 → 输出

常见文档 RAG 路径
文档 → 清洗与分块 → 索引与来源元数据
                         ↑
用户问题 → 检索与筛选 → 证据片段 → 生成模型 → 输出与引用

这两条路径都可能影响输出,但对知识的可操作性不同。下面的比较是依据两类机制做的工程分析,不属于 Engram 论文中的直接对照结果。

维度

Engram

常见文档 RAG

存储对象

参与训练的向量参数

文档、记录、索引与元数据

寻址依据

规范化后的局部 token N-gram

问题或改写查询,可结合语义与关键词

返回内容

隐藏空间里的表示

可以检查的文本或结构化记录

接入位置

Transformer 内部的表示计算

典型实现把检索结果送入生成上下文或工具反馈

新知识更新

需要参数学习与适配,论文未提供文档即时写入接口

可更新文档和索引,冻结生成模型也能使用新材料

来源与时间

表项没有天然文档引用

可以保留来源、版本和时间,但必须工程实现并核验

权限与撤回

共享参数难按文档做隔离、撤回与审计

可以在召回前执行租户、文档与字段级权限过滤

换一种说法查询

不同局部 token 会改变键,仍依赖主干泛化

语义检索可以连接不同表述,召回错误仍会发生

主要成本

训练、参数存储、随机访问及跨设备传输

文档处理、索引、检索、重排及额外输入 token

主要失败来源

碰撞、长尾欠训练、归一化损失、门控误匹配及旧参数

未召回、材料过时、切块损失、错误重排、提示注入及生成误引

更直接的使用者

能修改和训练模型的研究、模型系统团队

需要维护知识库的应用开发者与研究者

Engram 的优势与代价

当目标是扩大模型对稳定局部模式的表示容量,又希望每个 token 的激活计算不随总表规模同比增加时,Engram 提供了一个明确的结构选择。地址计算不依赖深层隐藏状态,有利于预取。查表结果直接参与模型内部计算,不需要把对应内容写成额外提示词。

代价在模型侧。新增表需要训练,表和投影要适配主干,部署时还要承担存储与访问成本。单个表项缺少可读语义和来源,很难完成逐文档修订、删除及权限控制。确定性寻址也意味着键的局部形式很重要,无法单靠短 N-gram 回答跨文档、跨表述的所有查询。

论文中的长上下文结果说明这种结构可能改善对已给上下文的利用,但没有证明它可以直接获取训练后发布的新信息。

RAG 的优势与代价

RAG 的知识库可以独立更新。新增论文、产品说明或内部实验报告,可以经过处理进入索引,生成模型据此回答。保留文档标识、版本、页码和检索记录后,也更容易检查回答依据。

这些能力都有实施条件。系统必须召回正确材料,正确处理权限,并让生成结果确实受证据约束。只是在结尾附上一串链接,不能保证每一句都受到来源支持。遇到相互冲突的材料,还需要时间过滤、版本选择或显式说明分歧。

RAG 还会增加查询链路。材料过长会消耗输入 token 和 KV Cache,复杂的重排或多步检索会增加延迟。外部文本也会带来提示注入风险,文档内容不能自动获得系统指令权限。

用无线感知研究场景判断如何选

假设要回答:2026 年新发表的跨环境 WiFi 感知论文用了哪些数据集,哪些实验与某个毫米波方案可比。

这个任务需要具体论文、时间、数据划分和实验设置,知识还会持续变化。比较直接的方案是文档 RAG:保留论文元数据,检索相关段落与表格,按场景、设备、训练测试划分筛选,再让模型依据材料整理。得到结果后仍需核验数据集和协议,防止把跨域和同域评测混在一起。

Engram 没有提供这套论文目录、日期过滤和引用管理功能。它可能帮助一个经过训练的底座理解领域表达,却不能负责维护新论文库。

若研究目标换成训练一个领域语言模型,想验证稳定技术短语和实体组合能否用查表减少表示重建成本,就可以考虑 Engram 类模块。需要控制主干、数据、训练预算,并测量领域困惑度、任务效果、长尾模式和资源成本。

还有一个边界:原论文处理的是文本 token。把连续 CSI、雷达点云或时频图直接接入 Engram,需要另外定义离散表示、跨模态对齐和训练目标。这是值得研究的迁移问题,论文没有给出已经验证的无线感知方案。

能否组合使用

如果底座本身已经训练并支持 Engram,应用仍然可以在外面接 RAG:

纯文本
维护可更新的论文或企业文档库
  → 检索并执行权限、版本过滤
  → 将证据交给支持 Engram 的底座
  → 底座在内部使用已训练的查表能力
  → 生成回答并核验引用

这种组合在接口上成立,但实际收益需要控制变量验证。至少应比较同一底座条件下加不加 RAG,以及同一检索结果条件下使用不同底座的表现。Engram 原论文没有完成这套混合系统评测。

官方代码如何下载,能够学到哪一层

先固定版本,再准备运行环境

下列命令按 Windows PowerShell 编写,依据官方仓库整理,本次没有安装或运行模型。使用独立目录,避免改动现有博客项目环境:

powershell
git clone https://github.com/deepseek-ai/Engram.git
cd Engram
git checkout fb7f84a21f91223715394a33a1dc24bbfb7f788e

py -3.11 -m venv .venv
.\.venv\Scripts\python.exe -m pip install torch numpy transformers sympy
Copy-Item .\engram_demo_v1.py .\engram_demo_small.py

py -3.11 要求已安装对应 Python。官方 README 给出的最低建议为 Python 3.8+,实际依赖还需要与选用的 PyTorch、Transformers 版本相容,尤其要包含 torch.nn.RMSNorm。需要 GPU 时,按 PyTorch 官方说明选择匹配驱动的安装包,不能假定上述默认安装就能使用本机 CUDA。

演示会从 Hugging Face 读取 DeepSeek-V3 的 tokenizer。这里调用 tokenizer,不代表脚本自动下载了完整 DeepSeek-V3 权重。代码使用 trust_remote_code=True,运行前应检查所加载仓库中的代码与版本。

默认配置也会占用大量内存

官方脚本把每个头的表长设置在 129280*5 附近。2/3-gram 共 16 个头,每头维度为 512/8=64512/8=64,所以每个 Engram 层大约有:

16×646400×64≈6.62×10816\times646400\times64\approx6.62\times10^8

个表参数。两个插入层合计约 13.2 亿个参数,仅这些表在默认 FP32 下就约需 5.3GB 十进制内存,另有输入 Embedding、输出头和中间状态。各头使用略有不同的素数长度,这里是数量级估算。

所以,学习数据流时应先在自己的脚本副本中缩小配置。可以替换文件顶部两处实例化,保留原配置类:

Python
# 教学缩小配置,仅用于观察张量形状,不对应论文训练模型。
engram_cfg = EngramConfig(
    engram_vocab_size=[1009, 1013],
    max_ngram_size=3,
    n_embed_per_ngram=32,
    n_head_per_ngram=2,
    layer_ids=[1],
)

backbone_config = BackBoneConfig(
    hidden_size=128,
    hc_mult=2,
    vocab_size=129280,
    num_layers=3,
)

保留原 tokenizer 词表大小,避免输入 ID 超过 Embedding 范围。layer_ids=[1] 在该演示的零起始编号中指第二个块。修改后的参数只用于降低教学运行规模,不代表它具有训练后的语言能力,也不能与论文的层编号或指标直接对照。

准备好副本后,再执行其文件名,例如:

powershell
.\.venv\Scripts\python.exe .\engram_demo_small.py

沿着这几个类读,比先读完整模型更容易

以下路径以本次固定的官方代码为准:

类或方法

阅读时跟踪的对象

CompressedTokenizer

原始 token ID 怎样映射为规范化 ID,哪些区别被合并

NgramHashMapping

左侧 padding、各阶后缀、乘法 XOR、不同头取模

MultiHeadEmbedding

不同逻辑表如何用 offsets 合并到一个 Embedding 中

Engram.forward

查表向量拼接、分支 Key、共享 Value、门控与卷积

ShortConv

从 [B,T,M,d] 转到通道形式,再裁去右侧多余输出以保持因果

TransformerBlock

Engram 输出在哪一步加回主干

原默认演示中,查表地址形状为 [B,T,16],头向量为 [B,T,16,64],拼接后为 [B,T,1024]。隐藏状态为 [B,T,4,1024],各分支门值可看作 [B,T,4,1],输出重新对齐隐藏状态。采用上面的缩小配置后,维度会相应改变。

这些形状有助于区分两个概念:头数控制查表表示的组成,mHC 分支数控制主干残差流。两者不能相互替代。

演示与论文有几处需要分开记录

官方 README 明确说明它演示的是数据流。代码里的 Attention 与 MoE 被替换为恒等函数,mHC 也经过简化,参数随机初始化,没有预训练循环。前向运行成功只能证明该示例的形状和算子路径能走通。

门控还有一处实现差别。论文公式 4 在归一化点积后直接 sigmoid。所检查的演示版本在 sigmoid 前额外执行:

Python
gate = gate.abs().clamp_min(1e-6).sqrt() * gate.sign()
gate = gate.sigmoid().unsqueeze(-1)

也就是保留符号并压缩幅值后再映射为门值。它不能直接写成与论文公式完全相同。论文主实验还采用卷积零初始化,演示没有显式加入对应初始化。

此外,演示主要用 NumPy 在 CPU 上生成哈希,没有完整的分布式训练、混合精度、增量缓存、GPU/CPU 预取和融合内核。读代码时应把机制演示、训练配方与服务实现分别记录。

真正改造自己的模型,需要补哪些工作

给一个现成预训练模型增加随机 Engram 表,输出分布会改变。即使只训练新增模块,也需要训练数据、优化策略和独立评测。论文没有证明任意冻结底座都能通过简单外挂立即复现结果。

一个范围可控的研究过程,可以按以下顺序进行。这里是实验设计建议,未声称已经实施:

  1. 固定一个能够训练的小型因果语言模型与 tokenizer。记录主干层数、宽度、数据顺序、上下文和计算预算,先得到基线损失。

  2. 在选定块接入因果查表模块,检查整个输入输出形状、padding 和索引范围。未来 token 不能进入当前地址或卷积窗口。

  3. 从小表开始联合训练,保留语言建模目标。分别记录 Embedding 与主干的学习率、梯度和内存,观察低频行是否得到足够更新。

  4. 做可解释的对照:无模块、不同插入层、无门控、无规范化,以及不同表容量。若要声称同预算优势,还要控制额外参数与 FLOPs。

  5. 在任务效果之外,测量训练速度、峰值内存、prefill 与 decode 吞吐、首 token 延迟和尾延迟。只有更大表能在设备内稳定运行后,再研究主机卸载。

把模型用于知识服务时,还应单独测试知识更新、来源核验和数据撤回。参数侧效果改善不能代替这些应用要求。

如果当前目标只是搭建一个能检索自己论文和项目材料的助手,可以先实现有权限与引用记录的 RAG。能够修改底座、准备训练预算,并且研究问题确实涉及表示容量时,再评估 Engram 的结构改造。

阅读时保留的几个问题

Engram 最值得继续检查的是收益来自哪里,以及要为这些收益支付什么成本。

稳定短语、实体与长尾组合,是否会随语言、领域及 tokenizer 变化而呈现不同收益?主干更深、更宽或采用其他分支结构后,查表与专家的较优比例是否还接近论文范围?这些都需要新的配比与消融实验。

门控能缓解歧义,无法给出正确性保证。后续可以按实体频率、规范化合并类型和哈希碰撞程度分组评测,查看平均分是否掩盖了少数模式的退化。若改造成垂直领域模型,还需要把过时事实与领域术语理解分开测量。

系统侧则应把吞吐、单请求延迟和容量成本分开。预取在大批量下隐藏 I/O,不保证低并发请求也能隐藏同样的时间。更低位宽、更慢存储或跨 NUMA 访问,都需要重新测量。

对于 Engram 与 RAG 的组合,较有用的实验问题是:检索证据相同、底座训练条件可比时,内部查表能否改善对材料的理解与利用,同时维持引用正确率。这比用两套不同系统的公开分数直接判断替代关系,更容易得到可解释的结论。

原始资料与图像许可

文中六张图片均取自 Engram 论文 v2 的原图 1、2、3、4、5、7,只做页面边缘裁剪,图号与坐标保留。原论文标注 CC BY 4.0,著作权归原作者。教学数值、对比分析与实践建议已在相应段落区分。资料核验日期:2026-10-28。

END