🃏GLM论文解读
2024-7-18
| 2024-7-23
0  |  阅读时长 0 分钟
type
status
password
date
slug
summary
category
URL
tags
icon

GLM: General Language Model Pretraining with Autoregressive Blank Infilling

官网:https://chatglm.cn/blog
内测官网:https://chatglm.cn/chat

背景领域、研究问题

NLP任务

  • 自然语言理解(NLU):这类任务主要关注从给定文本中提取信息和理解其含义。如情感分析、文本分类、命名实体识别(NER)、关系抽取、词性标注、句法分析、语义角色标注、核心引用消解。
  • 无条件生成(Cond. Gen.):这类任务关注从头开始生成文本,而不需要特定的输入条件。如语言建模。
  • 有条件生成(Uncond. Gen.):这类任务根据给定的输入或上下文生成文本。文本摘要、问答系统、机器翻译、对话系统中的响应生成

主流模型架构

autoregressive
autoencoding
encoder-decoder
介绍
自回归模型,代表GPT,本质上是一个从左到右的语言模型,常用于无条件生成任务(unconditional generation)
通过某个降噪目标(如掩码语言模型)训练的语言编码器,如BERT、ALBERT、RoBERTa。擅长自然语言理解任务(natural language understanding tasks),常被用来生成句子的上下文表示。
完整的Transformer结构,包含一个编码器和一个解码器,以T5、BART、PALM、MASS为代表,常用于有条件的生成任务(conditional generation)
结构特点
单向,无法利用到下文的信息
双向,可以同时感知上文和下文,因此在自然语言理解任务上表现很好,但是不适合生成任务
解码器中注意力是双向,解码器中是单向的,因此可同时应用于自然语言理解任务和生成任务。但T5为了达到和RoBERTa相似的性能,往往需要更多的参数量
训练目标
从左到右的文本生成
对文本进行随机掩码,然后预测被掩码的词
接收一段文本,从左到右的生成另一段文本
Framework
NLU
Cond. Gen(有条件生成)
Uncond. Gen(无条件生成)
Autoregressive(如GPT)
——
——
Autoencoding(如BERT)
Encoder-Decoder(如T5)
——
——
GLM

GLM的动机

作者提出了一种基于自回归空白填充的预训练框架,名为 GLM(通用语言模型)。它结合了自编码和自回归预训练的优点,能够在自然语言理解、有条件生成和无条件生成任务中取得显著的性能提升。
💡
GLM(通用语言模型):随机将输入文本中的连续标记范围留空,并训练模型按照自回归预训练的思想顺序地重构留空的标记范围。
主要的设计点在span shuffling 2D positional encoding。并将 NLU 任务重构为模仿人类语言的完型填空题,GLM 可以通过自回归空白填充自然地处理填空问题的多标记答案。通过改变缺失跨度的数量和长度,自回归空白填充目标可以为有条件和无条件生成任务预训练语言模型。

自回归空白填充

空白填充原理

图 2:GLM 预训练
图 2:GLM 预训练
  1. 原始文本是 , 然后用采样得到两个span   和 
  1. 将原始文本表示为Part A、Part B两部分。
    1. Part A:损坏的文本。用[MASK]代替原始的文本中的   和  两个span。这部分使用双向注意力
    2. Part B:包含被 mask 的span部分,并对其进行shuffle。例如, 和  两个span,并随机打乱。这部分使用单向注意力
  1. GLM 自回归生成 Part B。每个片段用 [START] 打头(代码中使用<|startofpiece|>)和 [END] 结尾(代码中没有结尾)。这就组成了整个输入和预测部分。如图 2 中所示,输入为蓝色,输出为黄色部分。2D位置编码如下:
    1. Position 1:输入部分就是相应token的位置。输出部分,为在Part A中相应 [MASK] 标记的位置。
    2. Position 2:对于Part A 中的token,它们的 id 为 0。对于Part B 中的token,它们的范围从 1 到span的长度。

MASK分类

💡
论文中只有[MASK],但是代码中有[MASK][sMASK][gMASK]
[MASK]:短空白,长度等于输入的有一部分。
 
