大模型的记忆到底该放在哪里

你有没有想过一件事:当你和ChatGPT聊了一小时,它记住的所有东西,下一次打开新对话时全部清零?

这不是程序员偷懒,而是一个深埋在大模型底层架构里的结构性难题。现在所有主流大语言模型处理"新知识"的方式,基本都靠一个叫做上下文学习的笨办法。

上下文学习*:简单说就是把你想让模型知道的信息,直接当成文字塞进它这次对话的输入框里,模型读一遍就用一遍,下次对话还得重新塞一遍。

这就是现在检索增强生成系统的基本原理,你问一个问题,系统先去数据库里翻资料,把翻到的文字拼接在你的问题前面,一起扔给模型。

这事儿乍一看挺合理,出处清楚,想改就改,想删就删。可它有个要命的毛病:文本塞得越多,计算成本涨得越快,而且这事儿是每次对话都要重新来一遍的。

打个比方。这就像你每次想查个资料,都得先把整本参考书翻出来放在桌上,读一遍相关章节,读完再收起来。下次想查同样的内容,书又得重新摆出来翻一遍。如果不这样做会怎样?如果你把参考书的内容直接背进脑子里,查的时候直接调用记忆就行,不用每次都翻书。可问题是,大模型的"脑子"其实就是它的参数,把知识背进参数里,这事到底该怎么做,放在哪个部位做,这正是这篇综述要回答的核心问题。

这篇来自香港科技大学和香港浸会大学团队的论文,给这类"把记忆直接塞进模型参数"的技术起了个名字,叫做参数内记忆,英文缩写IPM。它系统梳理了这个新兴方向里几十种五花八门的方法,试图把乱七八糟的技术版图理出一条清晰的脉络。

记忆放在哪,怎么放进去,这是两个完全不同的问题

论文里有一句话我读了好几遍才琢磨明白:参数放置和参数何时获取,这是两个相互独立的维度,不能混为一谈。

先说说为什么这事儿不简单。

Transformer是现在几乎所有大模型的骨架结构。

Transformer*:一种神经网络架构,由嵌入层、多头注意力层、前馈网络层等模块堆叠而成,是GPT、Llama这类大模型的通用底层设计。

论文作者观察到两条关键的科学证据。第一条,前馈网络层其实表现得像一个键值存储器,有研究通过神经元归因分析发现,具体的知识事实往往对应着网络里特定的神经元和层。第二条,注意力机制本身就是一种关联性操作,普通的自注意力会不断累积token衍生出的键值对,形成一个不断膨胀的缓存,而某些改良版本的注意力机制可以把这些关联压缩进一个固定大小的状态里。

这两条证据指向同一个结论:记忆这东西,理论上可以塞进嵌入层、注意力层、前馈网络层这三个地方中的任意一个,甚至同时塞进好几个。

论文把这三个加上"混合模式"合称为四种"参数放置"类别。

与此同时,还有第二条完全独立的轴线,叫参数获取时间。

这条轴线问的是:这段记忆是在模型正式上线服务之前就准备好的,还是在模型服务过程中临时生成或更新的?前者叫离线获取,后者叫在线获取。

论文特别强调,获取时间和放置位置是正交的两个维度,互不干扰。

这就好比问一道菜,你可以问它放在冰箱还是厨房台面上(这是放置位置),也可以问它是提前一周做好冷冻的还是现炒现吃的(这是获取时间)。两个问题的答案组合起来,能有8种可能,而现实中的各种方法,正好就散落在这8个格子里,各占各的位置。

论文还特别提醒了一个容易搞混的点:生成记忆的那个"操作器"本身是什么时候训练的,跟它生成出来的记忆是什么时候被使用的,这完全是两码事。比如一个超网络可能是提前几个月离线训练好的,但它针对你这次对话临时生成出来的LoRA适配器,那是在线获取的产物。

用两个"操作符"把整件事讲清楚

论文搭了一套数学化的表达框架,用两个操作符来描述所有这类方法。

一个叫获取操作符,用字母A表示,它的工作是把某种来源信息K转换成记忆对象φ。另一个叫组合操作符,用字母C表示,它的工作是把这个φ插入到模型的前向计算过程里,实际参与到模型"思考"这件事中去。

这个拆分看似学究气很重,其实解决了一个非常实际的分类难题:到底该按什么标准,把这几十种五花八门的方法分门别类?

论文给出的答案是,A决定了φ是什么时候被制造出来的(在线还是离线),而C决定了φ被放在哪个部位读取(嵌入层、注意力层、FFN层还是混合)。

