论文地址: arXiv: https://arxiv.org/abs/2103.10360
官网:https://chatglm.cn/blog
Github:https://github.com/THUDM/ChatGLM-6B
在日益增多的开源大模型中,由清华大学研发的开源大模型 GLM 由于效果出众而受到大众关注,而且清华大学开源了基于 GLM 架构研发的基座模型:ChatGLM-6B以及GLM-130B。
2022年11月,斯坦福大学大模型中心对全球30个主流大模型进行了全方位的评测2,GLM-130B 是亚洲唯一入选的大模型。在与 OpenAI、谷歌大脑、微软、英伟达、脸书的各大模型对比中,评测报告显示 GLM-130B 在准确性和恶意性指标上与 GPT-3 175B (davinci) 接近或持平,鲁棒性和校准误差在所有千亿规模的基座大模型(作为公平对比,只对比无指令提示微调模型)中表现不错。
GLM-130B可能是当前开源ChatGPT复现中中文效果最好的基础模型。
本文就GLM的基础构架和预训练方式,深入浅出地分析GLM为何实现如此出众的效果。
Note: 为控制篇幅,本文仅介绍GLM的基础构架和预训练; GLM-130B和ChatGLM的升级等会在part2再介绍
NLP 任务通常分为三类:
这些分类有助于更好地了解 NLP 任务的目标和方法。但随着研究的深入和新技术的发展,任务之间的界限变得模糊。例如,预训练语言模型(如 GPT3.5)已经证明可以在多种 NLP 任务中实现高性能,包括自然语言理解和生成任务。
预训练模型根据架构,也分为三类,分别是:自编码 (auto-encoding)、编码解码 (encoder-decoder)、自回归 (auto-regressive)。三种训练模型分别对应前面三种任务,具体如下图:
通过去噪目标(即通过覆盖句中的单词,或者对句子做结构调整,让模型复原单词和词序,从而调节网络参数)学习双向上下文的编码器,例如掩码语言模型 (MLM) 。自编码模型擅长自然语言理解NLU任务,常用于生成句子的上下文表示,但是不能直接用于文本生成。
代表模型如BERT、RoBERTa、ALBERT
从左往右学习的模型,根据句子中前面的单词,预测下一个单词。例如,通过“LM is a typical task in natural language ____”预测单词“processing”。
在长文本的生成能力很强,缺点就是单向的注意力机制在 NLU 任务中,不能完全捕捉 token 的内在联系。
代表模型如:GPT系列、GPT-2、GPT-3
编码解码 (encoder-decoder):
编码器使用双向注意力,解码器使用单向注意力,并且有交叉注意力连接两者,在有条件生成任务(seq-seq)中表现良好,比如生成摘要、生成式问答、机器翻译
代表模型MASS、BART、PALM
三种预训练框架各有利弊,没有一种框架在以下三种领域的表现最佳:自然语言理解(NLU)、无条件生成以及条件生成。
以前的工作尝试通过多任务学习(Dong 等人,2019;Bao 等人,2020;例如T5)结合它们的目标来统一不同的框架。然而,由于自编码和自回归目标在本质上是不同的,简单的统一不能充分继承两个框架的优势。
基于以上的原因,清华研究团队提出了一种基于“自回归空白填充”的预训练框架,名为 GLM(通用语言模型)。
GLM可以通过改变空格的数量和长度来对不同类型的任务进行预训练,结合了自编码和自回归预训练的优点。在NLU、条件生成和无条件生成的广泛任务中,在相同模型大小和数据的情况下,GLM优于BERT、T5和GPT。
GLM 按照auto-encoding的思路,从输入文本中随机清空连续的token,并根据auto-regressive的思想,训练模型进行序列重构。
虽然在T5 (rafael et al., 2020) 中使用了空白填充进行文本到文本的预训练,但GLM提出了两个更进一步的改变:Span shuffling和二维位置编码。
总结改变如下:
GLM 提出了一种基于自回归空白填充目标的通用预训练框:GLM将NLU任务制定为包含任务描述的填空问题,这些填空问题可以通过自回归生成来回答,同时,通过优化一个自回归的空白填充目标来训练GLM。
官方话术的任务描述:
给定输入文本 , 多个文本跨度(text span) 从文本输入被采样; 其中每个对应中一系列连续的tokens;
每个span被替换为单个[MASK],形成一个损坏的文本;
该模型以一种自回归的方式从损坏的文本中预测跨度中缺失的标记,这意味着在预测跨度中缺失的标记时,该模型可以访问损坏的文本(中的文本)和先前预测的跨度 ();
为了充分捕捉不同跨度之间的相互依赖关系,随机排列跨度的顺序;
形式上,设为长度为m的索引序列的所有可能排列的集合,而 为,要优化的目标即为:
GLM通常以从左到右的方向生成空白处的单词,表明跨度的概率可分解为:
具体怎么样,我们上栗子:
(a) 原始文本为 [x1, x2, x3, x4, x5, x6]。两个text span [x3] 和 [x5, x6] 被采样。
(b) 用 [M] 替换 Part A 中的采样范围,并在 Part B 中随机打乱这些范围。
(c) GLM 自回归地生成 Part B。每个范围前面都加上 [S] 作为输入,后面加上 [E] 作为输出。二维位置编码表示跨范围和范围内的位置 (i.e., 第一维度的位置编码表示跨范围中被采样范围的相对位置位置;第二维度表示被采样的范围内,每个token的相对位置)。
(d) 自注意力掩码。灰色区域被屏蔽。Part A 的 tokens 可以关注自己(蓝色框),但不能关注 B。Part B 的 tokens 可以关注 A 和 B 中在该token之前的部分(黄色和绿色框分别对应两个范围)。
具体如下:
(1)Part A中的tokens彼此可见,但是不可见B中的任意tokens。
(2)Part B tokens可见Part A。
(3)Part B tokens可见B中过去的tokens,不可见B中未来的tokens。
( [M] := [MASK], [S] := [START], and [E] := [END] )
(e) 采样方式:从一个均值为3的泊松分布中采样片段的长度,直到原始文本中15%的字符被掩盖。
基于以上的设计,模型可以可以自动学习双向encoder(Part A)以及单向decoder(Part B)。
上述方法适合于NLU任务。然而,研究团队希望可以训练一个可以同时处理NLU和文本生成的单一模型。然后,研究团队增加了一个多任务预训练设置,其中第二个目标是生成更长的文本,该目标与空白填充目标共同优化。
长文本生成具体包含以下两个目标:
自回归填充有些类似掩码语言模型,首先采样输入文本中部分片段,将其替换为[MASK]标记,然后预测[MASK]所对应的文本片段。与掩码语言模型不同的是,预测的过程是采用自回归的方式。
GLM的训练数据集参考https://github.com/THUDM/GLM/blob/main/data_utils/corpora.py,包括:
NAMED_CORPORA = { 'wikipedia': wikipedia, 'wikipedia-key': KeyReader, 'openwebtext': OpenWebText, "zhihu": zhihu, "zhidao": zhidao, "baike": baike, "test": TestDataset, 'wikibook': BertData, "bert-base": BertBaseData, "bert-large": BertLargeData, 'cc-news': CCNews, 'pile': Pile, 'stories': Stories, 'wudao': WuDaoCorpus }
GLM使用单个Transformer,并对其架构进行了一些修改:
(1)重新安排了层归一化和残差连接的顺序 (将Post-LN改成Pre-LN),这对于大规模语言模型避免数值误差至关重要;
(2)使用单个线性层进行输出token预测;
(3)用GeLUs替换ReLU激活函数。
GLM在训练任务过程中的注意力机制如下图:
其中,灰色区域表示被屏蔽的部分,即Part A (corrupt text)可以双向关注自己内部的token(蓝色框部分),而不可以关注到Part B中的部分;
而Part B 内部的 tokens 可以关注 Part A 以及Part B 中在该token之前的部分(黄色和绿色框分别对应两个范围)
自回归空白填充任务的挑战之一是如何编码位置信息。
GLM提出了二维位置编码来解决这个挑战:具体来说,每个标记都用两个位置 id 编码。第一个位置 id 表示在损坏的文本 中的位置。对于掩码跨度,它是对应的[MASK]令牌的位置。
第二个位置 id 表示跨度内的位置。对于部分 A 中的标记,它们的第二个位置 id 为 0。对于部分 B 中的标记,它们的范围从 1 到掩码跨度的长度。
两个位置id通过可学习的嵌入表被投影成两个向量,这两个向量都被添加到输入tokens的嵌入中。
该编码方法确保模型在重构它们时不知道被掩盖跨度的长度。与其他模型相比,这是一个重要的区别。例如,XLNet(Yang 等人,2019)对原始位置进行编码,因此可以感知缺失标记的数量,而 SpanBERT(Joshi 等人,2020)用多个 [MASK] 标记替换跨度并保持长度不变。该设计更普遍适用于下游任务,因为通常生成的文本长度事先未知。
通常,对于下游NLU任务,线性分类器将由预训练模型产生的序列或标记的表示作为输入,并预测正确的标签。然而,这种微调方式,使下游任务与生成式预训练任务不同,导致预训练和微调之间的不一致。
研究团队针对文本分类任务和生成任务,重新定义了GLM下游微调的任务:
(1)分类任务
给定一个标注样本(x,y),我们将输入文本x通过模板转化为有一个[MASK]字符填空问题c(x)。标签y也映射到了填空问题的答案v(y) 。模型预测不同答案的概率对应了预测不同类别的概率
(2)生成任务
针对文本生成任务,直接将GLM作为一个自回归模型的应用。比如: 给定的上下文构成输入的部分的A,在结尾附上一个[MASK]字符,模型用自回归的方式去生成B部分的文本。
(1)与BERT对比
BERT是auto-encoder模型,来预测[MASK] token。因为模型中的[MASK] token都是独立的,BERT不能捕捉[MASK] token之间的依赖性,且无法处理多个连续的[MASK] token。
(2)与XLNet的对比
XLNet和GLM都是auto-regressive的模型,但是与GLM有两个不同点:(1)XLNet使用损坏前的原始位置编码。在推理过程中,我们需要知道或列举答案的长度;(2)使用双流注意力机制解决了信息泄漏的问题,改变了transfomer的结构,增加了耗时。
(3)与T5模型对比
T5也是处理的空白填充的任务目标,但是GLM使用了单个的transformer编码器学习单向和双向的注意力,且通过共享参数使参数比T5更有效。T5在encoding和decoding使用不同的位置编码,使用哨兵标记来识别不同的[MASK]跨度,哨兵标记造成了模型能力的浪费和预训练微调的不一致性。
(4)与UniLM对比
UniLM是通过在auto-encoder框架下改变在双向,单向,互相之间的attention mask来统一预训练目标;由于自编码模型的独立假设,自回归模型不能完全捕捉当前token对于前面token的依赖。对于微调下游任务来说,自编码会比自回归更加低效。
为了与BERT公平对比,使用与BERT相同的数据集训练——BooksCorpus和English Wikipedia。GLM-Base和GLM-Large在相同数据集下的表现优于BERT-Base和BERT-Large。
使用了NLU、seq2seq、空格填充以及零样本语言建模任务来评估GLM多目标任务的表现。
GLM-Doc和GLM-Sent仅使用一个预训练目标,因此在NLU上的表现均不如GLM-Large,但仍然优于BERT-Large和UniLM-Large。
在条件生成任务(Seq2seq)和空格填充中,GLM-Sent比GLM-Large的表现好,GLM-Doc的表现略差于GLM-Large。这表明模型拓展文本的文档级别的目标,对条件生成任务的帮助不大(条件生成任务旨在从context中抽取有效信息)。
在零样本语言建模任务中,在预训练过程中如果没有生成目标,GLMLarge将无法完成语言建模任务,其perplexity大于100。
在参数数量相同的情况下,GLMDoc的性能比GPTLarge差。这是预期的,因为GLMDoc不仅有文本生成的目标,还有空白填充目标。将模型参数增加到410M (GPTLarge的1.25倍),性能接近GPTLarge。GLM515M (GPTLarge的1.5倍)可以进一步优于GPTLarge。
由于GLM学习了双向注意,我们也在双向注意编码的情况下评估了GLM。在参数数量相同的情况下,对上下文进行双向注意编码可以提高语言建模的性能。在此设置下,GLM410M优于GPTLarge。这是GLM相对于单向GPT的优势。我们还研究了二维位置编码对长文本生成的贡献。我们发现,去除二维位置编码会导致语言建模精度降低和复杂度增加。
消融实验是一种评估模型组件对性能影响的方法,通过逐个移除或替换模型的某些部分,来观察模型在下游任务上的表现变化。作者使用了 SuperGLUE 作为评估数据集,它包含了八个自然语言理解任务。作者与 BERT 进行了对比实验,发现 GLM 在预训练和微调阶段都有优势。作者还分析了 GLM 的不同设计选择,如空白填充目标、空白顺序、空白表示、2D 位置编码等,对模型性能的影响。
主要发现如下:
(1)与封闭式微调的BERT相比,GLM受益于自回归预训练。特别是在ReCoRD和WSC中,其中语言表达器由多个token组成,GLM的性能始终优于BERT。这证明了GLM在处理变长空白方面的优势。
(2)另一个观察结果是,完形填空任务 (cloze finetuning)对GLM在NLU任务上的表现至关重要。
(3)删除shuffle span (总是从左到右预测掩码跨度)会导致GLM性能严重下降;相较于使用sentinel token,不使用反而性能更好
2022年11月,斯坦福大学大模型中心对全球30个主流大模型进行了全方位的评测,GLM-130B 是亚洲唯一入选的大模型。在与 OpenAI、谷歌大脑、微软、英伟达、脸书的各大模型对比中,评测报告显示 GLM-130B 在准确性和恶意性指标上与 GPT-3 175B (davinci) 接近甚至持平,鲁棒性和校准误差在所有千亿规模的基座大模型(作为公平对比,只对比无指令提示微调模型)中表现优异。
具体数据见下图:
ChatGLM-6B 参考了 ChatGPT 的设计思路,在千亿基座模型 GLM-130B 中注入了代码预训练,通过有监督微调等技术实现与人类意图对齐(即让机器的回答符合人类的期望和价值观)。
Note: 为控制篇幅,本文仅介绍GLM的基础构架和预训练; GLM-130B和ChatGLM的升级等会在part2再介绍
参考资料:
清华大学chatGLM论文解读_chatglm详解-CSDN博客
大模型的实践应用4-ChatGLM-6b大模型的结构与核心代码解读,最全的ChatGLM模型架构介绍与源码解读-CSDN博客
清华ChatGLM底层原理详解——ChatGPT国内最强开源平替,单卡可运行 - 知乎