[sMASK]:句子级别mask
[gMASK]:从左到右生成上下文
您还可以在单个示例中添加多个[MASK][sMASK]。模型将从左到右逐个填空。每个空白的答案总是以一个特殊的<|startofpiece|>开头。
Example(English)
Context: There have been various types of pretraining architectures including autoencoding models (e.g., BERT), autoregressive models (e.g., GPT), and [MASK] (e.g., T5). [sMASK] We propose a General Language Model ( GLM) based on autoregressive blank infilling to address this challenge. GLM improves blank filling pretraining by adding 2D positional encodings and allowing an arbitrary order to predict spans, which results in performance gains over [MASK] on NLU tasks. Meanwhile, GLM can be pretrained for different types of tasks by varying the number and lengths of blanks. On a wide range of tasks across NLU, conditional and [MASK], GLM outperforms BERT, T5, and GPT given the same model sizes and data, and achieves the best performance from a single pretrained model with 1.25× parameters of BERT Large , demonstrating its generalizability to different downstream tasks.
GLM: <|startofpiece|> blank filling models<|startofpiece|> However, most of them cannot easily transfer to other downstream tasks due to the different characteristics of these tasks.<|startofpiece|> other pretrained models<|startofpiece|> unconditional reading, and semantic role labeling tasks
Example(Chinese)
Context: 工业互联网(Industrial Internet)是新一代[MASK]与[MASK]深度融合的新型基础设施、应用模式和工业生态,通过对人、机、物、系统等的全面连接,构建起覆盖全产业链、全价值链的全新制造和服务体系,为工业乃至产业数字化、网络化、智能化发展提供了实现途径,是第四次工业革命的重要基石。[sMASK] 它以网络为基础、平台为中枢、数据为要素、安全为保障,既是工业数字化、网络化、智能化转型的基础设施,也是互联网、大数据、人工智能与实体经济深度融合的应用模式,同时也是一种新业态、新产业,将重塑企业形态、供应链和产业链。当前,工业互联网融合应用向国民经济重点行业广泛拓展,形成[MASK]、智能化制造、[MASK]、个性化定制、服务化延伸、数字化管理六大新模式,赋能、赋智、赋值作用不断显现,有力的促进了实体经济提质、增效、降本、绿色、安全发展。
GLM: <|startofpiece|>信息技术(ICT)<|startofpiece|>工业经济(II2O)<|startofpiece|>我国工业互联网是面向工业全领域、全流程、全体系的互联网,具有多产业、多领域融合的特点。<|startofpiece|>网络化协同<|startofpiece|>平台企业

token设计

  • [UNK]:未知单词
  • <|startofpiece|>:表示每个 auto-regressive 补全span的开始,
  • <|endofpiece|>表示补全span的结束。
  • [CLS]:句子开始
  • <|endoftext|>:文本结束、填充的PAD
input_ids
position_ids
attention_mask
 

模型结构

代码打印的模型结构

2d位置编码

每个标记都用两个位置 id 编码。第一个位置 id 表示在损坏的文本 中的位置;对于被[MASK]的片段,它是相应 [MASK] 标记的位置。第二个位置 id 表示片段内的位置。对于Part A 中的标记,它们的第二个位置 id 为 0。对于Part B 中的标记,它们的范围从 1 到片段的长度。通过可学习的Embedding将两个位置 id 映射到两个向量上,然后加到了输入的词向量上。

Attention mask matrix

PartA部分内的各token可以互相注意到
PartB部分内的tokens可以注意到PartA和PartB中已经生成的token

GLMBlock结构

使用transformer的编码器,并有所改进
notion image
print(model)的模型框图
notion image
notion image
  • 重新调整了LN和残差连接的顺序,可以避免数值错误。
  • 对于token的预测输出用的是单个的线性层。
  • 将激活函数由ReLU调整为了GeLU
    • 💡
      GELU的优点
      • 具有更光滑的导数:
        • GELU函数的导数是连续的,这使得在训练深度神经网络时可以更容易地传播梯度,避免了ReLU函数在 处的导数不连续的问题,从而减少了训练过程中出现的梯度消失问题
      • 可以加速收敛:
        • GELU函数在激活函数的非线性变换中引入了类似于sigmoid函数的变换,这使得GELU函数的输出可以落在一个更广的范围内,有助于加速模型的收敛速度。
      notion image

损失函数

