ChatGLM有多火!
最近经常可以在头条、B站、知乎上刷到很多介绍ChatGLM的文章,以及如何使用ChatGLM进行垂直场景进行微调的文章,从下面的截图中,可见一斑!好奇心驱使下,也来学习下ChatGLM,以及了解下如何使用该模型去解决一些问题!
ChatGLM的能力介绍
“智谱AI”这家公司( www.zhipuai.cn/ ),2019年6月成立。
由清华技术成果转化的公司“智谱 AI” 宣布开源了 GLM 系列模型的新成员 —— 中英双语对话模型ChatGLM-6B,支持在单张消费级显卡上进行推理使用。这是继此前开源 GLM-130B 千亿基座模型之后,智谱 AI 再次推出大模型方向的研究成果。
ChatGLM-6B 使用了和 ChatGLM 相同的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 虽然规模不及千亿模型,但大大降低了推理成本,提升了效率,并且已经能生成相当符合人类偏好的回答。
ChatGLM-6B 具备以下特点:
- 充分的中英双语预训练: ChatGLM-6B 在 1:1 比例的中英语料上训练了 1T 的 token 量,兼具双语能力。
- 优化的模型架构和大小: 吸取 GLM-130B 训练经验,修正了二维 RoPE 位置编码实现,使用传统 FFN 结构。6B(62 亿)的参数大小,也使得研究者和个人开发者自己微调和部署 ChatGLM-6B 成为可能。
- 较低的部署门槛: FP16 半精度下,ChatGLM-6B 需要至少 13 GB 的显存进行推理,结合模型量化技术,这一需求可以进一步降低到 10GB(INT8) 和 6GB(INT4),使得 ChatGLM-6B 可以部署在消费级显卡上。
- 更长的序列长度: 相比 GLM-10B(序列长度 1024),ChatGLM-6B 序列长度达 2048,支持更长对话和应用。
- 人类意图对齐训练: 使用了监督微调(Supervised Fine-Tuning)、反馈自助(Feedback Bootstrap)、人类反馈强化学习(Reinforcement Learning from Human Feedback)等方式,使模型初具理解人类指令意图的能力。输出格式为 markdown,方便展示。
从论文中了解下ChatGLM
ChatGLM的核心模型,源自于这篇文章:《GLM:General Language Model Pretraining with Autoregressive Blank Infilling》,其中作者的身份背景也是蛮多的。
作者概览
清华 & 北京智源人工智能研究院(BAAI)
- Zhengxiao Du 清华大学的博士生,师从 唐杰 教授,个人主页 zxdu.xyz/院Xiao Liu、Ming Ding、Jiezhong Qiu、Jie Tang
清华 & 上海期智研究院
- Zhilin Yang
MIT CSAIL(计算机科学与人工智能实验室)
- Yujie Qian PHD at MIT,之前也是清华大学的学生,师从 唐杰 教授,个人主页 people.csail.mit.edu/yujieq/
核心摘要
有多种类型的预训练架构,包括自动编码模型(例如 BERT)、自回归模型(例如 GPT)和编码器-解码器模型(例如 T5)。 然而,没有一个预训练框架在自然语言理解(NLU)、无条件生成和条件生成这三个主要类别的所有任务上表现最佳。 作者提出了一种基于自回归空白填充的通用语言模型 (GLM) 来应对这一挑战。 GLM 通过添加 2D 位置编码(2D positional encoding)并允许以任意顺序预测spans来改进空白填充预训练,这会提升在 NLU 任务上的性能。 同时,GLM 可以通过改变空白的数量和长度来针对不同类型的任务进行预训练。 在 NLU、条件和无条件生成的广泛任务中,GLM 在给定相同的模型大小和数据的情况下优于 BERT、T5 和 GPT,并从具有 1.25倍BERT(Large)参数的单个预训练模型中获得最佳性能,证明它对不同下游任务的普遍性。
小知识:Predict Spans
在NLU领域中,predict spans指的是对文本中的实体或事件等关键词进行识别和标注,并预测它们在文本中的位置和范围。例如,在命名实体识别任务中,predict spans可以预测出文本中人名、地名、组织机构等实体的位置和范围;在事件抽取任务中,predict spans可以预测出文本中事件的触发词和相关实体的位置和范围。通过预测spans,可以从文本中提取出有用的信息,为后续的任务提供基础支持。
前人工作的总结
- GPT(AutoRegressive Model):学习从左到右的语言模型。 虽然在长文本生成方面取得了成功,并且在扩展到数十亿参数时显示出少量学习能力,但固有的缺点是单向注意机制,它不能完全捕获 NLU 任务中上下文词之间的依赖关系。
- BERT(AutoEncoding Model):通过去噪目标学习双向上下文编码器,例如:掩码语言模型 (MLM)。 编码器产生适合自然语言理解任务的上下文表示,但不能直接应用于文本生成。
- T5(Encoder-decoder Model):编码器-解码器模型对编码器采用双向注意力机制,对解码器采用单向注意力机制,并在它们之间进行交叉注意。 通常使用在条件生成任务(Conditional Generation)中,例如文本摘要和响应生成。 T5通过编码器-解码器模型统一了 NLU 和条件生成,但需要更多参数来匹配基于 BRET 的模型的性能。
这些预训练框架都不够灵活,无法在所有 NLP 任务中具有竞争力。 以前的工作试图通过多任务学习(Multi-Task Learning)结合目标来统一不同的框架。 然而,由于自编码和自回归目标本质上不同,简单的统一不能完全继承两个框架的优点。
- Unified language model pre-training for natural language understand- ing and generation s(NIPS 2019)
- Unilmv2: Pseudo-masked language models for uni- fied language model pre-training. (ICML 2020)
GLM的核心工作
一句话概括就是:设计了一个特殊的任务《Auto Regressive Blank Infilling》,GLM 将 NLU 任务制定为包含任务描述的完形填空问题,这些问题可以通过自回归生成来回答。在一些大规模的数据集上进行训练后,得到了较好的结果。
按照自动编码的思想从输入文本中随机删除连续的标记spans,并按照自回归预训练的思想训练模型顺序重建spans(见图)。 虽然空白填充(Blank Filling)已在 T5中用于文本到文本的预训练,但我们提出了两项改进,即 span shuffling 和 2D positional encoding。 在参数量和计算成本相同的情况下,GLM 在 SuperGLUE 基准测试中的表现明显优于 BERT 4.6% - 5.0%,并且在类似规模的语料库(158GB训练数据)上进行预训练时优于 RoBERTa 和 BART。 GLM 在 NLU 和参数和数据更少的生成任务上也明显优于 T5。
受模式利用训练 (Pattern-Exploiting Training, PET)的启发,我们将 NLU 任务重新表述为模拟人类语言的人工制作的完形填空问题。 与 PET 使用的基于 BERT 的模型不同,GLM 可以通过自回归填空自然地处理完形填空问题的多标记答案。
- Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference (2020)
预训练任务的约束
AutoRegressive Blank Infilling
- 上图中图(a,b,c,d)这几个部分的内容理解如下
输入文本 从上述的文本中采样出来一个连续的Token序列其中, 表示的是一个连续的token序列,将某一个span替换成一个 [MASK] 的Token,我们把这个序列称为 corrupted text
为了让模型能较好去捕获不同span之间的依赖性,作者采用 Permutation Language Model (XLNet:Generalized Autoregressive Pretraining for Language Understanding,NIPS 2019)
其中, m 的所有序列的排列其中上述部分可以转换成如下的表达式:
输入的文本可以划分成两个部分,图(2)中的(B)部分
- 是
- 是带掩码的span内容
Query(Part A + Part B)中每个Token可以感知到的其它Token的作用范围在图2中的(C)部分
- 按照的泊松分布的概率分布去对文本中的span进行随机采样,大约采样到有15%的内容被Mask掉就可以了,经验上讲15%的随机Mask占比对下游的自然语言理解任务的效果是最好的。
Multi-Task Pretraining
我们研究了一个多任务预训练设置,其中生成更长文本的第二个目标与空白填充目标联合优化。 我们考虑以下两个目标
- 文件级: 对单个跨度进行采样,其长度是从原始长度的 50%–100% 的均匀分布中采样的。 该目标旨在生成长文本;
- 句子级: 我们限制屏蔽的跨度必须是完整的句子。 对多个跨度(句子)进行采样以覆盖原始标记的 15%。 该目标针对的是序列预测任务(Seq2Seq) 通常是完整句子或段落;
模型架构
GLM对单个Transformer架构进行了多处修改:
- 重新排列了层归一化和残差连接的顺序,这已被证明对于大规模语言模型避免数值错误至关重要( Megatron-lm: Training multi-billion pa- rameter language models using model parallelism. 2019)
- 使用单个线性层进行输出标记预测;
- 用 GeLU 替换 ReLU 激活函数(Bridging nonlinearities and stochastic regularizers with gaussian error linear units 2016)
GeLU即Gaussian Error Linear Units,其函数表达式为:
其中为标准正态分布的累积分布函数,即:
位置编码(2D Positional Encoding)
我们这里先简单的回顾一下在Transformer模型中的位置编码的设计。
Transformer模型中《Attention is All You Need》的位置编码是为了在输入中引入序列信息,使模型能够区分不同位置的词语。它的设计思路是通过将位置信息编码成一个向量,与词向量相加来表达每个位置的信息。
具体而言,位置编码向量是根据位置信息计算得到的,每个位置对应一个唯一的向量。这个向量可以通过以下公式计算得到:
其中,pos是词语在输入序列中的位置,i是位置编码向量中的下标, 是模型的隐藏层的维度。位置编码向量的作用是为每个位置引入一个相对的位置信息,并且能够保持一定的连续性,让模型能够理解序列的整体结构。这种位置编码方式相比于简单的标号编码,能够更好的表示位置信息,也更设计模型的自注意力机制。
好,我们在翻回头看下这篇文中提出的2D位置编码的设计。如何对位置信息进行编码是自回归填充任务的难点之一。看上图(C)中的内容,一起看一个预先准备好的样本
其中,[M] 表示在输入阶段被掩码掉的内容,[S] 表示在输入阶段的一个占位符,[E] 表示在输出阶段的一个序列的结束符;在设计的设计中是先解决序列预测的问题,然后在解决上下文的填空问题。
在图(C)中,有两个位置 Position 1/2,其中Pos 1是用来表示被破坏(就是经过掩码)之后的序列中,每个Token的标号,Pos 2是用来表示某个被掩码掉的Span中中间的序列信息,非掩码部分填充为0。两个位置id通过可学习的嵌入表被投影成两个向量,这两个向量都被添加到输入标记嵌入中。这里有一个好处,就是这种编码方式可以让模型在重建时不知道被掩码部分的长度信息。这也是因为,GLM模型的下游任务其实无法事先知道掩码部分的token的长度。
微调GLM
通常,对于下游NLU任务,线性分类器将由预训练模型产生的序列或标记的表示作为输入,并预测正确的标签。事实上生成式预训练任务不同,导致预训练和微调之间的不一致。受PET这个文章的启发,作者使用空白填充的生成任务重新设计了NLU分类任务。根据如下这个图,我们一起来了解一下,
对于一个给定标签的样本,把文本x设计成单个词的完形填空问题,其中 y 表示完形填空的结果。
通过这个任务的设计,可以实现条生成词的分类任务、内容的自动回归(生成部分)的统一。
实验部分
这部分会设计到很多的对比条件和表格结论,就不去翻译原文了,感兴趣的读者可以去阅读原文。
作者花费了大量的精力跟BERT、UniLM、T5、BART、RoBERT、BERTSumAbs等进行了大量的实验对比,其中部分涉及到的数据集我从文章中摘录出来,供大家快速去阅读和下载。
作者通过在SuperGLUE这个标准测试任务中进行了对比实验;也在 Sequence-to-Sequence、Text Infilling、Language Modeling等几个任务上进行了更加细致的实验结果分析。
几个预训练的数据集
- ICCV 2015 - Aligning books and movies Tovwards story-like visual explannations by watching movies and reading books
- CC-News (the English portion of the CommonCrawl News dataset) commoncrawl.org/2016/10/ news-dataset-available
- Gigaword dataset for abstractive summarization (EMNLP 2015) : A neural attention model for abstractive sentence summartization
- SQuAD 1.1 dataset for question generation
- Squad: 100, 000+ questions for machine comprehension of text (EMNLP 2016)
- Learning to Ask: Neural Question Generation for Reading Comprehension (ACL 2017)
- OpenWebText openwebtext2.readthedocs.io/en/latest
- Openwebtext corpus skylion007.github.io/OpenWebText…
- CNN/Daily Mail - Get To The Point: Summarization with Pointer-Generator Networks (ACL 2017)
- XSum datasets for abstractive sumarization - Don't Give Me the Details, Just the Summary ! Topic-Aware Convolutional Neural Networks for Extreme Summartization (EMNLP 2018)
- Yahoo Answers dataset - Improved variational autoencoders for text modeling using dilated convolutions (ICML 2017)
- WikiText 103 - contructed from Wikipedia documents
- LAMBADA Dataset - The LAMBADA dataset: Word prediction requiring a broad discourse context (ACL 2016)
接下来的几个预告
1. 了解下PET(Pattern-Exploiting Training)
推荐阅读
文中作者多次提到了受PET的启发,在多个处其它文章的阅读中,也涉及到了这篇文章,对于我了解LLM,应该是一个绕不过去的文章了,后续会仔细学习下这个文章,整理成笔记分享出来!
2. GLM源码的阅读整理
推荐阅读
- GLM-130B的Repo github.com/THUDM/GLM-1…
- GLM-130B论文 arxiv.org/abs/2210.02…
3. 基于GLM在特定场景任务的微调
推荐阅读
- 微调的源码 github.com/THUDM/ChatG…