24年5月来自Amazon、UC SD、UC LA的论文“MEMORYLLM: Towards Self-Updatable Large Language Models”。
现有的大语言模型 (LLM) 在部署后通常保持静态,这可能使向模型注入新知识变得困难。工作目标是构建包含相当一部分可自更新参数的模型,使模型能够有效且高效地整合新知识。为此,引入 MEMORYLLM,该模型由一个transformer和transformer潜空间内固定大小的记忆池组成。MEMORYLLM 可以使用文本知识进行自我更新并记忆先前注入的知识。评估看到 MEMORYLLM 能够有效地整合新知识,这一点从其在模型编辑基准上的表现可以看出。同时,该模型表现出长期信息保留能力,这通过定制设计的评估和长上下文基准得到了验证。MEMORYLLM 还表现出操作完整性,即使在近一百万次记忆更新后也没有任何性能下降的迹象。
代码和模型已开源在
GitHub - wangyu-ustc/MemoryLLM: The official implementation of the ICML 2024 paper "MemoryLLM: Towards Self-Updatable Large Language Models"
如何使用最新知识更新模型?以前的解决方案大致可分为三类:(1)基于检索的方法:这些方法依赖于知识库中的信息检索(Khandelwal ,2019 ;Zhong ,2023 )。它们可以产生强大的结果,但在知识库出现冗余时面临挑战,并面临管理不断扩大的知识库的后勤问题。在多模态场景中,基于检索的方法可能需要巨大的存储空间来存储所有图像数据(人类每秒 24 张图像)以供检索。(2)模型编辑:这类方法涉及对模型进行有针对性的编辑以适应新事实,同时保留其他所需功能(Yao ,2023 )。现有方法主要侧重于基于事实的编辑,通常仅限于单个句子。当人们试图以更长、更复杂的上下文形式注入新知识时,这种限制变得更加严重。(3)长上下文方法:另一种替代解决方案是将所有知识纳入模型的上下文中,这本质上使上下文成为知识库。这与基于检索的方法不同,因为上下文直接为模型的推理提供信息。此类别的方法包括降低注意操作的复杂性(Child ,2019 ;Beltagy ,2020 ;Wang ,2020 )和修改位置嵌入(Press ,2021 ;Sun ,2023 )以处理更长的上下文。然而,由于复杂的推理任务需要大量最新的知识,只要上下文长度是有限的,长上下文方法不可避免的上下文过载就变得不可行。
如图 MEMORYLLM 的框架。(a) 在生成过程中,记忆池的第 l 层 θl 中所有记忆 tokens 都由隐态 hl 关注。(b) 在自我更新期间,来自 记忆池 θl 的最后 k 个记忆 tokens 与隐态 hl 连接作为模型 φl 的输入。输出隐态 hl+1 进入下一层。hl+1 的最后 K 个 tokens 用作新的记忆 tokens elθ‘ 。随机删除 记忆池 θl 中的 K 个 tokens,并将剩下的 记忆池 θl(表示为 θ (d))与 新的记忆 tokens elθ‘ 相连接,获得新的记忆池 θl‘。
新知识 x 灌入更新记忆池如下公式描述:
多步更新的描述公式如下:
训练过程首先从数据集中选择一个文档 d,然后将其分成两段(x1,x2)。
然后用 x1 更新记忆池 θ,接着用更新后的记忆池预测 x2。
理想情况下,会在启用梯度的情况下设计整个过程。
然而,这种方法会导致过高的内存需求,尤其是当内存池很大时。
为了缓解这个问题,在第 l 层,保持梯度流的情况下仅使用 elθ ′ 来预测 x2 而不是整个更新后的记忆 θl,并在不用梯度的情况下在 x1 自更新过程时使用 θl′。
在每次迭代中,上述两个过程都是随机选择的,以确保模型能够将 x1 中知识吸收到 θ 中,并在生成过程中使用记忆池 θ。
如图是用于整合新知识的训练过程。在训练期间,随机选择两个所示过程中的一个,每个过程以 50% 概率进行。该描述适用于第一层,后续层共享类似的过程。从数据集中采样(x1,x2)后,首先使用 x1 进行自我更新,如左侧所示。随后,用修改后的记忆 tokens eθ1‘ 预测 x2。在这两个过程中,上面的过程在整个过程中保持梯度流,优化从 x1 到 elθ‘(l ∈ {1,···,L})的知识压缩。相反,下面的过程执行没有梯度的自我更新。这两个过程旨在鼓励使用记忆池中的知识进行预测。
鼓励模型理解最新注入的知识,其中模型只需要每一层 θl′ 的最后 K 个tokens,因为只有 elθ ′(θ′ 的最后 K 个tokens)包含最后注入的上下文知识。
因此,模型可能会因为基于多个注入的上下文预测下一个token而受到影响,这本质上是长上下文问题。
提出一个训练程序来解决这个问题。
对一个长文档进行采样并将其分割成 n 个部分 (x1, · · · , xn),每个部分都短于预定义的最大长度。
然后使用公式 (2) 将前 n − 1 个段按顺序注入记忆池 θ,得到 θn−1。
请注意,(x1, · · · , xn−1) 的整个注入过程都是在禁用梯度的情况下执行的。
在得到 θn−1之后,计算 xn 段的交叉熵损失。
通过这样的训练过程,增强模型理解和处理连续上下文的能力。
如图是连续上下文理解的训练过程。虽然在本次训练迭代中应该有 n-1 次自我更新,但在这里只画出 x1、x2 的两个自我更新步。在这里展示了第 l 层的过程。在图的底部,hn1 表示 xn 词嵌入,hnL 用于损失值估计。本质上,将来自 x1, · · · , xn−1 的知识压缩到 θln−1 中以预测 xn。