🔥 最近由于chatgpt, gpt4等LLMs的出现,新一轮的AI军备竞赛再度掀起。而这一场大战无疑是一场烧钱大战,像我等平民,根本玩不起。为了学习学习,那就来玩玩清华开源的一款ChatGLM模型,他有个ChatGLM-6B的小版本,一张卡卡就能玩了。

😄 那么这篇博客就来讲讲ChatGLM的基座模型GLM。GLM集自编码、自回归、编码-解码的优势为一体(通过修改attention mask矩阵实现),算是一个小小的大一统模型,但优势相比chatgpt,还是有些差距,不过效果还过得去。


文章目录

  • 1、GLM 动机
  • 2、GLM 原理
  • 2.1、模型结构
  • 2.2、预训练结构设计
  • 2.3、预训练目标设计
  • 2.4、微调
  • 3、实验结果


1、GLM 动机

目前大预训练语言模型分为三类:
1、自编码模型 (Auto Encoding): BERT,ROBERTa,DeBERTa,ALBERT等;attention是双向的。主要用于以下类型任务:

  • 自然语言理解任务:情感分类,抽取式问答,自然语言推理等。

2、自回归模型 (Auto Regressive) : GPT系列等;attention是单向的。主要用于以下类型任务:

  • 无条件生成任务:语言建模等。

3、编码器-解码器模型 (Encoder-Decoder) : T5,BART,MASS,PALM等;encoder的attention是双向的,decoder的attention是单向的。主要用于以下类型任务:

  • 条件生成(seq2seq): 摘要,生成式问答,机器翻译等。

但问题是,这三大类模型,没有一种能在这三方面都达到最佳的。那么,GLM的出发点就是,设计一个模型能够兼具这3类模型的优点,并在这3大类任务上取得最佳性能。

2、GLM 原理

2.1、模型结构

采用transformer的decoder,因为无论是对于自然语言理解还是自然语言生成类任务,GLM都是看成生成任务做。额也不完全是decoder,只能说是类decoder,因为decoder是单向的,但GLM某些位置可以看到单向,某些位置又可以看到双向(又有带你encoder的问道在)。

相比原transformer块,如下组件有所调整:

  • LN和残差的位置有调整。
  • 输出token的预测层只用了一层全连接。
  • ReLU激活函数改用GeLUs。

2.2、预训练结构设计

预训练称为 “Autoregressive Blank Infilling”:自回归空白填充。

用GLS做回归怎么分析_ChatGLM


原理也很简单,以上图为例:

  • 1、随机采样2个片段,将其mask,作为part A。
  • 2、被mask的2个片段(各自开头加上起始符)的位置随机打散,作为part B。【为何要随机打散呢?我的理解是:因为被mask的片段间实际上attention是单向的,打散可以完整的捕捉到不同片段之间的依赖关系】
  • 3、part A和part B拼接作为输入序列。
  • 4、为了区分part A和part B的token的位置信息,GLM采用了二维位置编码,也就是每个token用两个位置id来表示,这样一来就可以将token embedding和其对应的两个position embedding相加了。

那么,为兼具encoder和decoder的优势,GLM对attention mask做了如下改进:

  • 1、A 部分的字符可以注意到A 部分的所有字符(双向),但是不能注意到 B部分的任何字符。
  • 2、B 部分只能注意到B自身之前的字符(单向);但可以注意到A 部分的所有字符。
  • 3、其他部分就是mask了。

2.3、预训练目标设计

为兼顾下游自然语言理解和自然语言生成任务的性能,GLM设计了三种不同的基于自回归填空的预训练目标。

针对自然语言理解任务:

  • 从一个均值为3的泊松分布中采样片段的长度0直到原始文本中 15%的字符被掩盖,然后在文本中随机排布填空片段的位置这个目标我们称为 token-level objective。(实际中,GLM发现15%的填空比例对于下游自然语言理解任务的良好表现非常重要)

针对文本生成任务设计了另外两种预训练目标:

  • document-level obiective: 我们采样了一个长度从原始文本长度的 50% 到100%的均匀分布中采样的片段。这个预训练目标针对的是无条件的长文本生成任务
  • sentence-level objective: 我们限制了每个被掩盖的片段必须是完整的句子,采样多个句子直到覆盖了原始文本中15%的字符。这个预训练目标针对的是输出目标常常是句子或者段落的有条件文本生成任务

2.4、微调

针对自然语言理解任务:

  • 也是当成生成任务做,做一个prompt模版,让模型输出类别。

针对自然语言生成任务:

  • 给定的上下文构成了输入的部分 A在结尾附上了一个MASK字符。模型用自回归的方式生成了部分 B 的文本。

3、实验结果

实验和T5,BERT,RoBERTa,BART进行了对比,在自然语言理解与生成任务上性能表现均优于对比的模型,但提升幅度不是非常惊艳。(数据集:SuperGLUE,CNN/DailyMail and XSum)







参考链接:
[1] 论文:《GLM: General Language Model Pretraining with Autoregressive Blank Infilling》
[2] 自然语言大模型 :GLM 通用语言模型的训练与微调