举个具体例子更好懂。有一类叫LoRA生成的方法,会用一个超网络,读一份文档或者一个任务描述,直接吐出一组适配器矩阵。这个超网络就是A。而这组矩阵最终以什么方式接入模型,比如按照"原权重加上两个小矩阵相乘的结果"这种规则嵌入进去,这个接入规则就是C。

获取操作符本身还分两种工作模式。

一种叫一次性获取,公式写作φ等于A(K),这类方法包括直接对连续向量做梯度优化、一次前向传播就输出结果的超网络、把知识编码成键值对的编码器等等。另一种叫有状态获取,公式写作φt等于A(φt-1, zt),也就是说新证据zt出现时,会在旧记忆φt-1的基础上更新出新记忆φt,这类方法常见于循环更新规则,比如delta-rule增量更新或者由"意外程度"驱动的更新机制。

这就好比写日记和写维基百科词条的区别。一次性获取像是你坐下来一口气把一篇完整的游记写完,写完就定稿了。有状态获取则像是你在持续维护一本日记,每天根据当天发生的新事情,往已有的内容上继续添加和修改,昨天写的东西会影响今天怎么写。如果一个系统只支持一次性获取,那它就永远没法适应部署之后才出现的新信息,这也是为什么很多长程记忆系统必须依赖有状态获取的循环更新能力。

哪些方法算数,哪些方法不算

论文花了不少篇幅划定边界,这事儿看着繁琐,其实特别重要,因为"记忆"这个词现在被用得太泛滥了,不划清边界,整篇综述就会变成大杂烩。

论文设置了三条判定标准。第一条,这段记忆是不是以连续参数的形式存在的,也就是参数性。第二条,这段记忆是不是由一个独立的获取操作符产生的,而不是运行模型过程中顺带产生的副产品,也就是独立获取性。第三条,这段记忆是不是在部署阶段作为一个独立对象被接入前向计算的,也就是部署时增强性。

只有同时满足这三条,才算进入这篇综述的讨论范围。

按这个标准筛一遍,几个熟悉的技术范式命运各不相同。

可插拔的参数高效微调方法比如LoRA,三条全部满足,是这篇综述的核心研究对象。全参数监督微调则不行,因为它把更新直接合并进了主干参数θ里,服务时已经没有一个独立的对象可供组合操作符C去操作了,这就像你把笔记直接写进了课本原文里,而不是夹一张活页纸进去,你没法单独把这张纸拿出来再插回另一本书。

未经修改的KV缓存这个判断有点反直觉。

KV缓存*:Transformer在处理输入文本时,会把每个token对应的键值向量暂存起来,供后续生成时复用,这个暂存区就叫KV缓存。

你可能觉得KV缓存里存的也是连续数值,为什么不算参数内记忆?论文的理由是它没通过独立获取性这一关:这些缓存条目是模型预填充离散token序列时顺带产生的副产品,根本不是一个独立操作符主动生产出来的对象。但如果KV缓存是通过一个专门的编码器生成的,比如用一个小模型单独去编码一份文档产出键值对,那这个编码器就是独立的A,产出的KV库就重新被纳入讨论范围。

这个区分有点像问"你口袋里的硬币算不算你特意攒下的储蓄"。如果是买东西找零顺手揣进口袋的,那不算主动储蓄行为的产物,哪怕这些硬币本身价值不菲。如果是你专门拿出一笔钱去银行换成硬币存起来的,那即使形式上也是硬币,性质已经完全不同了。

四个地方,四种记忆的脾气

论文接下来把记忆具体放进四个不同的部位,逐一盘点里面都有哪些代表性方法,每个部位的记忆都带着不太一样的"性格"。

嵌入层这边,记忆通常长成软提示、软token或者记忆表的样子,直接拼接在模型输入的最前面。

软提示*:一组可学习的连续向量,不对应任何具体的词,但能像真实的文字提示一样引导模型的输出方向。

在线获取的代表方法里,MemGen给模型配了一个叫"织布机"的组件,能把当前的隐藏状态实时编织成记忆token,再塞回模型的输入流。GradMem更激进,直接在测试时跑一遍梯度下降,把一整段上下文压缩成几个前缀记忆token。离线获取这边,最早也最经典的就是Lester等人2021年提出的Prompt-Tuning,先把软提示训练好,部署时直接拼接使用。

嵌入层记忆的优势是组合成本最低,因为它只是往输入流里加东西,主干模型完全不用变。但它的影响是间接的,得靠上面每一层逐层传递和消化,这就好比你往一锅汤里撒了一把香料,香味要靠整锅汤慢慢炖煮才能均匀渗透,不会立刻产生效果。

