作者 | 王琰 单位 | 前腾讯AI Lab高级研究员 整理 | PaperWeekly
最近我们的 ICLR 论文 Copy is All You Need 在国内外引发了一些讨论,甚至因为名字差点火出了圈,作为始作俑者的我和蔡登兰天瑟瑟发抖,深感对不起我鹅。我也默默的庆幸,幸亏这篇 paper 的单位没有挂现单位,否则。。。懂的自然懂。
言归正传,我们本来没准备在社交网络宣传这篇工作,自论文二月份被接受以来,我们都是以一种酒香不怕巷子深的态度静静等待大家发掘它的有趣之处。但既然被动的火了起来,那么,我就也被动的来一波官方解读吧。
在正式介绍干货之前,请允许我再回顾一下我们在做这篇工作的心路历程吧(请原谅一个中年男人的唠叨)。这篇论文是我跟蔡登在 Retrieval-augmented Generation 这个方向第三阶段的工作了。在 2018 年夏天,我们还有 FAIR 以及 MSRA 的两支研究团队,几乎同时提出了 Retrieval-augmented Generation 这个全新的生成范式,利用检索系统与生成模型的结合,实现 1+1>1 的对话效果。
在随后的数年时光里,RAG 这个生成范式以爆炸式的速度发展着,而我们也在我们第一篇论文提出的 Skeleton 框架上,做出了不少改进和完善。我们第二阶段的代表性工作,是发表于 ACL 2021 的论文“Neural Machine Translation with Monolingual Translation Memory“,这篇文章重点在于提出了一个联合训练框架,实现了检索模型与生成模型的联合训练,并且证明了 RAG 框架不仅仅适用于对话或开放域文本生成,在机器翻译这样一个更加通用且具有完善自动评价指标的任务上也有着非常突出的效果。
在这五年中,我也一直会有一个疑问:为什么检索模型永远只能打辅助呢?为什么我们不能直接利用检索下一句的方式进行流畅的文本生成呢?在变形金刚系列电影中,人见人爱的角色大黄蜂,因为战斗中声带受损,选择用收音机不断检索歌曲和新闻片段的方式来发声,我们可不可以让模型也用这样的方式来生成呢?
在我们的智能写作助手 EffIdit 中,我们进行了一次尝试,实现了一个初步的利用检索技术进行句子补全的功能(见 EffIdit 例句推荐功能: https://effidit.qq.com/demo),虽然最后通过许多工程优化达到了勉强可以接受的效果,但这个过程还是暴露出了现有检索技术用于文本生成的巨大问题:只能召回固定粒度的文档&句子,而无法召回其中未被提前索引的片段。
一旦我们提前索引的候选集中,没有合适的下半句或下一句时,我们的检索模型是没有办法凭空创造出流利的下文的,这就是为什么没有任何论文尝试利用检索的方式实现自回归语言模型的原因(也许深度学习之前的时期有,如有遗漏,为我浅薄的知识储备说声抱歉)。
而 Copy is All You Need 的故事,也就是从我们这个“想让检索模型打次 C 位”的中二愿望开始的。
论文标题:
Copy is All You Need
收录会议:
ICLR 2023
论文链接:
https://openreview.net/pdf?id=CROlOA9Nd8C
代码链接:
https://github.com/gmftbyGMFTBY/Copyisallyouneed
这数十年间,从 N-gram 到 GPT4,几乎所有语言模型的目标始终如一:根据 context,预测词表上下一个 token 的离散概率分布。当我们利用此类语言模型进行文本生成的时候,一般是利用某种解码算法根据预测出的概率分布中选一个最合适的 token 作为下一个词,重复多次直到达到预设的终止条件。
在本文中,带着“让检索模型打次 C 位”的执念,我们将文本生成的过程组织成一个不断从海量语料中搜索文本片段的过程,通过自回归式的文本片段搜索,实现大段文本的生成。一个更为直观的理解是:我们将语言模型中的 next token prediction 过程变成了一系列的复制-粘贴操作。我们称这套方法为 CoG (Copy Generator)。
与普通的自回归语言模型相比,这套方法除了能让检索模型打 C 位以外(皮一下真有趣),还有三个有趣的特点:1)相对于单独的词表,CoG 的候选集合包含了大量的语义信息和上下文信息(既片段所在的文档信息也会存储进片段的表示中);2)CoG 的候选集合可以以“即插即用”的方式进行更新,在 domain adaptation 的时候完全可以利用切换候选集合的方式实现 One-model-for-all domain 的效果;3)由于片段一般包含多个 tokens,因此 CoG 生成同等长度文本所需的推理次数明显少于普通语言模型。
我们做了三组实验来证明 CoG 有多酷!在标准的语言模型 Benchmark,WikiText-103 上,CoG 在自动指标 MAUVE 和人工评测中都以较大幅度领先其他 baseline 方法(GPT-2,KNN-LM,Retro)。当我们在多领域数据集,Law-MT,上进行领域自适应的实验的时候,更加神奇的事情发生了,未在特定领域 fine-tune 过的 CoG,竟然能在评测中击败经过了领域自适应训练的 GPT2。最后,我们发现当我们持续不断的扩大候选集合时候,模型的生成质量会不断提升,我们暂时还未发现这个质量提升的上限在哪里。
方法
这部分偷了点懒,参考了另一篇文章 [1]。关于详细技术细节,请移步我们的论文原文。在这个文档中,我会首先着重介绍我们是如何解决前文所介绍的问题:“检索系统只能召回固定粒度的文档&句子,而无法召回其中未被提前索引的片段”。
假设我们的语料包含 个文档 ,对于每个文档 ,我们可以提取一个长度为 的片段 (下文称为 phrase,与原论文对齐),其中 和 代表了这个短语在文档中的起始位置和结束位置。
我们将源文本集合中的所有短语表示为 ,对于任意给定的句子前缀,我们的目标都是选择一个合适的短语来续写这个前缀。我们的模型会使用一个短语编码器 PhraseEncoder 为每个短语计算一个上下文化表示,那么所有可行的短语会形成一个 Phrase Table: 。在推理时,我们利用前缀的表示与短语表示的点积来计算前缀与短语的合适程度:
通过这样的方式,生成就变成了一个不断的根据句子前缀在 Phrase Table 中进行 Maximum Inner Product Search (MIPS) 的过程。另外,有的时候我们还是会遇到完全没有合适短语可选的情况,因此我们还是把所有的 token embedding 加入到我们的 Phrase Table 中,这些 embeddings 可以被看作是一堆长度为 1 并且没有上下文的 phrase 集合。
CoG 的生成过程如下图所示,大部分时候我们会选择合适的 phrase 作为 next phrase,如图中红黄蓝三色文本所示。有时候没有合适的 phrase 时,也会选择一些单一 token 进行生成,如图中黑色中括号内内容。
模型结构
我们的模型由三个模块组成:
a) Prefix encoder: 将前面文本 prefix 编码成固定长度的向量表征。这里采用的是标准的 Transformer-decoder only(类似 GPT)结构,最终采用 prefix 最后一个 token 的隐层表示作为 prefix 的向量表征。
b) Phrase encoder: 将文本片段转化为固定长度的向量表征。这里采用的是双向Transformer(类似 BERT)结构,给定一个长度为 的文档 ,利用 Transformer 得到文档 每个位置的向量表征后,通过相互独立的两个 MLP 层, 分别得到以特定位置开始或者结束的向量表征(维度减半):
假设某个 phrase 在该文档 D 中的开始位置跟结束位置分别是 s 跟 e,那么对应的向量表征就是位置 s 的开始表征跟位置 e 的结束向量表征直接拼接得到:
c)一个不依赖于源文本的词表。虽然 CoG 可以从其他文档中 copy,但是为了保持原有的泛化能力,在生成过程同时也会依赖一个固定词表,这里采用的是传统语言模型的词表,每个 token 都可以视为一个长度为 1 的文本片段。当源文本语料中没有合适片段时,生成模型就只能选择固定词表里的token,所以这个词表就非常有用。
这其中1) 和3) 与标准语言模型的做法相同,而 2) 是本文的关键:这种获得 phrase 的向量表征方式的优势在于,其一我们只需要对文档进行一次编码就可以获得所有文本片段的向量表征,其二在于只需要存储文档每个位置上的向量表征即可,而不需要存储具体的文本片段的向量表征。总而言之,我们采用了一种可以在合理代价范围内为任意长度 phrase 进行向量表示并且建立 index 的方式,从而解决之前限制我们的关键问题:"检索系统只能召回固定粒度的文档&句子,而无法召回其中未被提前索引的片段"。
训练
在获得源文本语料所有文本片段后,就可以利用自监督的方式训练模型了。CoG 文本生成的每一步都是一个从 Phrase Table(包括固定词表)中进行一次 MIPS 的过程。
假定文档 D 可以被切分为 个 phrase: ,其中 是第 个phrase,假设 是 的可能的源文档, 是 在 中的起始和终止位置,那么 的向量表示可以通过计算
得到,上文的表示 是通过 prefix encoder 得到的。
在训练时候我们的目标就是通过优化 phrase encoder 和 prefix encoder 的参数,让正确的 next phrase 跟 的语义相似度足够接近,而错误的 next phrases 与 的语义相似度尽量远。我们采用了对比损失 loss InfoNCE,其中负样本采用的是 in-batch-negative 的方式:
其中 是可选 phrase 集合, 是 token embedding 集合。另外,为了保留模型的 token 级别生成能力,我们还有一个标准的自回归模型 loss:
最终模型的 loss 是前面两者之和:
实验
实验一:常规文本生成实验
我们在标准的文本生成 benchmark,wikitext-103,上测试并对比了各种模型。我们以长度为 32 个 token 的 prefix 作为输入,让模型生成长度为 128 的句子补全结果,并与 Vanilla Transformer(GPT2), KNN-LM, RETRO 四种生成模型进行了对比。其中在 MAUVE(跟人工评判高度相关的自动评测方法),Rep(重复性),Diversity(多样性)三个指标上的自动评测如下:
而在人工评测中,我们的模型也展示出了更为直观的优势:
从肉眼评测来说,还有一个有趣的现象值得说明:所有的 baseline 模型都需要基于 sampling 的方法才能避免严重的 degeneration 问题(从表一中两种 decoding 方法的对比可以看得出来),而 CoG 方法则不需要依赖 sampling,即使只用 greedy search 就能取得非常好的效果。
在许多应用中,deterministic 的文本生成能力是非常重要的,能显著降低知识幻想和有害内容的生成,这也是 CoG 方法独特的优势之一。由于篇幅和时间关系,我们没有仔细深入的研究为何 CoG 方法能大幅缓解 degeneration 问题产生。
实验二:领域自适应
我们在之前的论文 Neural Machine Translation with Monolingual Translation Memory 就发现,基于检索增强的生成模型的一大独特优势就是能进行“即插即用的领域自适应”。在实验二中,我们也测试了各模型的该项能力,对比了在 Law-MT 数据集上 fine-tune 过的 GPT2,和没有 fine-tune 仅仅切换检索 Index 的 CoG。我们惊奇的发现,未在特定领域数据训练过的 CoG,竟然能在评测中击败经过了领域自适应训练的 GPT2!
总结
网络上有一些人指出这套方法有鼓励抄袭的嫌疑,但其实作为这个方法的提出者,我们的目标是让模型能够正确的给自己生成的内容打上 reference,清晰的展示出每一段是来自于哪个文本,构造一个更加白盒的文本生成模型,而不是像现在的黑盒模型,生成出大量有抄袭嫌疑的文本,却甚至没有能力判断哪些是抄袭哪些是原创。
我们在原文中也对道德问题提出了建议:首先,模型使用者需要确保自己拥有检索库中所有内容的版权,比如腾讯新闻->腾讯;网文数据->阅文集团;歌词->腾讯音乐。其次,强烈建议模型使用者显式的为每个片段标记上 reference,即它们的来源,从而避免抄袭问题。
参考文献
[1] https://zhuanlan.zhihu.com/p/645138565