GLM 通过优化自回归填充目标进行训练。给定输入文本 ,会抽样出多个文本片段 ,其中每个片段 对应  一系列连续的标记 。每个片段都用一个 [𝑀𝐴𝑆𝐾] 标记替换,形成一个损坏的文本 。模型以自回归方式从损坏的文本中预测片段中的缺失标记,这意味着在预测片段中的缺失标记时,模型可以访问损坏的文本和先前预测的片段。为了充分捕捉不同片段之间的相互依赖关系,作者随机排列了片段的顺序,类似于排列语言模型(Yang 等,2019)。形式上,令 是长度为 m 的索引序列  的所有可能排列的集合, 就是 ,我们定义预训练目标为:

预训练

数据集

为了与BERT进行公平的对比,我们使用BookCorpus和英文的Wikipedia作为我们的预训练数据,并使用了 BERT 的 wordpiece 分词器。

数据处理

针对三类下游任务设计了三种基于自回归填空的预训练目标,交替进行
  • token-level objective 单词级
    • 单词级别的[MASK]的token占原始文本中15%(通过经验,我们发现 15%的比例对于下游自然语言理解任务的性能至关重要),[MASK]的单词长度符合的Poisson分布。然后在文本中随机排列span的位置。这一目标针对的是自然语言理解任务。此时,填充任务等价于掩码语言建模。
  • sentence-level objective 句子级
    • 从文档中随机掩码若干文本片段,每个文本片段必须为完整的句子,被掩码的词数量为整个文档长度的15%。这一目标是能针对seq2seq任务,其预测往往是完整的整个句子或者段落。此时,填充任务就等价于条件语言生成任务。
  • document-level objective 文档级
    • 我们采样了一个长度从原始文本长度的50%到100%的均匀分布中采样的片段。这个预训练目标针对的是无条件的长文本生成。填充任务就等价于无条件语言生成任务。
三类预训练目标的区别只是span的数量和长度的区别。

训练参数

模型在 64张V100 GPU上训练了 200k 步,batch size 为1024,最大序列长度为 1024。GLMLarge 一次完整的训练大约花费 2.5 天。

微调训练

  • 情感分类任务:给定一个标注样本,我们将输入文本x通过模板转化为有一个[MASK]字符填空问题。标签也映射到了填空问题的答案 。模型预测不同答案的概率对应了预测不同类别的概率。如下图的示例所示
notion image
  • 文本生成任务:给定的上下文构成输入的部分的A,在结尾附上一个[MASK]字符,模型用自回归的方式去生成B部分的文本
    • notion image

GLM-130B: AN OPEN BILINGUAL PRE-TRAINEDM

背景与动机

与 10B 规模的模型相比,预训练一个100B规模的模型,面临着许多意想不到的技术和工程挑战,特别是在损失峰值和分歧方面。在本文中,我们介绍了GLM-130B的训练过程,包括模型设计、训练策略以及工程努力。我们不仅展示了训练模型的成功经验,还展示了许多失败的教训。
  • 工程
  • 模型设计
  • 训练策略:。嵌入梯度收缩策略可以显著稳定 GLM-130B的训练

网络结构

层数
隐层维度
GeGLU 隐层维度
注意力头数量
最大序列长度
词表大小
70
12,288
32,768
96
2,048
150,000

位置编码(RoPE原理)

旋转位置编码(Rotary Position Embedding,RoPE)是论文Roformer: Enhanced Transformer With Rotray Position Embedding 提出的一种能够将相对位置信息依赖集成到 self-attention 中并提升 transformer 架构性能的位置编码方式。和相对位置编码相比,RoPE 具有更好的外推性,在我们的初步实验中,我们发现RoPE编码优势:1)当序列长度增长时,RoPE的实现速度更快。2)RoPE对双向注意力更友好,在下游微调实验中效果更好。
💡
外推性是指大模型在训练时和预测时的输入长度不一致,导致模型的泛化能力下降的问题。例如,如果一个模型在训练时只使用了512个 token 的文本,那么在预测时如果输入超过512个 token,模型可能无法正确处理。这就限制了大模型在处理长文本或多轮对话等任务时的效果。
notion image

GLMBlock

使用GLMBlock作为网络基本单元。为了支持理解和生成,GLM-130B混合了两种损坏目标,每个目标由一个特殊的掩码标记表示:
[MASK]:句子中的短空格,其长度加起来相当于输入的某一部分。
[gMASK]:在提供前缀上下文的句子末尾随机长度的长空白。

层标准化

