从BERT到GPT-2再到GPT-3。大机型规模一路看涨,业绩也越来越惊人。增加模型的规模已经被证明是一条可行的改进路径,而前段时间DeepMind的一些研究表明这条路还没有走到尽头,继续增加模型仍然有相当大的收益。但同时,我们也知道增加模型可能并不是提升性能的唯一途径,前段时间的几项研究也证明了这一点。其中比较有代表性的研究有DeepMind的RETROTransformer和OpenAI的WebGPT。这两项研究表明,如果我们用一种搜索/查询信息的方式来增强模型,较小的生成语言模型也可以达到以前的大型模型可以达到的性能。在大尺度模型一统天下的今天,这种研究非常有价值。在这篇文章中,专门研究机器学习可视化的知名博主JayAlammar详细分析了DeepMind的RETRO(Retrieval-EnhancedTRansfOrmer)模型。该模型具有与GPT-3相当的性能,但只有GPT-3的4%的参数。RETRO集成了从数据库中检索到的信息,将其参数从昂贵的事实和世界知识存储中解放出来。在RETRO之前,研究界有一些工作采用了类似的方法,因此本文并不是要解释其新颖性,而是解释模型本身。从世界知识信息中分离出语言信息一般来说,语言模型的任务是填补空白。这个任务有时需要与事实相关的信息,例如但有时,如果你熟悉某种语言,你也可以直接猜测填空的内容,例如:这个区别很重要,因为大型语言模型编码他们知道的一切都进入模型参数。虽然这对语言信息有意义,但对事实和世界知识信息无效。加入检索方法后,语言模型可以减少很多。在文本生成过程中,神经数据库可以帮助模型检索所需的事实信息。随着训练数据的内存量减少,我们可以使用更小的语言模型来加速训练。任何人都可以在更小、更便宜的GPU上部署这些模型,并根据需要对其进行调整。在结构上,RETRO是一个编码器-解码器模型,就像原来的Transformer一样。但是,它在搜索数据库的帮助下增加了输入序列。该模型在数据库中找到最有可能的序列并将它们添加到输入中。RETRO使用它的魔力来生成输出预测。在探索模型架构之前,让我们更深入地研究一下检索数据库。RETRO的搜索数据库这里的数据库是key-valuestore数据库。key是一个标准的BERTsentenceembedding,value是由两部分组成的文本:Neighbor,用于计算key;完成,继续原文件中的文本。RETRO的数据库包含2万亿个基于MassiveText数据集的多语言标记。邻居块和完成块的长度最多为64个令牌。RETRO数据库内部显示了RETRO数据库中键值对的示例。RETRO将输入提示拆分为块。为简单起见,这里我们重点关注如何使用检索到的文本来扩充块。但是,模型对输入提示中除第一个块之外的每个块都执行此过程。数据库查找在点击RETRO之前将提示输入BERT。输出上下文向量被平均以构建句子嵌入向量。然后使用该向量查询数据库。使用BERT处理输入提示会产生上下文化的标记嵌入。对它们进行平均会产生一个句子嵌入。然后将该句子嵌入用于近似最近邻搜索。检索其文本成为RETRO输入的一部分的两个最近邻居。BERT句子嵌入用于从RETRO的神经数据库中检索最近的邻居。然后将这些添加到语言模型的输入中。现在RETRO的输入是:输入提示及其来自数据库的两个最近邻居(及其延续)。从这里开始,Transformer和RETRO块将信息合并到它们的处理中。检索到的邻居被添加到语言模型的输入中。但是,它们在模型内部的处理方式略有不同。高层RETRO架构RETRO的架构由一个编码器堆栈和一个解码器堆栈组成。RETROTransformer由一个编码器堆栈(处理邻居)和一个解码器堆栈(处理输入)组成。编码器由标准的Transformer编码器块(self-attention+FFNN)组成。Retro使用由两个Transformer编码器块组成的编码器。解码器堆栈包含两个解码器块:标准Transformer解码器块(ATTN+FFNN)RETRO解码器块(ATTN+Chunkedcrossattention(CCA)+FFNN)组成RETRO的三个Transformer模块编码器堆栈处理检索邻居生成后面会用到attention的KEYS和VALUES矩阵。解码器块处理输入文本,如GPT。它将自注意力应用于提示标记(因此只关注之前的标记),然后通过FFNN层。只有当它到达RETRO解码器时,它才会开始合并检索到的信息。从9开始的每三个块是一个RETRO块(允许其输入跟随邻居)。所以第9、12、15...32层是RETRO块。下图显示了检索到的信息,可以通过提示完成节点所需步骤进行浏览。
