导语
GLM系列模型是清华和智谱AI推出的大语言模型系列,ChatGLM是在GLM基础上进行微调和对齐得到Chat模型,后续将详细介绍GLM基座和ChatGLM模型。
本文主要参考的是清华/智谱AI发的论文和技术报告:
GLM: General Language Model Pretraining with Autoregressive Blank Infilling:https://aclanthology.org/2022.acl-long.26.pdf
GLM-130B: AN OPEN BILINGUAL PRE-TRAINED MODEL:https://arxiv.org/pdf/2210.02414
ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools:https://arxiv.org/pdf/2406.12793
新的框架:GLM
基于Transformer的预训练模型主要可以分为三大类:Encoder-only(代表模型为BERT系列),Decoder-only(GPT系列、Llama系列),Encoder-decoder(T5、BART系列)。GLM是一类通过的语言模型,在Encoder的基础上进行空白填充的任务,本质上更接近于Encoder-Decoder的结构(类似于Encoder,Decoder共享权重),在NLU、conditional and unconditional generation任务上都有不错的表现,下面将详细介绍GLM的模型结构。
1. 整体思路
GLM的核心思想是自回归空白填充,利用[MASK]标识符对原有文本进行遮掩,并在后续通过自回归的方式预测被遮掩的tokens。具体地,假设原先的文本为[x1,x2,...,x5],被遮掩的token为x3,x5,则该文本被分为partA和partB两个部分,其中partA为[x1,x2,[M],x4,[M]],partB为[x3,x4],然后利用模型进行遮掩部分的不定长预测,由于是不定长的预测,因此需要通过特殊标记符[S]提示开始预测,直到[E]标识符结束预测。
PS:1)这个训练方式与BERT系列的MLM有相似之处,都是利用模型对掩码字符进行预测,但是不同的地方在于MLM假设了所有掩码字符都是独立的,而在这里掩码字符的预测采用了类似于Decoder的自回归方式,相当于做了二者的兼容。即PartA部分属于双向注意力,PartB部分为单向注意力;
2)训练过程中随机打乱PartB中各个[MASK]部分的顺序。个人认为目的是为了避免PartB不同span之间的依赖,因为在解码过程中后一个span能够看到前一个span的内容,会导致后一个span依赖前一个span,因此随机打乱来避免这种情况。
2. Transformer架构
PE:采用2-D位置编码,第一层编码表示token在原始句子中的位置;第二层编码表示token在跨度中的位置,不同的跨度spans中的token会重新计数,从[S]为1开始,PartA部分标记为0;
LN:调整LN层和残差层的顺序;
激活函数:ReLU-->GeLUs。
3. 预训练
1)训练目标
2)多任务训练
为了应对多种类型的NLP任务,GLM在预训练时采用了两种目标的训练方式,这两种目标的区别在于遮掩长度不同:
doc-level:遮掩50%-100%的token,遮挡的是文档片段,目的是为了应对文本生成类任务;
sent-level:遮掩15%的token,遮挡的是完整的句子,目的是为了应对seq2seq任务。
4. 微调
为了统一预训练和下游任务的目标函数,微调的逻辑是将所有的NLP任务转成空白填充的类型:
如上图情感分类的任务,先将任务prompt改写成{sentence}. It's really [MASK] 的形式,模型对[MASK]的位置的词进行预测。
开源基座:GLM-130B
GLM-130B是清华/智谱AI开源的首个超过100B的双语(英语/中文)预训练大语言模型,该模型建立在GLM框架上,进行了一系列工程上的优化,在大模型(超过100B以上)训练稳定性,模型量化都有较多的细节披露,下面将进行具体介绍。
1. 基础模型
1)special token:为了支持文本生成和文本理解两种类型的NLP任务,GLM-130B模型在训练过程中采用了两种类型的掩码token:
[MASK]:句子中的短空白,类似BERT的处理;
[gMASK]:提供前缀上下文的句子末尾的随机长空白,类似PrefixLM的处理。
2)层正则化(LN)
本文采用DeepNorm,具体地:DeepNorm(x)=LN(x+Network(x))
理由在于:Pre-LN能够使训练变得稳定,但会一定程度损害模型的下游任务性能;Post-LN在下游任务上表现更好,但训练不稳定,容易导致训练崩溃。DeepNorm是微软亚研院提出的层正则化方式,通过调整Post-LN的初始化方式,不要让起始阶段模型参数更新得太快,从而缓解训练崩溃的问题。通过多次实验能够看到,DeepNorm是最稳定的,因为它具有较小的梯度范数,并且在早期训练中不会出现峰值。
3)PE & FFN
PE:RoPE,相对位置编码在长文处理上比之前的编码效果会更好。
激活函数:GeLU-->GLU
2. 目标函数
本文的目标函数有两个,一个是采用了常规的自监督损失(Self-Supervised Loss,ssl,占比95%token)的方式,在超过2.2T以上的中英文数据上进行自回归空白填充的预测,30%的数据采用[MASK]掩码,70%的数据采用[gMASK]掩码,增强模型的语言能力;另一个则参考了T5系列模型的效果,增加了多目标指令微调(Multi-Task Instruction Pre-training,MIP,占比5%token)的损失,这部分训练则是为了提升模型在zero-shot/few-shot等任务上的能力。
3. 训练稳定性
GLM-130B 的训练面临着这种选择导致的常见损失尖峰,随着训练的进行,这往往变得越来越频繁。为了让模型训练更加稳定,GLM-130B在训练过程中采用了混合精度(Mixed-Precision)和EGS(Embedding Layer Gradient Shrink)的tips进行训练。
混合精度采用的出发点是在节约GPU内存和保证梯度回传的精确度上做的折中,能够在不损害模型训练性能的基础上提升训练速度,节省内存资源;EGS采用则是依据论文中的实验表明,梯度范数可以作为训练崩溃的信息指标,在GLM-130B的早期训练中,其嵌入层梯度范数往往比其他层的梯度范数大几个数量级,因此采用嵌入层上的梯度收缩可以克服损失峰值,从而稳定GLM-130B的训练。
4. INT4量化
与其他大模型如GPT-3,OPT-175B,BLOOM-176B模型相比,GLM-130B的一个显著优势就是在进行INT4量化后,模型的性能没有收到很大损害,究其原因在于GLM-130B模型的参数分布相对较窄,可以用更少的字节数表示出全部的权重分布,因此在进行INT4量化时能够在保持相对多的性能,并且通过实验观察到INT4和FP16版本之间的差距随着GLM模型尺寸的扩大而进一步缩小,更进一步表现GLM模型在量化方面的天然优势。
基于GLM基座的对齐模型:ChatGLM
ChatGLM系列模型是在GLM基座模型基础上进行进一步训练得到的对齐模型,在这里的对齐主要指的是SFT和RLHF的过程。下面会根据ChatGLM的技术报告和之前公开的训练代码进行简单介绍。
1. 模型架构
在模型架构方面,最新的GLM-4采用的架构如下:
No Bias Except QKV: 为了提升训练速度,去除了所有偏差项,除了注意力层中的查询(Query)、键(Key)和值(Value)偏差。这一变化略微改善了长度外推法的性能。
RMSNorm 和 SwiGLU: 用RMSNorm替换了LayerNorm,并用SwiGLU替换了ReLU。这两种策略能够提升模型性能。
旋转位置嵌入(RoPE):将RoPE扩展到二维形式,以适应GLM中的二维位置编码。
分组查询注意力(GQA): 我们用GQA替换了传统的多头注意力(MHA),以减少推理过程中的KV缓存大小。由于GQA使用的参数比MHA少,相应增加了FFN的参数数量,以保持模型大小的一致性。
上述架构的调整带来的收益是模型的上下文长度变大,从2K-->128K。这种扩展不仅仅是通过上下文长度的增加(位置编码的扩展和对长文本的持续训练)实现的,而且还通过对长上下文的优化对齐,使得GLM-4能够有效地处理长文本。
2. 对齐
SFT:
1)数据:在SFT阶段,尽量采用人工生成的提示和回复,而尽量减少模板式的提示和模型回复,能够有效提升模型性能。
2)结构:这里主要是对SFT阶段训练时怎么进行instruction-answer拼接来简单介绍(参考ChatGLM github内容)。假设提示为:token1,token2,answer为 :token3,token4,那么:
input_ids为:
[token1,token2,gmask,sop,token3,token4,eop]
labels为:
[-100,-100,-100,-100,token3,token4,eop]
position_ids为:
[0,1,2,2,2,2,2,2]
[0,0,0,1,2,3,4]
在计算SFT损失时只需要计算answer部分的损失。