“让大模型变小”是很多语言模型研究者的学术追求。针对大模型昂贵的环境和训练成本,陈丹琪在清远学年致远大会上作了题为“Makinglargemodelssmaller”的专题报告。报告重点介绍了基于记忆增强的TRIME算法和基于联合剪枝逐层蒸馏的CofiPruning算法。前者可以在不改变模型结构的情况下兼顾语言模型复杂度和检索速度的优势;而后者在保证下游任务准确性的同时,可以实现更快的处理速度和更小的模型结构。陈丹琪陈丹琪,普林斯顿大学计算机系助理教授,2012年毕业于清华大学姚班,获博士学位。2018年获得斯坦福大学计算机科学博士学位。1背景介绍近年来,自然语言处理领域正迅速被大型语言模型所主导。自GPT3出现以来,语言模型的规模呈指数级增长。大型科技公司不断发布越来越大的语言模型。近日,MetaAI发布了OPT语言模型(包含1750亿参数的大规模语言模型),并向公众开放了源代码和模型参数。研究人员之所以极力推荐大型语言模型,是因为其出色的学习能力和性能,但人们对大型语言模型的黑盒本质仍知之甚少。将一个问题输入到语言模型中,通过语言模型一步步推理,可以解决非常复杂的推理问题,比如推导计算题的答案。但同时,大型语言模型也存在风险,尤其是其环境和经济成本,例如:GPT-3等大型语言模型的能耗和碳排放量惊人。面对大型语言模型训练成本高、参数量大的问题,陈丹团队希望通过学术研究降低预训练模型的计算量,让语言模型更高效地面向底层应用。为此,重点介绍了团队的两部作品。一种是用于语言模型的新训练方法,称为TRIME,另一种是用于下游任务的有效模型剪枝方法,称为CofiPruning。2团队工作介绍:TRIME,CofiPruning论文地址:https://arxiv.org/abs/2205.12674传统语言模型的训练过程如下:给定一个文档,将其输入到Transformer编码器中得到隐藏向量,并然后将这些转换后的隐藏向量送入softmax层,该层的输出是由V个词嵌入向量组成的矩阵,其中V表示词汇表的大小。最后,可以利用这些输出向量对原文进行预测,并与给定文档的标准答案进行比较,计算梯度,实现梯度的反向传播。但是,这样的训练范式会带来以下问题:(1)庞大的Transformer编码器会带来高昂的训练成本;(2)语言模型的输入长度是固定的,Transformer的计算规模会随着序列长度的变化Level增长成二次方,因此Transformer难以处理长文本;(3)今天的训练范式是将文本投影到一个固定长度的向量空间来预测下一个词。这种训练范式实际上是语言模型的一个瓶颈。为此,陈丹琪团队提出了一种新的训练范式——TRIME,主要使用batchmemory进行训练,并在此基础上提出了三种共享相同训练目标函数的语言模型,即TrimeLM、TrimeLMlong和TrimeLMext。TrimeLM可以看作是标准语言模型的替代品;TrimeLMlong专为长距离文本而设计,类似于Transformer-XL;TrimeLMext结合了大数据存储区域,类似于kNN-LM。在上述训练范式下,TRIME首先将输入文本定义为,然后将输入传输给Transformer编码器,得到隐藏向量。softmax层之后得到下一个要预测的词,在整个训练范式中可以训练的参数是和E。陈丹琪团队的工作受到以下两个工作的启发:(1)连续缓存(Grave等人提出的Continuouscache)算法。2017年,该算法在训练过程中训练了一个普通语言模型;在推理过程中,给定输入文本,它首先枚举所有在给定文本中出现过的词和所有等于下一个待预测词的标签位置,然后利用隐藏变量和温度参数被计算为缓存分布。在测试阶段,语言模型分布和缓存分布之间的线性插值可以得到更好的实验结果。(2)Khandelwal等人提出的k-最近邻语言模型(kNN-LM)。2020年。这种方法类似于持续缓存算法。两者最大的区别是kNN-LM为所有的训练样本建立了一个数据存储。在测试阶段,会对数据存储区中的数据进行k近邻搜索,选出最好的top-k数据。以上两个作品实际上只是在测试阶段使用了缓存分布和k近邻分布,在训练过程中也只是延续了传统的语言模型,语言模型在推理中并没有优化缓存和数据存储的结合阶段。此外,还有一些针对超长文本的语言模型工作值得关注,比如2019年提出的结合Attentionrecurrence机制的Transformer-XL和2020年提出的Memorycompression(内存压缩)的CompressiveTransformers,etc.在前几项工作的基础上,陈丹琪团队构建了一种基于批记忆的语言模型训练方法。主要思想是为同一个训练批次构建一个工作记忆。对于给定文本预测下一个单词的任务,TRIME的思想与比较学习非常相似。它不仅考虑了使用softmax词嵌入矩阵预测下一个词的概率的任务,还增加了一个模块,其中所有出现在训练记忆中并且与给定的待预测词相同的所有其他文本文本。因此,整个TRIME训练目标函数包括两部分:(1)基于输出词嵌入矩阵的预测任务。(2)在trainingmemory中共享待预测同词文本的相似度,其中将需要衡量相似度的向量表示通过最后的前馈层的输入,通过缩放点来衡量向量相似度产品。该算法希望最终训练好的网络能够尽可能准确的实现最终预测的词,同时在同一个训练batch中共享同一个待预测词的文本尽可能相似,使得所有的文本记忆表示可以在端到端神经网络学习的训练过程中通过反向传播来实现。该算法的实现思路很大程度上受到了2020年提出的密集检索(denseretrieval)的启发。密集检索在训练阶段将查询和正相关文档对齐,并使用同一批次的文档作为负样本。从存储库中检索相关文档。TRIME的推理阶段与训练过程几乎相同,唯一的区别是可能使用不同的测试记忆,包括本地记忆、长期记忆和外部记忆。Localmemory是指所有出现在当前segment中并且已经被attention机制向量化的词;long-termmemory是指由于输入长度限制无法直接获取的文本表示,而是来自与待处理文本相同的文档,externalMemory是指所有训练样本或附加语料库的大数据存储区存储。为了尽量减少训练和测试阶段的不一致性,需要采用一定的数据处理策略来更好地建立训练记忆。本地内存指的是同一块数据中的先前标记,使用起来非常便宜。在训练阶段和测试阶段,可以采用随机抽样的批处理方式,直接使用本地内存,从而得到一个基于本地内存的TrimeLM模型的基础版本。长期记忆是指同一文档的先前片段中的标记,这些标记需要依赖于同一文档的先前片段。为此,将同一文档中的连续片段(consecutivesegments)放入同一个训练批次中,从而产生了集体长期记忆的TrimeLMlong模型。需要结合大型数据存储来检索外部存储器。为此,可以使用BM25将训练数据中相似的片段放入同一个训练批次中,从而产生结合外部存储器的TrimeLMext模型。综上所述,传统语言模型在训练阶段和测试阶段不使用内存;持续缓存方法在测试阶段只使用本地内存或长期内存;k-最近邻语言模型在测试阶段使用外部存储器;而对于TRIME算法的三种语言模型,在训练阶段和测试阶段都采用了记忆增强的方法。其中,TrimeLM在训练阶段和测试阶段都使用局部记忆,而TrimeLMlong将同一文档的连续片段放入同一批训练中,在测试阶段结合了局部记忆和长期记忆,TrimeLMext将类似在训练阶段将文档放入同一批次的训练中,在测试阶段结合本地记忆、长期记忆和外部记忆。实验阶段,在WikiText-103数据集上测试模型参数247M、切片长度3072时,基于TRIME算法的语言模型的三个版本均能取得比传统Transformer更好的perplexity效果,其中TrimeLMext基于实际距离的模型可以达到最好的实验效果。同时,TrimeLM和TrimeLMlong也能保持与传统Transformer接近的检索速度,同时具有困惑度和检索速度的优势。在WikiText-103数据集上测试模型参数150M,切片长度150时,可以看出,由于TrimeLMlong在训练阶段将同一个文档的连续段进行同一批训练,结合了localmemory和long-测试阶段的长期记忆。因此,虽然切片长度只有150,但测试阶段实际可用数据可达15000,实验效果远优于其他基线模型。对于字符级语言模型构建,基于TRIME算法的语言模型在enwik8数据集上也取得了最好的实验结果。同时,在机器翻译的应用任务中,TrimeMT_ext也取得了超过baseline模型的实验结果。综上所述,基于TRIME算法的语言模型采用了三种记忆构建方式,充分利用同一批次中的相关数据实现记忆增强,在引入记忆的同时不引入大量的计算代价,不改变模型。与其他基线模型相比,整体结构取得了更好的实验效果。陈丹琪还重点介绍了基于检索的语言模型。事实上,TrimeLMext可以看作是k近邻语言模型的更好版本,但是在推理过程中,这两种算法比其他基线模型慢了将近10到60倍,这显然是不能接受的。陈丹琪指出了基于检索的语言模型未来可能的发展方向之一:是否可以使用更小的检索编码器和更大的数据存储区域来降低最近邻搜索的计算成本。与传统语言模型相比,基于检索的语言模型具有显着优势,例如:基于检索的语言模型可以更好地更新和维护,而传统语言模型由于使用了先前的知识而无法实现动态知识用于培训更新;同时,基于检索的语言模型可以更好地应用于隐私敏感领域。至于如何更好地利用基于检索的语言模型,陈丹琪老师认为可以通过微调、提示或情境学习来辅助解决。论文地址:https://arxiv.org/abs/2204.00408模型压缩技术广泛应用于大型语言模型,可以让更小的模型更快地应用于下游应用。其中,传统主流的模型压缩方式是蒸馏(Distillation)和剪枝。对于蒸馏,往往需要预先定义一个固定的学生模型,通常是随机初始化,然后将知识从教师模型迁移到学生模型,从而实现知识蒸馏。比如从原始版本的BERT开始,经过一般的蒸馏,即在大量未标注的语料上进行训练后,就可以得到TinyBERT4的基础版本。对于基础版的TinyBERT4,也可以通过任务驱动的蒸馏法进行微调。TinyBERT4,最终模型可以比原始BERT模型更小更快,但精度略有下降。然而,这种基于蒸馏的方法也存在一定的缺陷。例如,对于不同的下游任务,模型的架构往往是固定的;同时需要使用无标签数据从头开始训练,计算成本过高。对于剪枝,往往需要从一个教师模型开始,然后不断地从原始模型中去除不相关的部分。2019年提出的非结构化剪枝可以得到更小的模型但是运行速度提升不大,而结构化剪枝在实际应用中通过去掉前馈层等参数组实现了速度提升,比如2021年提出的块剪枝可以达到2-3倍加速。针对传统蒸馏剪枝方法的局限性,陈丹琪团队提出了一种名为CofiPruning的算法,该算法同时对粗粒度单元和细粒度单元进行剪枝,并设计了逐层蒸馏目标函数,将知识从未剪枝的单元中迁移出来将模型转移到剪枝后的模型,最终可以在保持90%以上准确率的基础上实现10倍以上的速度提升,相比传统的蒸馏方法计算成本更低。CofiPruning的提出基于两个重要的基础工作:(1)对于整层剪枝,可以提高速度。相关工作指出,大约50%的神经网络层都可以被剪枝,但是粗粒度的剪枝对准确率影响很大。(2)对head等较小的单元进行剪枝可以获得更好的灵活性,但是这种方法在实现上会是一个比较困难的优化问题,速度上不会有太大的提升。为此,陈丹琪团队希望能够同时对粗粒度单元和细粒度单元进行剪枝,从而兼顾两种粒度的优势。此外,为了解决从原始模型到剪枝模型的数据传输,CofiPruning在剪枝过程中使用逐层对齐的方法来传输知识。最终的目标函数包括蒸馏损失和基于稀疏性的RagLange损失。在实验阶段,在用于句子分类任务的GLUE数据集和用于问答任务的SQuAD1.1数据集上,可以发现CofiPruning在相同速度和模型大小的基础上优于所有蒸馏和剪枝基线方法。对于TinyBERT,如果没有一般的蒸馏,实验效果会大打折扣;但是如果使用一般的蒸馏,虽然可以提高实验效果,但是训练时间会非常昂贵。CofiPruning算法不仅可以达到与基线模型几乎相同的效果,而且在运行时间和计算成本上都有很大的提升,能够以更少的计算成本获得更快的处理速度。实验表明,对于粗粒度单元,第一层和最后一层前馈层得到最大程度的保留,中间层更容易被剪枝;对于细粒度单元,上层神经网络的头部和中间维度更有可能被修剪。综上所述,CofiPruning是一种非常简单有效的模型压缩算法。通过对粗粒度单元和细粒度单元进行联合剪枝,结合逐层蒸馏的目标函数,将结构剪枝和知识蒸馏两种算法连接起来。优势,导致更快的处理速度和更小的模型结构。对于模型压缩的未来趋势,陈丹琪还重点关注了是否可以对GPT-3等大规模语言模型进行剪枝,是否可以对上游任务进行剪枝。这些都是以后可以重点研究的研究思路。3总结与展望大规模语言模型已经取得了非常喜人的实际应用价值,但是由于昂贵的环境和经济成本、隐私和公平、实时更新等问题,大规模语言模型还有很多需要改进的地方地方。陈丹琪认为,未来的语言模型可能作为一个大规模的知识库。同时,未来语言模型的规模需要大幅缩减。或许可以使用基于检索的语言模型或稀疏语言模型来代替密集检索。模型压缩的工作也很重要。研究人员需要重点关注。