层归一化(LayerNorm,或LN)是transformer中的一个重要组成部分,其应用可以大大影响训练的稳定性和性能。BERT应用了Post-LN,这意味着LayerNorm是在添加残余分支后应用的。然而,后续工作表明,单纯的Post-LN会导致预训练的不稳定,因此现有的大规模模型都选择Pre-LN架构,即在添加残差分支之前应用LayerNorm。
尽管如此,在现有的实践中,Pre-LN在用FP16训练大规模模型时仍然可能不稳定。OPT-175B在训练崩溃时手动调整学习率;BLOOM使用BF16(仅适用于NVIDIA Ampere GPU:A100s和3090s)以获得更好的浮点精度来避免崩溃。CogView提出了Sandwich-LN作为一种补救措施。更重要的是,近期工作表明,与Post-LN相比,Pre-LN的下游微调性能更差。
考虑到所有这些因素,在GLM-130B中,我们决定使用Post-LN,并使用新提出的DeepNorm来克服不稳定性。DeepNorm的重点是改进初始化,可以帮助Post-LN变换器扩展到1000层以上。在我们的初步实验中,模型扩展到130B,Sandwich-LN的梯度在大约2.5k步时就会出现损失突变(导致损失发散),而带有DeepNorm的Post-Ln则保持健康并呈现出较小的梯度大小(即更稳定)。GLM-130B的层数N,我们采用
其中的 为常数为Block的层数。并FFN中的, Attention中的应用缩放因子为的Xavier初始化。此外,所有偏置项初始化为零。

GLMBlock中的FFN

我们在初步实验中通过对随机的50G中英文混合语料库进行GLM-base(110M)的预训练来测试它们。我们发现,虽然GLU和GAU可以比原始FFN实现更好,但GLU在训练中可以更好、更稳定。
因此,在GLM-130B的实现中,我们选择带有GeLU激活的GLU

训练策略

训练大规模语言模型的最关键挑战是训练的稳定性,无一例外。GLM-130B的预训练持续了60天,使用96个DGX-A100(40G)节点,等价花费490万美元的云服务费用;如果训练在半路上失败,并无法恢复训练,那将是一个巨大的损失。

训练目标与数据集

GLM-130B的预训练目标不仅包括自监督GLM 自回归空白填充,还包括一小部分标记的多任务学习。这预计将有助于提升其下游零样本性能。
  • 自监督空白填充(95%标记)
    • 每个训练序列单独应用[MASK] [gMAS]其中一个。具体来说,
    • 30%的序列应用[MASK],span的长度遵循泊松分布(入=3)并且其总和达到输入的15%
    • 70%的序列应用[gMASK],每个序列的前缀被保留作为上下文,并使用[gMASK]屏蔽其余部分。屏蔽长度从均匀分布中采样.
    • 预训练数据包括 1.2T的Pile(Gao等人,2020)英语语料,1.0T的中文Wudao-Corpora(Yuan等人,2021),以及我们从网络上爬取的250G中文语料(包括在线论坛、百科全书和问答),
  • 多任务指令预训练MIP (5%的标记)
    • 包括来自(Sanh等人,2022;Wang等人,2022a)的74个被提示过的数据集。
      notion image

数据预处理

在60天时间里,GIM-130B共训练了4000亿个tokens(中文和英文各约2000亿),每个样本的固定序列长度为2048,对于[gMASK]的序列固定长度为2048。对于[MASK]和多任务目标,序列的固定长度为512;所以将四个样本拼接在一起,以达到2048的长度。

超参数配置

  • 精度:FP16
  • 隐藏状态维度:12,288个隐藏状态维度
  • transformers:9x8-2=70个
  • batch size warm up:在前2.5%的样本中将batch size从192提升到4224.
  • 优化器:AdamW,、weight decay为0.1。
  • 学习率:在前 0.5% 的样本中将学习速率从提升到,然后通过 衰减。
  • dropout rate 为0.1
  • 梯度剪切值为1.0

训练稳定性

我们采用了混合精度(Micikevicius等人,2018)策略(ApexO2)的常见做法,即前向和反向用FP16,优化器状态和 主权重用FP32,与OPT-175B和BLOOM-176B类似(参见附录图10),GLM-130B的训练也会因为这种选择而面临频繁的损耗峰值,并且随着训练的进行,损耗峰值会越来越频繁。与精度相关的峰值往往没有明确的原因:有些会自行恢复;另一些则预示着Gradient Norm突然飙升,最终出现峰值甚至NaN。OPT-175B试图通过手动跳过数据和调整超参数来修复;BLOOM176B通过嵌入规范技术做到了这一点(Dettmers等人,2021)。

