原文:来自清华的ChatGPT?GLM-130B详解 - 知乎
本文会分析一下来自清华的ChatGPT,这篇论文的价值很大,为什么这么将?因为他开源了所有代码,包括模型,baseline。确实是一个不错的里程碑。
GLM-130B: AN OPEN BILINGUAL PRE-TRAINED MODEL | ICLR 2023
开源:
GitHub - THUDM/GLM-130B: GLM-130B: An Open Bilingual Pre-Trained Model (ICLR 2023)
提出的背景
首先我们来看看,这篇论文提出的背景是什么?首先是GPT3的能力很强悍,但是没有公开,属于技术瓶颈,并且目前的语言模型实在是太大了,没有几百张卡A100以上,真的非常难训练。本次介绍了GLM-130B的训练过程,包括其设计选择、效率和稳定性的训练策略以及工程努力。在广泛的流行英语测试中,GLM-130B模型的性能显著优于GPT-3175B,而在OPT-175B和BLOOM-176B中没有观察到性能优势。在相关测试中,它也始终显著优于最大的中文模型ERNIE TITAN 3.0 260B。最后,我们利用GLM-130B独特的缩放特性来实现INT4量化,无需量化感知训练,几乎没有性能损失,使其成为100B缩放模型中的首批。小模型多任务已经变成了一种潮流。
GLM-130B与其他100B级LLM和PaLM 540B之间的比较。(SSL:自我监督学习;MIP:多任务指令预训练;(A)PE:(绝对)位置编码;FFN:前馈网络)
模型设计
机器学习模型的体系结构定义了其归纳偏差。然而,人们已经意识到,探索LLM的各种架构设计在计算上是负担不起的。下面介绍并解释GLM-130B独特的设计。
GLM底座
本文的模型是基于之前提出的GLM(General Language Model)模型,并且对此做出了具体的改进。GLM使用单个Transformer,并对架构进行了修改:
(1)重新安排了Layer Norm 和 残差连接的顺序,这对于大规模语言模型来说至关重要,以避免数字错误;
(2) 我们使用单个线性层来进行输出Token预测;
(3) 我们用GeLU取代ReLU激活功能。
模型的基本机构变动不大,而GeLU目前在很多paper上都展现了不错的效果。
2D-Position Encoding
另外作者提出了2D-Position Encoding,本身不复杂,在普通的基础上,叠加了一个在mask span中间的位置而已,原文是inter and intra position encoding。可以详见下图来理解一下。
2D Position Encoding
Mask机制变化
和之前的方法相比,Mask包含两种,第一种是上图的x3,随机mask掉的token,而x5 x6是另外mask的,是以span来进行的,span的宽度是随机变化的,而且这个span需要位于文本的最后。既然Mask掉之后,接下来变化的就是Serf Attention了。那么具体来说,是如何形成图片中的Mask呢?实际上我们来观察一下输入GLM的部分,序列由[x1, x2, M, x4, M, S, x5, x6, S, x3]来表示,其中M代表了此处是Mask掉的,用于提示计算机这里有坑要预测,而S的含义是开始,就是开始一个Mask的部分。所以总的来说输入被堆叠成为X(corrupt) + Span 的形式,这种形式非常方便做最终的预测。对应于公式中的条件部分,就是我们的输入X(corrupt) + Span,输出就是之后的序列。
公式:预训练目标函数
Self Attention的变化
Self Attention机制介绍
首先需要注意的是颜色,蓝色代表普通query,黄色是mask2,绿色是mask1,也即是要预测的单词。乍一看这个图片很难懂,应该以行的方向来看,就和普通的语言模型大差不差了。以图中的红色框为代表,将会根据前面的彩色部分,预测出将来的灰色部分,而这部分是利用Query = [x1, x2, M, x4, M, S] 和 key = [x1, x2, M, x4, M, S, ×, ×, ×, ×],其中×代表了要预测的部分,也即是attention不做处理的部分,把他们输入成为-inf将会被attention识别为0的权重。
Layer Normalization
Layer Norm 也是对应的做了修改,在训练的过程当中,作者发现了训练时非常不稳定的。作者使用了Deep Layer Norm机制,公式为:
公式:Deep Layer Norm
其中N为网络的层数,层数越多a越小,并且Layer Norm里面利用了类似残差的机制,经过Network和原输入加在一起,组织过拟合的发生。那么具体来说,这个Layer Norm起到了多大的作用呢?下图的b告诉了我们答案:
图:梯度下降示意图
图a是在说经常会失败,作者罗列了三十种情况,图b中黄色曲线可以看到非常稳定的下降。
预训练设置
Mask设置
回想一下,GLM-130B在此任务中同时使用[MASK]和[gMASK](文中讲的两种Mask方式)。具体而言,[MASK]用于屏蔽30%的训练token中的连续跨度,用于空白填充。跨度长度遵循泊松分布(λ=3),加起来最多为输入的15%。对于其他70%的token,每个序列的前缀保留为上下文,[gMASK]用于屏蔽其余部分。屏蔽长度从均匀分布中采样。
预培训数据包括1.2T Pile英语语料库、1.0T中文五道语料库和250G中文语料库,我们从网上抓取,这些语料库形成了中英文内容的均衡组合。
多任务预训练学习
我们在GLM-130B的预训练中包括各种指令提示数据集,包括语言理解、生成和信息提取。与最近利用多任务提示微调以改进零样本任务转移的工作相比,多任务学习的token仅占5%,并且设置在预训练阶段,以防止破坏LLM的其他一般能力,例如无条件自由生成。具体而言,我们包括74个来自的提示数据集。
训练稳定性
在实际的训练当中,作者总共使用了96个A100(8*40G)训练了两个月得到了最终的模型。
混合精度
我们遵循混合精度(也即将单精度和双精度的数据一起训练)策略的常见实践,即用于向前和向后的FP16和用于优化器状态和主权重的FP32,以减少GPU内存使用并提高训练效率。与OPT-175B和BLOOM-176B类似,GLM-130B的训练面临着由于这种选择而导致的频繁的损失爆炸,随着训练的进行,这种损失爆炸往往变得越来越频繁。与精度相关的爆炸通常没有明确的原因:有些会自行恢复;其他则预示着梯度标准突然飙升,最终出现峰值甚至NaN损失。
其中FP32为32位Float精度,FP16为16位Float精度。混合精度是一种近几年的算法,为了缩小GPU内存,并且不影响训练的准确性。
OPT-175B试图通过手动跳过数据和调整超参数来修复;BLOOM-176B是通过嵌入规范技术实现的。我们花了几个月的时间对峰值进行实证调查,并意识到当扩大规模时会出现一些问题:
首先,如果使用Pre-LN,Transformer层中参数值在更深的层中可能非常大。GLM-130B中通过使用基于DeepNorm的Post LN来解决这一问题,这使得参数的尺度总是有界的。
其次,随着模型的扩大,注意力得分变得如此之大,以至于超过了FP16的范围。在LLM中有几个选项可以克服这个问题。在CogView中,PB-Relax被提议在注意力计算中删除偏差项并扣除极值以避免该问题,不幸的是,这无助于避免GLM-130B中的不收敛。在BLOOM-176B中,由于其在A100上的值范围很广,因此使用BF16格式而不是FP16。然而,在我们的实验中,BF16比FP16多消耗约15%的运行时GPU内存,因为它在梯度累积中转换 FP32 ,更重要的是,它在其他GPU平台(例如,NVIDIA Tesla V100)上不受支持,限制了生成的LLM的可访问性。BLOOM-176B的另一个选择是使用BF16应用嵌入范数,但牺牲了对模型性能的显著惩罚。
嵌入层渐变收缩(EGS)
我们的经验搜索表明,梯度范数可以作为训练崩溃的信息指标。具体来说,我们发现训练崩溃通常滞后于梯度范数的“尖峰”几个训练步骤。这种尖峰通常是由嵌入层的异常梯度引起的,因为我们观察到,在GLM-130B的早期训练中,其梯度范数通常比其他层的梯度范数大几个数量级。此外,在早期训练中,它往往会大幅波动。视觉模型通过冻结Embedding层来处理该问题。不幸的是,我们不能冻结语言模型中嵌入层的训练。
所以作者提出了一种简单的方案,这种方法能够抑制Embedding层的更新,从而达到抑制梯度爆炸的结果。具体来说,如果α是收缩因子,则该策略可以通过word_embedding=word_embetting*α+word_embending.detach()*(1-α)轻松实现。根据经验,设置α=0.1有助于消除可能遇到的大多数梯度爆炸,速度损失可以忽略不计。
GLM-130B INFERENCE ON RTX 2080 TI
如上所述,130B的型号大小是为在单个A100(40G×8)服务器上运行完整的GLM-130B型号而确定的,而不是OPT-175B和BLOOM-176B所需的高端A100(80G×8)。为了加速GLM-130B推理,我们还利 FasterTransformer在C++中实现了GLM-130B。与BLOOM-176B在Huggingface中的PyTorch实现相比,GLM-130B在同一台A100服务器上的解码推理速度快7-8.4倍。这确实是能解决很多中小企业的燃眉之急。
INT4 Quantization for RTX 3090s/2080s
我们设法达到GLM-130B的INT4权重量化,而现有的成功迄今仅达到INT8水平。在内存方面,与INT8相比,INT4版本有助于将所需GPU内存的一半额外节省到70GB,从而允许GLM130B在4×RTX 3090 Ti(24G)或8×RTX 2080 Ti(11G)上进行推理。性能方面,下图中表明,在完全没有后期训练的情况下,INT4版本GLM-130B几乎没有性能下降,因此在通用基准测试上保持了优于GPT-3的优势。
左图:量化GLM-130B在几个基准测试中的表现;右图:INT4量化GLM-130B的推理速度(编码和解码)
从图中可以看出,通过INT4的量化手段,结果并没有太大影响,反而是推理速度变快了。
结果讨论
Zero-Shot评判
事实上,“Zero shot”似乎有争议性的解释,但在社会上没有达成共识。Zero-shot的深层次含义就是“在测试时,在零样本学习环境中,目标是将测试图像分配给一个看不见的类标签”,其中涉及到看不见类标签是一个关键。因此,我们推导了选择GLM-130B的零样本数据集的标准。
英语:1)对于具有固定标签的任务(例如,自然语言推理):不应对此类任务中的数据集进行评估;2) 对于没有固定标签的任务(例如,QA、主题分类):只应考虑与MIP中的数据集有明显域转移的数据集。
中文:所有数据集都可以进行评估,因为存在零样本跨语言迁移。
语言建模测试
本次作者总共在两个测试集上测试,其一是LAMBADA,其二是Pile。第一个数据集是测试最后一个单词语言建模能力的数据集。Zero-shot的设置下,GLM-130B利用双向注意力的准确度为80.2,创下了LAMBADA的新纪录。
Pile测试集包括一系列用于语言建模的基准测试。平均而言,与GPT-3和Jurassic1相比,GLM130B在其18个共享测试集上的加权BPB表现最佳,后者的结果直接采用后者,表明其强大的语言能力。
Pile测试结果
大规模多任务语言理解 MASSIVE MULTITASK LANGUAGE UNDERSTANDING (MMLU)
在下图中查看了大约300B的token后,GLM-130B在MMLU上的few-shot(5 shot)性能接近GPT-3(43.9)。随着训练的进行,它继续向上移动,当训练结束时(即,总共学习400B个token),达到44.8的准确性。这与之前一篇论文中的结果一致,即大多数现有的LLM远未得到充分的学习。
MMLU上的GLM-130B(57个任务)以及训练步骤
中文语言理解评测
根据中文NLP基准 CLUE 和 FewCLUE 评估了GLM-130B的中文零样本性能。需要注意的是,我们在MIP中不包括任何中文下游任务。到目前为止,作者已经完成了对两个基准的部分测试,包括7个CLUE和5个FewCLUE数据集。作者将GLM-130B与现有最大的汉语单语语言模型260B ERNIE Titan 3.0进行了比较。我们按照其设置在开发数据集上报告零样本结果。GLM-130B在12项任务中始终优于ERNIE Titan 3.0。有趣的是,GLM-130B在两个抽象MRC数据集(DRCD和CMRC2018)上的表现至少比ERNIE好260%,这可能是由于GLM-130B的预训练目标与抽象MRC的形式自然产生共鸣。
GLM-130B和ERNIE Titan 3.0 260B在零样本CLUE和FewCLUE上进行评估
结论
作者在文章最后指出,失败中学到了很多的东西,而以下的lesson就是作者学习到的内容。总的来说,本文的贡献在于利用小GPU集群训练和推理。并且推理速度提升7-8倍,而且GPU的使用也比以往的显著要低,虽然最终的结果并不是SOTA,但是同比GPT3已经有了不少亮点之处,是一篇学术和工业界结合的非常紧密。
lesson列举
编辑于 2023-04-20 17:14・IP 属地北京