注意力层这边,记忆最常见的形态是编码过的键值库、适配器、快权重、在线神经记忆,或者软提示。

快权重*:相对于模型训练好之后就固定不变的"慢权重",快权重是指可以在推理过程中动态调整的一部分参数,专门用来实时记录新出现的信息。

这里最热闹的要数测试时训练这一类方法,代表作有Titans和ATLAS,它们让模型在测试阶段现学现用,实时学习怎么优化地记住当前的上下文。MesaNet和qTTT做的是局部最优的测试时训练。还有一批方法走的是快权重路线,比如δ-mem维护一个紧凑的在线关联状态,专门修正已经冻结的主干模型的注意力输出。另外像CEPE和M+则是用编码过的键值库来扩展模型能看到的有效上下文长度,相当于给模型装了个"外接硬盘"。

离线这边,最早的代表是2021年的Prefix-Tuning,直接在每个注意力层学习一组固定的连续键值表示。后来出现了更灵活的方法,比如KBLaM和AtlasKV,它们训练一个交叉注意力投影器作为获取操作符,把一个小型冻结编码器编码出的句子表示,实时投影到大模型的语义空间里,这样新句子的键值表示可以随时生成,但由于知识的组织方式是离线完成的,所以依然归为离线类。

注意力层记忆的特点是内容可寻址,查询向量和键向量之间可以做关联查找,既支持大规模记忆库的联想检索,也支持循环更新的动态状态,代价是和注意力头的结构、预算绑得比较紧。

前馈网络层,也就是FFN层这边,记忆通常是适配器、记忆表、快权重或者在线神经记忆。

这一层的记忆有个特别鲜明的特点:读取方式是逐位置独立的,每个token各自查自己的,互不商量,不像注意力层那样能做内容检索式的关联匹配。这意味着什么?意味着编辑这一层的记忆,可以直接覆盖掉模型的某个具体行为,精准但代价是连续的写入操作之间容易互相干扰,因为大家写的是同一块共享权重。

在线这边,Doc2LoRA用超网络一次前向传播就把一份文档映射成LoRA适配器。DyPRAG则是在测试时动态地从检索到的文档生成参数化适配器。离线这边,PRAG和PolyPRAG提前把检索到的知识编码进FFN侧的参数里,部署时直接插入使用。RING则是往混合记忆专家里注入新语料,再通过强化学习学出一套路由和检索策略。

打个比方,FFN层记忆有点像公司里的岗位责任制,每个员工只管自己手头那摊事,互不打听别人的工作内容,效率高,出了问题也容易定位到具体是谁的问题。但如果两个新任务都需要改动同一个员工的职责范围,那这两次改动就容易打架,这也是为什么连续编辑FFN层记忆容易出现知识冲突和遗忘的根本原因。

混合模式则是同时在两个或更多部位安插记忆对象,表达能力最强,但也最难追溯:观察到的某个行为变化,很难归因到具体是哪个组件起的作用,这就像一道菜同时改了火候、调料和刀工,吃出来味道不对,你很难一口说清是哪个环节出的问题。

哪种选择更划算,这事没有标准答案

论文花了专门一节讨论不同选择之间的权衡取舍,读下来的感觉是,这事儿真的没有万能解。

在线获取和离线获取之间的对比是这样的:在线获取能立刻适应新情况,但每次都要付出更高的写入时间计算成本。离线获取更稳定,也经过了更充分的验证,但碰到部署之后才出现的新信息流,就没法消化,除非重新跑一遍离线训练流程。

这背后其实是个很朴素的权衡,类似于你是选择现学现用的临时工,还是提前培训好、经验扎实但不会灵活应变的正式员工。临时工上手快但质量不稳定,正式员工靠谱但没法应付培训手册之外的新情况。

四个放置位置之间的对比,论文也给出了明确的结论。

嵌入层对象组合成本最低,但影响是间接的,需要每一层逐步消化。

注意力层对象支持内容寻址,代价是和注意力头结构、计算预算绑定较深。

FFN层对象能直接覆写具体行为,但读取是逐位置独立的,没有内容选择能力,而且连续写入会互相干扰。

混合堆叠表达能力最强,但行为难以归因到单一组件,更新必须跨异构对象协调。

另外论文特意强调了一点,对于需要精确引用、来源追溯、定向删除或人工审核的任务,上下文学习和检索增强生成依然是更合适的选择。这些事情对纯文本存储来说是小菜一碟,可一旦文本被压缩抽象进参数φ里,想再反向抽取出原始出处就变得异常困难。这就好比原始凭证和总账的关系,总账记录了压缩后的余额,查起来方便,但要追溯某一笔具体交易的来龙去脉,还得翻出原始凭证才行。