解决方法

  1. 使用基于DeepNorm的Post LN
    1. 如果使用Pre-LN,Transformer主支路的值标度在更深的层中可能非常大。GLM130B通过使用基于DeepNorm的Post LN(参见第2.1节)来解决这一问题。
  1. 使用BP16
    1. 其次,随着模型的扩大,注意力得分变得越来越大,以至于超过了FP16的范围。在LLM中有几种方法可以克服这个问题。在CogView(Ding et al.,2021)中,PB-Relax被提议在注意力计算中删除偏差项并扣除极值以避免该问题,不幸的是,这没有解决GLM-130B不收敛的问题。在BLOOM-176B中,由于其在NVIDIA Ampere GPU(即A100)上的值范围很广,因此使用BF16格式而不是FP16。然而,在实验中,BF16比FP16多消耗约15%的GPU内存,因为它在梯度累积中转换为FP32,更重要的是,它在其他GPU平台(例如,NVIDIA Tesla V100)上不受支持,限制了生成的LLM的可访问性。BLOOM-176B的另一个选项是将嵌入规范应用于BF16,但这会对模型性能造成重大损失,因为他们注意到嵌入规范会损害模型的zero-shot学习(参见中的第4.3节(Scao等人,2022))。
  1. 嵌入层(梯度缩减)
    1. Gradient Norm可以作为训练崩溃的信息指标。具体来说,发现训练崩溃通常滞后于Gradient Norm的“尖峰”几个训练步骤。这种尖峰通常是由Embedding层的异常梯度引起的,因为论文观察到,在GLM-130B的早期训练中,其Gradient Norm通常比其他层的Gradient Norm大几个数量级(参见图4(a))。此外,在早期训练中,它往往会大幅波动。
      图4
      图4
      解决方案:由于根本问题是输入Embedding层的急剧梯度,我们建议缩小输入Embedding层的梯度。设为收缩因子,该策略可以通过 轻松实现。根据经验,图4 (b)表明,设置可以消除我们可能遇到的大多数峰值。
  1. 注意力计算:FP32 Softmax
    1. 我们观察到,在大型语言模型中,注意力的计算操作是最容易上溢或下溢的。CogView显示,不同的注意力头对其注意力分数有非常不同的数值范围,有些注意力头计算出的平均分数可以达到+1e4或-1e-3。经过几周的艰苦探索,我们发现避免这一问题的最快和最简单的方法是在softmax计算中使用FP32。与完全的FP16计算相比,它几乎没有任何速度上的损失,但明显提高了训练的稳定性。
      每个注意力头计算出的注意力得分有非常不同的数值范围(摘自CogView)
      每个注意力头计算出的注意力得分有非常不同的数值范围(摘自CogView

并行计算

3D并行策略:数据并行性(Valiant,1990)、张量模型并行性(Shoeybi et al.,2019)、流水线模型。data paralelism、tensor model parallelism、 pipline model parallelism
pipline model parallelism:在这段话中,“流水线并行性“指的是将模型划分为每个并行组依次进行的阶段,以进一步最小化由流水线引入的“气泡”。为了实现这一点,作者使用了来自DeepSpeed(Rasley等人,2020)的PipeDream-Flush实现(Narayanan等人,2021),该实现可以相对地减少气泡的出现。作者还提到,他们使用的是DeepSpeed工具包来训练GLM-130B模型。
notion image

参考

ChatGLM3-6B

简介

工具调用

  1. 工具
    1. notion image
  1. 选择工具并填写参数
    1. notion image
  1. 调用工具,完成查询
    1. notion image
  1. 将输出结果送入模型进行回答。将输出结果送入模型进行回答
    1. notion image

对话模式

模型结构

 

GLM-4V-9B

 
 

agentlm-70b

参考

  • 《ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools》
  • 《ChatGLM-RLHF: Practices of Aligning Large Language Models with Human Feedback》
 
  • LLM
  • DeepNet: Scaling Transformers to 1,000 Layers在 X86 设备上使用 Docker 构建 ARM 镜像
    Loading...
    目录