原文在https://link.zhihu.com/?target=https%3A//github.com/deepseek-ai/Engram/blob/main/Engram_paper.pdf。
这篇论文出了一段时间了,刚出的时候没怎么看懂,现在结合知乎的高赞回答看了一遍,已经养肥了。
这篇文章写几个我比较感兴趣的点,又查了一点资料。
文章目录
对硬件发展的影响
这部分很多人讲了,可以理解成现在Engram发现可以将一些常用的知识做成外挂放到硬盘和内存中,相比于GPU内高昂的显存,CPU内存和硬盘实在是白菜价。目前还不确定当前内存涨价是不是这个原因。但可预期的是未来如果Engram的架构发展起来,内存又会成为AI的专宠,家用PC只能走向二手这条路了吗?
2-gram和3-gram
engram的思路来自于n-gram,因为大模型在推理的过程中是一个字一个字吐的,根据前面吐出来的所有字推理出下一个字。在AI的多层结构中的前面层,需要根据当前token和前面的信息,重建他们之间的关系(矩阵),然后才能着重进行推理。这就导致一些常用的短语在AI内还需要重新从一个一个字拼起来。engram就用了一套单独的网络结构,可以快速的通过查表的方式重建这些信息。
n-gram最早要追溯到香农的论文,可以理解成我们发现某个词与前面的几个词关系比较紧密,如果用一些常用的句子构成一个hash表,通过对其打表,就能实现根据当前字匹配前面的信息。这里的n就是查询的长度。比如我想查询某个词相关的句子,可以通过查询这个词的前面n个或者后面n个字,快速的查到表里存储的内容。n-gram有一个问题,就是n不能太长,否则匹配到的信息很少(我们不能把备选表做的特别大),可能出现查不到的问题。
Engram里面选了2-gram和3-gram一起用,也实验了4-gram,但是发现有负优化。两个gram匹配到的词通过拼接后过门控用Attention筛选。不得不说Attention真是大模型的宝库啊,任何需要选择的地方都可以通过Attention计算权重完成。
Engram采用的为什么是后缀?这里的后缀和前缀和我们经常理解的是相反的,这里的后缀指的是推理中吐出来这句话的最后2个或者3个词,这很好理解,我们在吐这句话的某个字之前,最关联的肯定不是这句话开头,而是当前这个字前面的内容(后面的内容还没生成)。
Engram应该插到哪些层?论文给出了答案,第2层和第15层。因为早期的层主要是做逻辑重建,在此处插入Engram可以尽早卸载这些静态模式的重建任务,让后续层专注于复杂推理。早期层的隐藏状态信息较少,门控机制可能不够精准,在中期层再次插入Engram,可以利用更丰富的上下文信息,让模型更智能地决定是否采用检索到的记忆。我认为这些数是可以具体tune的,但早期层确实不应该放在过早的位置(比如第一层),因为查表和从CPU内存load都需要开销,放在稍后面可以用部分层的计算掩盖掉开销。
对训练和推理的影响
训练的影响在于,如果我们的任务可以通过插入固定的知识到知识库里完成,就不需要微调了,(看起来有点像推理时插的prompt?)
Moe和Engram的发展,越来越推动某件看起来魔幻的事情发生:也即训练的时候模型可以掌握的信息更多,但推理的时候模型可以推的更快,效果更好。MLA算子本身通过训练时是MHA,推理时是MQA从算子层面解决了这个问题。Moe从训练过程中冗余大量专家,推理过程中选择性激活,从计算角度解决了这个问题。Engram从训练过程中存储大量知识,但推理过程中选择性加载解决了这个问题。总体的思路都是实现稀疏化。
实验方法
论文提到了消融实验的思路,也即通过砍去某个部分看砍了前后的效果变化从而证明这部分的重要性。看起来是一种很有意义的实验方法。