四个还没解决好的难题

论文最后指出了四个开放方向,这部分读起来反而是最让我有共鸣的。

第一个是干扰和遗忘问题。连续的编辑操作和循环的delta-rule更新会不断覆盖掉早先存入的关联,而且这个损害会随着更新序列拉长而越滚越大:编辑过的权重范数会不断增大,扰乱了模型原本通用能力所依赖的方向,固定状态的记忆也会沿着当前的键产生干扰。虽然子空间投影、范数约束、擦除门或写入门这些手段能延缓这个崩塌过程,但它们要么得维护一份不断增长的历史键记录,要么只能针对当前这一次写入做防护,面对长时间序列里的冲突检测和固定容量分配问题,目前还没有彻底解决方案。

第二个是获取过程的安全性问题。一次来自不可信上下文的写入,事后可能被当成可信知识检索出来,而现有的记忆系统普遍不记录来源信息。一旦写入的是参数化的记忆对象,这种被植入的异常行为甚至可能隐藏进权重内部,而行为层面的去学习操作往往会留下痕迹,所以更新预算控制、基于来源的写入门控、隐私感知的知识整合,这些都还是悬而未决的问题。

第三个是和上下文学习的协同设计。上下文学习把记忆保存成文本token,能表达更细粒度的信息,参数内记忆则能带来效率上的好处,但有些场景确实需要细粒度的记忆访问。论文提出的开放方向是让获取操作符A来决定哪些信息留在上下文里、哪些信息进入参数对象φ,再让组合操作符C在一次前向传播里同时读取两者。

第四个是模型原生的递归式自我提升。论文观察到目前大多数所谓的"递归自我提升"其实发生在智能体的外层工具框架里,提示词、技能、知识库、工具这些东西都是在模型外部被修订的,模型本身岿然不动。一个真正模型原生的版本,应该是让获取操作符A把部署过程中积累的有用经验直接写进参数φ,让主干模型本身在参数层面持续进步,从而缩小离线训练和在线推理之间的那道鸿沟。

写在后面

读完这篇综述,我印象最深的反而不是具体某个方法,而是那个被反复强调的区分:获取和组合是两件事。

这个拆分看似是个记账式的学术操作,但它其实暴露了一个此前被很多论文混在一起讲的事实,很多所谓"创新的记忆机制",其实只是在获取方式上做了文章,组合方式沿用的还是老套路,反之亦然。把这两件事拆开看,能更清楚地判断一个新方法到底是在哪个维度上真正推进了技术,还是只是换了个包装。

还有一点值得单独说一说,论文里提到未经修改的KV缓存不算参数内记忆,这个判断我琢磨了挺久。它逼着你重新思考"记忆"这个词到底指什么,如果只是运行过程中自然留下的痕迹,那和主动构建的、可复用的知识对象,性质上完全不是一回事。这个区分放到人类身上也成立,随手记下的便签和刻意整理的笔记本,虽然都是纸上的字,但背后的认知投入和可靠程度天差地别。

这篇综述没有回答的一个问题是,当一个模型真的能把部署期间积累的经验持续写进自己的参数里,它和人类的学习过程到底还有多大区别?如果答案是"没有本质区别",那这事儿的分量可能比表面上看起来要重得多。

Q&A

Q1:参数内记忆和检索增强生成有什么区别?

A:检索增强生成把相关文本直接拼接进模型的输入上下文,每次对话都要重新处理这些文字,计算成本随文本长度增长。参数内记忆则是把信息压缩成模型参数或类似参数的对象,直接接入模型的前向计算过程,避免了反复编码同一段文字的开销,还能跨查询复用。

Q2:参数内记忆的"获取"和"组合"是什么意思?

A:获取操作符负责生产记忆对象,比如用超网络从一份文档生成适配器矩阵。组合操作符负责把这个记忆对象接入模型的实际计算过程,比如作为注意力层的额外键值,或者作为前馈网络的残差项。两者是独立的维度,一个决定记忆何时形成,一个决定记忆放在哪里读取。

Q3:为什么未经修改的KV缓存不算参数内记忆?

A:因为它是模型预填充输入文本时自然产生的副产品,不是由一个独立的获取操作符主动生产出来的对象,不满足"独立获取性"这条判定标准。如果KV缓存是通过专门的编码器生成的,就会重新被纳入参数内记忆的范畴。

展开阅读全文

更新时间:2026-11-06

标签:科技   模型   记忆   参数   在线   离线   操作   注意力   组合   上下文   论文

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight All Rights Reserved.
Powered By 61893.com 闽ICP备11008920号
闽公网安备35020302035593号

Top