前言

论文的名字是通过查询实现条件记忆,实际提出的算法可以简称为engram。

论文并未提出一种持续学习的新范式,文中的方法确实是增强了模型的记忆能力,但是提供这种记忆能力的模块并不可以在训练之后的使用中被轻松的替换更新从而实现持续学习的能力。

engram的目的其实就是在增加模型的记忆能力,同时不使模型的思考能力退化

但是这显然不是能够轻易被实现的,这需要对整体框架的大刀阔斧的改动。


扩大词表

怎样增加模型的记忆能力?

这里的记忆能力包括两种,一种是预训练中获得的关于世界知识的长期记忆力,另一种是对话过程中用到的的短期记忆力。(此处并不涉及持续学习的能力)

这两种记忆能力一定程度上都可以通过扩大词表来提升。(当然,也有别的很多方法来提升记忆能力)

简单解释一下为什么扩大词表可以提升记忆能力:
扩大了词表就增加了更多复合词作为单个token,举例来说的话就是原本 电脑 需要两个token表示,现在只需要一个token就可以表示了,那么在预训练的文本中电脑相关的知识可以更加专一的被提取到 电脑 这个token中(原来被分散到 电 脑 两个token),这样长期记忆会更加好。
同时,因为 电脑 变成了一个token,那么在推理的过程中,文本中的电脑这个单一token相关的信息因为更凝练了,也可以更好地被提取到其后token缓存中,自然短期记忆会更好。

但是,词表的扩张会面临很多的负面效果,比如:

  1. gpu的显存无法容纳很大的词表
  2. 大量的 复合词 的使用会降低模型的推理的灵活性。(很简单的道理,如果一个复合词很长,那么语料中的文章就是单个词元,模型根本不能学习到文章内部也就是单个词元内部的关系)
  3. 复合词的出现频率深受长尾效应的折磨。由很多的字节组合而成的 复合词 可能只会在语料中出现几次,不能提供足够的监督。

基础蓝图

所以我们显然不能将复合词的信息直接扩充到原有的词表,我们将存储复合词信息的结构叫做engram表

为了解决上面的问题1,我们显然只能将engram表放到内存中。
为了解决上面的问题2,engram表的查询不应该替代原有的词表的作用。
为了解决上面的问题3,engram表中的复合词显然应该是经过压缩合并的。

所以我们现在可以想象这样一种架构,复合词作为一种附加的信息储存方式,储存在内存中,在模型的中间层根据输入id进行查询为模型提供信息。


多头哈希表

deepseek团队这里有一个明显的思想的跳跃,那就是选择用多头哈希表的方式来存储engram表。

单个的复合词会映射出8个哈希值,而这个复合词对应的embedding则由这8个哈希值各自对应的embedding组合而成。(注意,这里的8个哈希值分别在不同的哈希桶里面索引,所以是不可能冲突的)

这种设计有着一种灵活性,可以在engram表大小不变的情况下,保证高频词的embedding被更为充分的表达,同时保证低频词的embedding可以被表达。

这是怎么做到的?
这里面有着一种朴素的模糊计算的概念,我们可以通过下面的简单例子来了解:
宏观来说,每一个哈希值都会因为冲突而表达n个复合词,所以任何一个哈希值索引出来的embedding显然夹杂着n个复合词的信息。
在训练时,高频词对于这个embedding的监督效果更强(训练次数多),所以这个embedding中高频词的信息量更大。
低频词的信息虽然监督效果弱,但仍然能够通过这个embedding得到部分的表示。

但是,低频复合词可以通过多头哈希得到部分的表示不代表我们应该我无限制的将所有可能的复合词都加入到engram表中。
在论文中,deepseek团队测试了 使用二、三词元作为engram表的token 以及 使用二、三、四词元作为engram表的token 的表现对比,证明二、三词元作为engram表的token已经足够,再多就要降低表现了。


门控机制

当然了,就像我们前面探讨的为什么将复合词作为单一token可以帮助记忆,这是因为复合词的信息不需要分散存储在组成它的n个token之中,而是可以由单个token表达。

对于前述的多头哈希来说,我们也面临着复合词的信息分散在8个head中的问题。相较于一个复合词的信息分散在8个head中(假设该复合词在各个head对应的 hash值 反过来对应的可以得出该hash值的复合词中的出现频率相同),将信息有比重的倾斜向某几个head显然是更好的方法。

模型在使用查询到的8个head的embedding时,利用门控机制给不同head的embedding不同的权重。
所以模型在训练中自己学会了将信息有倾向的分布在不同head中,并且在推理时有倾向的读取特定head的信息。(感觉可以做一个不同head的热力图展示“注意力”确实被有倾向的分配了)


总结

engram表的大致思想脉络就是这样,下图是融入engram表后的模型框架图。


原论文图一

当然了,论文事无巨细的讲述了整个架构创新的全部细节,包括一些提升模型表现的小trick,以及超参搜索搜出来的engram表引入的最佳位置等等。

感兴趣的读者可以去论文官方示例部署跑一下代码,简单易懂。


有效果吗?

任何一篇论文的方法当然都会和benchmark对比,但是一般来说,这些对比数据并不十分说服人。

但是engram这篇论文的对比实验做的非常的好。

一般的论文是:我声称用了A方法达到了B效果,最终会在C指标体现。对比试验对比C指标。

这篇论文是:我声称用了A方法达到了B效果,最终会在C指标体现。对比试验对比B指标以及C指标。

简单来说这篇论文用额外的工具论证了engram表这个设计是通过什么路径影响了最终的benchmark指标。

这是一个很困难的事情,需要实验者对于
什么工具可以检测模型是否真的提升了B效果呢
有着清晰的认识。
这对实验者的知识储备提出了很高的要求。

这篇论文利用了两个工具来论证了一件事:engram表的引入减少了检索知识的层数,增加了思考推理的层数。

具体的工具介绍大家可以根据论文索引学习,我就不赘述了。
下面是一个清晰的示意图,原论文这几行注释已经解释的很清楚了。