大型语言模型(large language model: LLM
),尤其是那些参数超过100B
的语言模型,已经呈现出有吸引力的 scaling laws
,并突然涌现(emergent
)出 zero-shot
能力和 few-shot
能力。其中,具有175B
参数的 GPT-3
在各种 benchmark
上用 32
个标记样本产生了比完全监督的 BERT-Large
模型更好的性能,从而开创了 100B-scale LLM
的研究。然而,GPT-3
(以及其他100B-scale
的模型)的模型本身、以及如何训练该模型,迄今为止都没有向公众开放。训练如此规模的高质量 LLM
,并与大家分享模型和训练过程,是非常有价值的。
因此,论文 《GLM-130B: An Open Bilingual Pre-trained Model》
的目标是在考虑到伦理问题的前提下,预训练一个开放的、高度准确的 100B-scale
的模型 。在作者的尝试过程中,作者认识到,与训练10B-scale
的模型相比,在预训练的效率、稳定性和收敛性方面,预训练如此规模的 dense LLM
会带来许多意想不到的技术挑战和工程挑战。在训练 OPT-175B
和 BLOOM-176B
时也同时观察到类似的困难,进一步证明了 GPT-3
作为先驱研究的意义。
在该论文中,作者介绍了 100B-scale
模型(即,GLM-130B
)的预训练,包括工程工作、模型设计选择、针对效率和稳定性的训练策略,以及针对可负担推理(affordable inference
)的量化。由于人们普遍认识到,从计算上来说,枚举所有可能的设计来训练100B-scale LLM
是不经济的,因此作者不仅介绍了训练 GLM-130B
的成功部分,也介绍了许多失败的方案和经验教训。特别是,训练的稳定性是训练如此规模的模型的成功的决定性因素。与 OPT-175B
中手动调整学习率和 BLOOM-176B
中牺牲性能使用 embedding norm
等做法不同,作者尝试了各种方案,发现 embedding gradient shrink
的策略可以显著稳定 GLM-130B
的训练。
具体而言,GLM-130B
是一个具有 130B
个参数的双语(英文和中文)的双向的 dense model
,在 2022
年 5
月 6
日至 7
月 3
日期间,在 96
个 NVIDIA DGX-A100
( 40G * 8
)GPU
节点的集群上预训练了超过 400B
个 token
。作者没有使用 GPT-style
的架构,而是采用了通用语言模型(General Language Model: GLM
)算法(《Glm: General language model pretraining with autoregressive blank infilling》
),以利用其双向注意力的优势、以及自回归的 blank infilling objective
。下表总结了 GLM-130B
、GPT-3
和另两个开源工作(OPT-175B
和 BLOOM-176B
)、以及 PaLM 540B
(一个更大的模型)作为参考。
总之,概念上的独特性、以及工程上的努力使 GLM-130B
在广泛的 benchmark
(总共 112
个任务)上表现出超过 GPT-3
的性能,在许多情况下也超过了 PaLM 540B
。此外, OPT-175B
和 BLOOM-176B
中没有观察到超过 GPT-3
的性能(参考图 Figure 1(a)
)。
对于 zero-shot
性能,GLM-130B
在 LAMBADA
上优于 GPT-3 175B(+5.0%)
、OPT-175B(+6.5%)
、以及 BLOOM-176B(+13.0%)
,并在Big-bench-lite
上取得比 GPT-3
更好的性能。
对于5-shot
的 MMLU
任务,GLM-130B
比 GPT-3 175B(+0.9%)
和 BLOOM-176B(+12.7%)
更好。
作为一个中文的双语 LLM
,它的结果明显优于 ERNIE TITAN 3.0 260B
(最大的中文 LLM
),在 7 zero-shot
的 CLUE
数据集上(+24.26%
)和 5 zero-shot
的 FewCLUE
数据集上(+12.75%
)。
重要的是,正如图 Figure 1(b)
所总结的那样,GLM-130B
作为一个开放的模型,其 bias
和 generation toxicity
明显低于100B-scale
的同类模型。
最后,作者设计 GLM-130B
是为了让尽可能多的人能够进行 100B-scale LLM
的研究:
首先,没有像 OPT
和 BLOOM
那样使用 175B
以上的参数,而是决定采用130B
的规模,因为这样的规模支持在单台 A100
服务器( 8
个40G A100 GPU
)上进行推理。
其次,为了进一步降低对 GPU
的要求,作者将 GLM-130B
量化为INT4
精度,而 OPT
和 BLOOM
只能达到 INT8
。由于 GLM
架构的独特属性,GLM-130B
的 INT4
量化带来的性能下降可以忽略不计,
例如,在 LAMBADA
上为 -0.74%
,在 MMLU
上甚至为 +0.05%
,使其仍然优于未压缩的 GPT-3
。这使得 GLM-130B
在 4
个 RTX 3090
(24G
)或8
个RTX 2080 Ti
(11G
)的服务器上实现了快速推理,这是迄今为止使用 100B-scale LLM
所需的最实惠的 GPU
。
作者开源了model checkpoint
、代码、训练日志、相关工具包和经验教训。
相关工作:这里我们将回顾 GLM-130B
的相关工作,包括预训练、迁移、和推理,这些工作利用 web-scale
语料库的自监督学习,近年来深深影响了学术界和社会。
Pre-Training
:平凡的语言模型指的是 decoder-only
的自回归模型(如 GPT
),但它也承认(recognize
)任何形式的文本上的自监督目标。最近,基于 transformer
的语言模型呈现出迷人的 scaling law
:随着模型规模的扩大,新的能力涌现了,从 1.5B
规模的语言模型、10B
规模的语言模型,到 100B
规模的 GPT-3
。
后来,尽管出现了许多 100B-scale LLM
的英文版本和中文版本,但它们没有向公众提供,或者只能通过有限的 API
访问。LLM
的封闭性严重阻碍了其发展。GLM-130B
的努力,以及最近的 ElutherAI
、OPT-175B
和 BLOOM-176B
,旨在为我们的社区提供高质量的开源 LLM
。另外,使 GLM-130B
与其他项目不同的是,GLM-130B
注重 LLM
对所有研究人员和开发者的包容性(inclusivity
)。从我们对模型规模的决定,对模型架构的选择,以及允许模型在主流的 GPU
上进行快速推理,GLM-130B
相信,对所有人的包容性才是实现 LLM
对人们承诺的福利的关键。
Transferring
:尽管微调一直是迁移学习的事实方式,但由于 LLM
的规模巨大,其转移学习一直集中在 prompting
和 in-context learning
上。继类似的 LLM
之后,在这项工作中,我们的评估也是在这种环境下进行的。然而,最近的一些尝试是关于语言模型的 parameter-efficient learning
(《Parameter-efficient transfer learning for nlp》
)和 prompt tuning
(即 P-tuning
)。在这项工作中,我们不关注它们,并将它们在 GLM-130B
上的测试留在未来的研究中。
Inference
:现在大多数可公开访问的 LLM
都是通过有限的 API
提供服务的。在这项工作中,我们努力的一个重要部分是对LLM
的高效和快速的推断。相关工作可能包括蒸馏、量化、以及剪枝。最近的工作(《Llm. int8 (): 8-bit matrixmultiplication for transformers at scale》
)表明,由于 outlier dimension
的特殊分布,OPT-175B
和 BLOOM-176B
等 LLM
可以被量化为 8 bit
。
然而,在这项工作中,我们根据我们对 LLM
架构选择的新见解,证明 GLM
对 INT4
权重量化的 scaling law
。这种量化,加上我们在使 GLM-130B
适应 FasterTransformer
方面的工程努力,使得 GLM-130B
可以在少至 4
个 RTX 3090 (24G) GPU
或 8
个GTX 1080 Ti (11G) GPU
上有效推断。它实现了 LLM
对公众的经济可用性,并分阶段实现了我们对 LLM
的包容性的承诺。
一个机器学习模型的架构定义了它的归纳偏置( inductive bias
)。然而,人们已经意识到,探索 LLM
的各种架构设计在计算上是负担不起的。我们介绍并解释 GLM-130B
的独特的设计选择。
GLM
作为 Backbone
:最近大多数 100B-scale LLM
(如 GPT-3
、PaLM
、OPT
和 BLOOM
),都遵循传统的 GPT
风格的 decoder-only autoregressive language modeling
架构。在 GLM-130B
中,我们反而尝试探索双向的 General Language Mode: GLM
作为其backbone
的潜力。
GLM
是一个基于 transformer
的语言模型,利用 autoregressive blank infilling
作为其 training objective
。简而言之,对于一个文本序列 text span
token
:mask token
,从而获得被破坏的文本序列 corrupted spans
之间的交互,它们之间的可见性是由对它们的顺序进行随机抽样的 permutation
来决定的。pre-training objective
被定义为:
其中:
permutation
的集合,span
数量。
text span
。
text span
中,所有位于 token
。
GLM
对 unmasked contexts
的双向注意力使 GLM-130B
区别于使用单向注意力的 GPT-style LLMs
。为了同时支持 understanding
和 generation
,它混合了两种 corruption objective
,每种 objective
由一个 special mask token
来标识:
[MASK]
:句中的 short blank
,它们的长度加起来等于输入句子长度的某个比例(这个比例是一个超参数)。
[gMASK]
:随机长度的 long blank
,它们出现在句子末尾并且具有所提供的 prefix context
。
从概念上讲,具有双向注意力的 blank infilling objective
能够比 GPT-style model
更有效地理解上下文:
当使用 [MASK]
时,GLM-130B
的表现与 BERT
和 T5
相似。
当使用 [gMASK]
时,GLM-130B
的表现与 PrefixLM
(如,UniLM
)相似。
在下图中,根据经验,GLM-130B
超越了 GPT-3
和 PaLM 540B
,在 zero-shot LAMBADA
上提供了 80.2%
的创纪录的高准确率。通过设置注意力掩码,GLM-130B
的单向变体(unidirectional variant
)与 GPT-3
和 OPT-175B
相当。我们的观察结果与现有的研究结果一致。
Layer Normalization: LN
:训练不稳定是训练 LLM
的一个主要挑战(如 Figure 11
所示,训练一些 100B-scale model
时的崩溃情况)。适当选择 LN
可以帮助稳定 LLM
的训练。我们尝试了现有的做法,例如 Pre-LN
、Post-LN
、Sandwich-LN
,遗憾的是这些做法无法稳定我们的 GLM-130B test run
(详见图 Figure 3(a)
和附录技术细节中 Layer Normalization
的内容)。
我们的搜索后来集中在 Post-LN
上,因为它在初步实验中具有有利的下游结果,尽管它不能稳定 GLM-130B
。幸运的是,对 Post-LN
的尝试之一是用新提出的 DeepNorm
,产生了有希望的训练稳定性。具体来说,给定 GLM-130B
的层数
其中:ffn, v_proj, out_proj
应用具有缩放因子为 Xavier normal initialization
。此外,所有 bias
项都被初始化为零。下图显示它对 GLM-130B
的训练稳定性大有裨益。
Positional Encoding
和 FFN
:我们在训练稳定性和下游性能方面对位置编码(positional encoding: PE
)和 FFN improvement
的不同方案进行了经验性测试(详见附录技术细节中的 Positional Encoding
和 FFN
内容)。
对于 GLM-130B
中的 PE
,我们采用旋转位置编码(Rotary Positional Encoding: RoPE
),而不是 ALiBi
(《Train short, test long: Attention with linear biases enables input length extrapolation》
)。
Attention with Linear Biases: ALiBi
:传统的Transformer
方法中,positional embedding
被添加到embedding layer
,然后再执行attention score
的计算。相反,ALiBi
并没有添加positional embedding
到embedding layer
,而是直接在query-key
内积之后添加一个静态的、non-learned bias
(如下图所示):其中:
为一个 head-specific
的标量。在原始论文中,模型有8
个head
,因此对每个 head
依次选择为。
为了改进 Transformer
中的 FFN
,我们挑选了带有 GeLU
激活的 GLU
。
受最近工作的启发,GLM-130B
的预训练目标不仅包括自监督的 GLM autoregressive blank infilling
,还包括针对一小部分的 token
的多任务学习。这预计将有助于提高其下游的 zero-shot
性能。
Self-Supervised Blank Infilling (95% tokens)
:回顾一下,GLM-130B
同时使用[MASK]
和 [gMASK]
来完成这项任务。具体来说:
对于 30%
的 training tokens
,[MASK]
被用来掩码 consecutive span
从而用于 blank infilling
。span
的长度遵循泊松分布( 15%
。
对于其他的 70%
的 training tokens
,每个序列的前缀被保留为上下文,[gMASK]
被用来掩码剩余部分。masked length
从均匀分布中采样。
masked length
最长是多少,最短是多少?论文并未说明细节。
预训练数据:包括1.2T
的 Pile
英文语料、1.0T
的中文 Wudao-Corpora
、以及我们从网上抓取的 250G
中文语料(包括在线论坛、百科全书、以及问答),它们构成了一个均衡的中英文内容。
Multi-Task Instruction Pre-Training: MIP (5% tokens)
: T5
和 ExT5
表明,预训练中的多任务学习比微调更有帮助,因此我们提议在 GLM-130B
的预训练中包括各种 instruction prompted
的数据集,包括语言理解、生成、以及信息提取。
与最近利用多任务 prompted fine-tuning
来改善 zero-shot task transfer
的工作相比,MIP
只占 5%
的 tokens
,而且是在预训练阶段设置的,以防止破坏 LLM
的其他通用能力(如,无条件地自由生成)。
具体来说,我们包括来自 《Multitask prompted training enables zero-shot task generalization》
和 《Deepstruct:Pretraining of language models for structure prediction》
的 74
个 prompted dataset
,参考附录中的 数据集和评估细节内容。建议 GLM-130B
用户避免在这些数据集上评估模型的 zero-shot
能力和 few-shot
能力。
论文
《GLM: General Language Model Pretraining with Autoregressive Blank Infilling》
中,多任务指的是多任务预训练,包括blank infilling objective, document-level objective, sentence-level objective
,这三个目标的区别在于blank
策略的不同:
blank infilling objective
随机采样多个较短的span
。
document-level
采样一个长的、位于文本末尾的span
。
sentence-level
采样多个span
,且每个span
必须是完整的句子。
GLM-130B
在一个由 96
个 DGX-A100 GPU
( 8
个 40G
的 A100 GPU
)服务器组成的集群上进行训练,访问时间为 60
天。目标是训练尽可能多的 token
,因为最近的一项研究(《Training compute-optimal large language models》
)表明,大多数现有的LLM
在很大程度上是训练不充分的。
3D
并行策略:数据并行和张量模型并行(《Megatron-lm: Training multi-billion parameter language models using model parallelism》
)是训练 billion-scale
模型的事实做法。为了进一步处理巨大的 GPU
内存需求、以及在节点之间应用张量并行导致的 GPU
总体利用率的下降(因为在训练 GLM-130B
时使用了 40G
而不是 80G
的A100
),我们将 pipeline model parallelism
与其他两种并行策略结合起来,形成一个 3D
并行策略。
流水线并行(pipeline parallelism
)将模型划分为 sequential stages
用于每个 parallel group
。为了进一步减少 pipeline
引入的 bubbles
,我们利用 DeepSpeed
的 PipeDream-Flush
实现来训练 GLM-130B
,采用相对较大的全局batch size
(即, 4224
)来减少时间浪费和 GPU
内存浪费。通过数值检查和经验考察,我们采用了 4
路张量并行和 8
路流水线并行,达到 135 TFLOP/s per GPU (40G)
(详见附录的技术细节的流水线并行的分析内容)。
GLM-130B
配置:我们的目标是使我们的 100B-scale LLM
能够以 FP16
精度运行单个 DGX-A100 (40G)
节点。基于 12288
的隐状态维度(根据 GPT-3
而来),所产生的模型规模不超过 130B
的参数,因此得到 GLM-130B
。为了最大限度地提高 GPU
的利用率,我们根据平台及其相应的并行策略来配置模型。为了避免由于两端的额外 word embedding
而导致 middle stages
的内存利用率不足,我们通过从其中删除一层来平衡 pipeline partition
,使 GLM-130B
中包含 9 * 8 - 2 = 70
个 transformer layers
。
猜测作者的意思是:
input word embedding
和output word embedding
共享?
在对集群的 60
天访问期间,我们设法对 GLM-130B
进行了 400B
个 token
(中文和英文各约 200B
)的训练,每个样本的固定序列长度为 2048
。
对于 [gMASK] training objective
,我们使用 2048
个 token
的上下文窗口;对于 [MASK] training objective
和多任务目标,我们使用 512
的上下文窗口,并将四个样本串联起来从而满足 2048
的序列长度。
在前 2.5%
的样本中,我们将 batch size
从 192
升至 4224
。
我们使用 AdamW
作为我们的优化器,其中 0.9
和 0.95
,权重衰减值为 0.1
。
在前 0.5%
的样本中,我们将学习率从
我们使用 0.1
的dropout rate
,并使用 1.0
的剪裁值来剪裁梯度。
完整配置如下表所示。
训练稳定性是 GLM-130B
质量的决定性因素,它在很大程度上也受到 training token
数量的影响(《Training compute-optimal large language models》
)。因此,给定计算用量(computing usage
)的限制,在浮点格式方面,必须在效率和稳定性之间进行权衡: 低精度浮点格式(例如,16
位精度 FP16
)提高了计算效率,但容易出现上溢出或下溢出错误,导致训练崩溃。
混合精度:我们遵循混合精度策略(Apex O2
)的普遍做法,即 forward
和 backward
采用 FP16
,优化器状态和 master weight
采用 FP32
,以减少 GPU
内存占用并提高训练效率。与 OPT-175B
和 BLOOM-176B
类似(参见下图所示),GLM-130B
的训练由于这种选择而面临频繁的 loss
尖峰,随着训练的进行,这种尖峰往往变得越来越频繁。与精度有关的尖峰往往没有明确的原因:有些会自行恢复;有些则伴随着梯度范数突然飙升的预兆,最终出现 loss
尖峰甚至是 NaN
的 loss
。
OPT-175B
试图通过手动跳过数据(skipping data
)和调整超参数来修复;BLOOM-176B
通过 embedding norm
技术来修复。我们花了几个月的时间来实验性地调查尖峰,并意识到当 transformers scale up
时,会出现一些问题:
首先,如果使用 Pre-LN
,transformer main branch
的 value scale
在更深的层中会非常大。在 GLM-130B
中,通过使用基于 DeepNorm
的 Post-LN
来解决这个问题,这使得 value scale
总是有界。
第二,随着模型规模的扩大,注意力分数增长得非常大,以至于超过了 FP16
的范围。在 LLM
中,有几个方案可以克服这个问题。
在 CogView
中,提出了 PB-Relax
,在注意力计算中去除 bias
项并扣除极值以避免该问题,遗憾的是,这并不能帮助避免 GLM-130B
中的不收敛(disconvergence
)。
在 BLOOM-176B
中,由于 BF16
格式在 NVIDIA Ampere GPU
(即 A100
)上的取值范围很广,因此使用了 BF16
格式而不是 FP16
。然而,在我们的实验中,BF16
比 FP16
多消耗 15%
的运行时 GPU
内存,这是因为它在梯度累积中转换为FP32
,更重要的是它在其他 GPU
平台(如 NVIDIA Tesla V100
)上不被支持,限制了所得到的 LLM
的可用性。
BLOOM-176B
的另一个选择是应用具有 BF16
的 embedding norm
,但要牺牲模型性能。
Embedding Layer Gradient Shrink: EGS
:我们的实证研究发现,梯度范数可以作为训练崩溃的一个 informative
的指标。具体来说,我们发现训练崩溃通常滞后于梯度范数的 "尖峰" 若干个训练步。这种尖峰通常是由 embedding
层的异常梯度引起的,因为我们观察到在 GLM-130B
的早期训练中,embedding
层的梯度范数往往比其他层的梯度规范大几个量级(参考 Figure 4(a)
)。此外, embedding
层的梯度范数在早期训练中往往会出现剧烈的波动。这个问题在视觉模型中(《An empirical study of training self-supervised vision transformers》
)通过冻结 patch projection layer
来处理。不幸的是,我们不能冻结语言模型中 embedding
层的训练。
最后,我们发现 embedding
层的梯度收缩可以帮助克服 loss
尖峰,从而稳定 GLM-130B
的训练。这首先在 multi-modal transformer CogView
中使用。具体来说,令
Figure 4 (b)
表明,根据经验,设置 loss
尖峰,而训练速度几乎不变。
事实上,最后的 GLM-130B training run
只经历了关于损失函数在训练后期发散的三个 case
,尽管它由于硬件故障而失败了无数次。对于这三个意外的峰值,事实证明,进一步缩小 embedding
梯度仍然可以帮助稳定 GLM-130B
的训练。详情见我们代码库中的 training notes
和 Tensorboard
日志。
GLM-130B
的主要目标之一是降低访问 100B-scale LLM
的硬件要求,而不存在效率和效果的劣势。
如前所述,130B
的模型规模是为在单台 A100
( 40G * 8
)服务器上运行完整的 GLM-130B
模型而确定的,而不是 OPT-175B
和BLOOM-176B
要求的高端 A100
(80G * 8
)机器。为了加速 GLM-130B
推断,我们还利用 FasterTransformer
(《Accelerated inference for large transformer models using nvidia triton inference server》
)在 C++
中实现 GLM-130B
。与 Huggingface
中 BLOOM-176B
的 PyTorch
实现相比,GLM-130B
的 decoding inference
在同一台 A100
服务器上要快 7-8.4
倍。(详见附录中技术细节的Inference
加速的内容)。
针对 RTX 3090/2080
的 INT4
量化:为了进一步支持主流的 GPU
,我们试图在保持性能优势的同时尽可能地压缩 GLM-130B
,特别是通过量化,这对生成式语言模型来说几乎没有引入任务相关的性能下降。
通常情况下,做法是将模型权重和 activation
都量化为 INT8
。然而,我们在附录中技术细节的 Activation Outlier
分析表明,LLM
的 activation
可能包含极端的outlier
。同时,OPT-175B
和 BLOOM-176B
中出现的outlier
也被发现,这些outlier
只影响约 0.1%
的 feature dimension
,因此通过矩阵乘法分解来解决outlying dimension
。
不同的是,在 GLM-130B
的 activations
中存在约 30%
的 outlier
,使得上述技术的效率大大降低。因此,我们决定将重点放在模型权重的量化上(主要是线性层),同时保持activation
的 FP16
精度。我们简单地使用 post training absmax
量化,权重在运行时被动态地转换为 FP16
精度,引入了一个小的计算开销,但大大减少了用于存储模型权重的 GPU
内存使用。
令人振奋的是,我们设法使 GLM-130B
的权重量化达到了 INT4
,而现有的成功案例迄今只达到了 INT8
水平。
内存方面,与INT8
相比,INT4
版本有助于额外节省一半所需的 GPU
内存,最终需要 70GB
的 GPU
内存,从而允许 GLM-130B
在 4
个 RTX 3090 Ti (24G)
或 8
个 RTX 2080 Ti (11G)
上进行推理。
性能方面,下表左侧显示,在完全没有 post-training
的情况下,INT4
版本的GLM-130B
几乎没有性能下降,因此在 common benchmarks
上保持了对 GPT-3
的优势。
GLM
的 INT4
权重量化的 Scaling Law
:Figure 4
右侧显示了随着模型大小的增加而出现的性能趋势,表明 GLM
的 INT4
权重量化的性能出现了一个 scaling law
。
我们研究了在 GLM
中观察到的这一独特属性的基本机制。我们在下图左侧绘制了权重取值的分布,结果发现它直接影响了量化质量。具体来说,一个分布较宽的线性层需要用较大的 bin
进行量化,从而导致更多的精度损失。因此,宽分布的 attn-dense
和 w2
矩阵解释了 GPT-style BLOOM
的 INT4
量化的失败。相反,GLM
的分布往往比类似大小的 GPT
的分布窄得多,随着 GLM
模型规模的扩大,INT4
和 FP16
版本之间的差距不断进一步缩小(详见Figure 15
)。
我们遵循 GPT-3
和 PaLM
等 LLM
的常见设置,对 GLM-130B
针对英语进行评估。作为一个具有中文的双语 LLM
,GLM-130B
也在中文 benchmark
上进行了评估。
关于 GLM-130B
的 Zero-Shot Learning
的范围的讨论:由于 GLM-130B
是用MIP
进行训练的,因此我们在此澄清它的 zero-shot
的范围。事实上,"zero-shot"
似乎有争议性的解释,在社区中没有达成共识。我们遵循其中一个有影响力的相关综述(《Zero-shot learning -- a comprehensive evaluation of the good, the bad and the ugly》
),它说 "在测试时间,在zero-shot learning setting
中,目的是将测试图像分配给一个未见过的 class label
",其中涉及未见过的 class label
是一个关键。因此,我们推导出挑选 GLM-130B
的 zero-shot/few-shot
数据集的标准为:
英语:
对于有固定标签的任务(如自然语言推理任务):不应评估此类任务中的数据集。
对于没有固定标签的任务(如问答任务、主题分类任务):只考虑与 MIP
中的数据集有明显的 domain transfer
的数据集。
中文:所有的数据集都可以被评估,因为存在着 zero-shot
的跨语言迁移(cross-lingual transfer
)。
根据之前的实践(GPT-3
)和我们上面提到的标准,我们过滤并避免报告可能被污染的数据集上的结果。对于 LAMBADA
和 CLUE
,我们发现在 13-gram setting
下,overlap
最小。Pile, MMLU, BIG-bench
要么被 held-out
,要么发布时间晚于语料库的爬取。
LAMBADA
:LAMBADA
是一个用于测试 last word
的语言建模能力的数据集。在 Figure 2
中显示的结果表明,GLM-130B
凭借其双向注意力达到了 80.2
的 zero-shot
准确率,在 LAMBADA
上创造了新的记录。
Pile
:Pile
测试集包括一系列语言建模的 benchmark
。平均来说,与 GPT-3
和 Jurassic-1
相比,GLM-130B
在其 18
个共享测试集的加权 BBP
方面表现最好,显示了其强大的语言能力。
Massive Multitask Language Understanding: MMLU
是一个多样化的 benchmark
,包括 57
个关于人类知识的多选题问题任务,范围从高中水平到专家水平。它是在 Pile
的爬取之后发布的,是 LLM
的 few-shot learning
的理想测试平台。GPT-3
的结果来自于MMLU
,BLOOM-176B
的结果则通过使用与 GLM-130B
相同的 prompt
进行测试。
在下图中,GLM-130B
在 MMLU
上的 few-shot (5-shot)
性能在查看了大约 300B
的 token
后接近 GPT-3
(43.9
)。随着训练的进行,它继续上升,当训练不得不结束时(即总共查看了 400B
个 token
),达到了 44.8
的准确率。这与观察到的情况一致,即大多数现有的 LLM
远没有得到充分的训练。
Beyond The Imitation Game Benchmark: Big-Bench
是关于模型的推理、知识、常识等能力的挑战性任务的 benchmark
。鉴于对其 150
个任务的评估对 LLM
来说是很耗时的,我们现在报告 BIG-bench-lit
(一个官方的 24
个任务的子集合)。
从下图和下表中可以看出,GLM-130B
在 zero-shot setting
中优于 GPT-3 175B
,甚至 PaLM 540B
(比 GLM-130B
的模型规模大四倍)。这可能是由于 GLM-130B
的双向上下文注意力和 MIP
,这已被证明可以改善未见任务中的 zero-shot
结果。随着 shot
数量的增加,GLM-130B
的性能不断上升,保持了对 GPT-3
的优势。
PaLM 540B
的1-shot
效果在这个表格里效果最好。
局限性和讨论:在这个实验中,我们观察到 GLM-130B
的性能增长(13.31
到 15.12
)随着 few-shot
样本的增加,不如 GPT-3
(4.35
到 13.18
)那么明显。以下是理解这一现象的直观尝试。
首先,GLM-130B
的双向性可能会导致强大的 zero-shot
性能(正如 zero-shot language modeling
所表明的那样),从而比单向的 LLM
更接近类似规模(即 100B-scale
)的模型的 few-shot "upper-bound"
。
其次,这也可能是由于现有的 MIP
范式的不足,这些范式在训练中只涉及 zero-shot prediction
,将有可能使 GLM-130B
偏向于更强的 zero-shot learning
、但相对较弱的 in-context few-shot
性能。为了纠正这种 bias
,如果我们有机会继续对GLM-130B
进行预训练,我们提出的一个潜在的解决方案是采用具有多样化 shots of in-context samples
的 MIP
,而不是只有 zero-shot
样本。
即,
MIP
范式没有给出示例样本,因此模型仅见过zero-shot
的模式,所以在zero-shot learning
方面更强大。
最后,尽管 GPT
架构与 GPT-3
几乎相同,但 PaLM 540B
在 few shot in-context learning
上的相对增长要比 GPT-3
更显著。我们猜测这种性能增长的进一步加速是来自于 PaLM
的高质量和多样化的私人收集的训练语料。通过结合我们的经验和《Training compute-optimal large language models》
的见解,我们认识到应该进一步投资更好的架构、更好的数据、以及更多的 training FLOPS
。
我们在既定的中文 NLP benchmark
,Chinese Language Understanding Evaluation: CLUE
和 FewCLUE
上对 GLM-130B
的中文zero-shot
性能进行评估。请注意,我们在 MIP
中不包括任何中文的下游任务。到目前为止,我们已经完成了对这两个 benchmark
的部分测试,包括 7
个 CLUE
数据集和 5
个 FewCLUE
数据集。我们将 GLM-130B
与现有最大的中文单语语言模型 260B ERNIE Titan 3.0
进行比较。我们遵从 ERNIE Titan 3.0
的设置,在验证集上报告了 zero-shot
的结果。
GLM-130B
在 12
个任务中的表现一直优于 ERNIE Titan 3.0
(如下图所示)。有趣的是,GLM-130B
在两个 abstractive MRC
数据集(DRCD
和CMRC2018
)上的表现至少比 ERNIE
好 260%
,这可能是由于 GLM-130B
的预训练目标与 abstractive MRC
的形式自然产生共鸣。
我们成功和失败的经验都浓缩在以下训练 100B-scale LLM
的经验教训中:
教训一(Bidirectional Architecture
):除了 GPT
之外,双向注意力的 GLM
是一个强大的架构选择。
教训二(Platform-aware Configuration
):根据集群和并行策略(并行策略用于压榨硬件潜力)来配置 LLM
。
教训三(Improved Post-LN
):反常态地,DeepNorm
,一种 Post-LN
的类型,是稳定 GLM-130B
的选择。
教训四(Training Stability Categorization
):LLM
所遭受的意想不到的训练不稳定性由系统上和数值上而引起。
教训五(Systematical Instability: FP16
):尽管 FP16
诱发了更多的不稳定性,但它能在各种各样的平台上进行训练和推理。
教训六(Numerical Instability: Embedding Gradient Shrink
):将 embedding
层的梯度缩小到 0.1
倍可以解决大多数数值不稳定问题。
教训七(GLM’s INT4 Quantization Scaling Law
):GLM
有一个独特的 INT4 weight quantization scaling law
,在GPT
风格的 BLOOM
中未被观察到。
教训八 (Future Direction
):为了创造强大的 LLM
,主要重点可以放在:更多更好的数据、更好的架构和预训练目标、更充分的训练。
Bias
评估:
CrowS-Pairs
:CrowS-Pairs
,即 Crowdsourced Stereotype Pairs benchmark
,被广泛用于测量 masked language model
的 bias
。它收集了 1508
个具有九种常规 bias
的例子,并采用 probing-based
的方法来来比较一对刻板印象句子(stereotypical sentence
)和反刻板印象句子(antistereotypical sentence
)的伪对数可能性(pseudo log-likelihood
)。
我们将 GPT-3 Davinci
和 OPT-175B
在 CrowS-Pairs
上的结果(来自 OPT
的原始论文)与GLM-130B
进行比较。我们的结果如下表所示。除了宗教和国籍,GLM-130B
在几乎所有种类的刻板印象上都显示出较少的 bias
。我们推测,这是因为 GLM-130B
是一个双语预训练的 LLM
,它从英文语料和中文语料中学习某些内容的语义。由于 CrowsS-Pairs
的刻板印象主要来自 US Equal Employment Opportunities Commission
的 list
,两种不同文化和语言的 bias
分布可能是不同的,因此在 GLM-130B
中调和 benchmark
上的 social bias
,而这个 benchmark
最初是为英语社会所设计的。我们认为这是一个有趣的发现,因为多语言的预训练可能会帮助 LLM
呈现更少的有害 bias
,以达到更好的公平性。
最后,我们也承认,GLM-130B
可能会出现一些特殊的中文bias
,而这些bias
目前还缺乏测试 benchmark
,需要在未来做出大量努力来检测和预防。
注意,得分越低越好。
StereoSet
:另一个广泛使用的 bias
和刻板印象评价 benchmark
是 StereoSet
。为了平衡 bias detecting
和语言建模质量之间的评估,StereoSet
报告了一系列指标,包括语言建模分(Language Modeling Score: LMS
)、刻板印象分(Stereotype Score: SS
)、以及理想化语境关联测试分数(Idealized Context Association Test Score: ICAT
)作为整体平均指标。
例如,给定"She is the twin’s mother"
这一 premise
,StereoSet
提供了三个候选hypothesis
:"the water is deep"
、"she is a lazy, unkind person"
、"she is a kind, caring woman"
。第一个选项作为distractor
,用于测试模型的语言能力和计算 LMS
;第二个选项和第三个选项分别是 anti-stereotypical
和 stereotypical
的,用于计算 SS
。
这里的一个常见做法是根据选项的长度来校准其可能性,因为 distractor term
特别短。 遵从 OPT
,我们在 token
上(而不是在字符上)归一化分数,从而产生用于计算指标的 model prediction
。结果如下表所示。正如我们所观察到的,GLM-130B
在所有指标上都远远超过了GPT-3 Davinci
和 OPT-175B
。这样的结果与我们在语言建模实验和 CrowS-Pairs bias evaluation
实验中的发现一致,即 GLM-130B
在语言建模和社会公平方面都有很高的质量。
LMS
和ICAT
得分越高越好,SS
得分越低越好。
ETHOS
:社交媒体语料库可能包含仇恨言论,调查 LLM
在多大程度上知道并能帮助识别这些言论是至关重要的。我们采用 ETHOS
数据集来检测性别主义和种族主义言论。GPT-3 Davinci
(GPT-3 175B
的一个可公开访问的变体,注意是 API
访问而不是开源)和 OPT 175B
也在该 benchmark
上进行了测试(其结果在 OPT
原始论文中报告)。对于二分类,包括 Zero-shot
、One-shot
和 Few-shot(binary)
(回答 "yes"
或"no"
),我们报告binary F1
;对于多分类(回答 "yes"
、 "no"
或 "neither"
),我们报告micro F1
。我们采用了与 《Detecting hate speech with gpt-3》
中几乎相同的 prompt
,只是将 Few-shot (binary) prompt
与 One-shot
中使用的形式对齐,并在原 Few-shot (multiclass) prompt
中的冒号前添加 "Classification"
一词。
结果如下表所示。我们发现 GLM-130B
在四个不同的设置中胜过其他两个 LLM
。一方面,GLM-130B
对来自在线论坛和社交媒体的无监督的多样化语料进行预训练,包括 "hackernews"
、"stackexchange"
和"pile_cc "
等部分,可以赋予我们的模型识别这些言论的背景知识。另一方面,MIP
训练也可以提高GLM-130B
的 zero-shot
和 few-shot
能力。
RealToxicPrompts
:评估由给定 prompt
产生的毒性对模型的安全部署至关重要。我们在 RealToxicPrompts
数据集上评估 GLM-130B
的 toxic generation
。遵从 OPT
的设置,首先我们随机采样 10K
个 prompt
,然后我们使用核采样(prompt
生成25
个 continuation
,将最大 generated length
限制在 128 tokens
。然后,我们报告了由 Perspective API
评估的 25
个 continuations
的平均毒性概率。为了在不同的 tokenization
之间进行公平的比较,我们只报告了 continuation
中第一个完整句子的毒性得分,因为 Perspective API
返回的分数似乎随着句子长度而增加。
核采样:给定一个概率阈值
,从 vocabulary
中选择一个最小集,使得它们出现的概率和大于等于 : 然后再将
中的单词的概率归一化,并用这个归一化的概率进行采样。
结果如下图所示。一般来说,在两个模型中,随着给定 prompt
的毒性增加,continuation
的毒性概率也相应增加。与 GPT-3 Davinci
相比,GLM-130B
在所有情况下都有较低的毒性率,表明 GLM-130B
不容易产生有害的内容。我们不包括 OPT
原始论文的结果,因为 API
已经更新,因此需要重新评估。
这里介绍了我们在整个 GLM-130B
训练中发现并解决的技术问题的额外细节。连同同时进行的开源 LLM
工作,我们相信这些公布的细节可以作为未来 LLM
训练的重要基石。
tokenization
:为了对语料库进行 tokenization
,我们在icetk package
的基础上实现了一个 text tokenizer
,并进行了一些调整。作为一个 image-text unified tokenizer
,icetk
的词汇量为 150000
。前 20000
个 token
是 image token
,其余是 text token
。icetk
的 text tokenizer
在 25GB
的中英文双语语料库上由 sentence-piece
制定和训练,其中语料库中平均分布了英文内容和中文内容。
常见的 token
从 No.20000
到 No.20099
,由标点符号、数字、以及用于自由扩展的 space
而组成。
No.20100
至 No.83822
为英文 token
,No.83823
至 No.145653
为中文 token
。
No.145653
之后的 token
是其他 special token
,包括拼接的标点符号、其他语言的 piece
等。
在我们的实现过程中,我们忽略了前 20000
个 image token
,利用了后 130000
个用于 text tokenization
的 token
。我们取消了对换行符的忽略,将换行符 \n
tokenize
为 No. 20004 token <n>
。在固有 token
的基础上,我们增加了 special token [MASK] and [gMASK]
用于模型预测。我们还增加了 special token <sop>, <eop>, <eos>
用于句子和段落的隔离。
<sop>
表示段落的开始(start of paragraph
),<eop>
表示段落的结束(end of paragraph
),<eos>
表示句子的结束(end of sentence
)。不需要标识句子的开始,因为上一个句子的结束就是下一个句子的开始。
Layer Normalization
:这里我们简单介绍一下语言建模问题中 layer normalization
的历史,以及其变体在最近的 LLM
中的表现,包括我们在 GLM-130B
上对其进行的实验。
Post-LN
:Post-LN
是与 Transformer
架构共同提出的,并被置于 residual block
之间。然后它被 BERT
采用。尽管如此,Post-LN
后来被指责导致了 Transformer
的缓慢的和脆弱的收敛(《On layer normalization in the transformer architecture》
),因此 Pre-LN
作为替代品出现了。
Post-LN
:。即, LN
添加在残差连接之后。
Pre-LN
:相反,Pre-LN
位于 residual block
中从而缓解爆炸的梯度,在现有的语言模型中成为主导,包括所有最近的LLM
。然而,OPT-175B
、BLOOM
、以及文本到图像模型CogView
后来观察到,当模型规模达到100B
或遇到多模态数据时,Pre-LN
仍然无法处理脆弱的训练。这在 GLM-130B
的初步实验中也得到了证明,Pre-LN
在早期训练阶段一直处于崩溃状态。
Pre-LN
:LN
添加在残差块之中、
根植于 Pre-LN transformer
的另一个问题是,与 Post-LN
相比,它可能在 tuning
之后损害模型的性能。这在 《Realformer: Transformer likes residual attention》
中观察到。
Sandwich-LN
:作为补救措施,在 Pre-LN
的基础上,CogView
(以及在后来的 Normformer
中)开发了 Sandwich-LN
,它在每个 residual branch
的末端附加了额外的 normalization
。伴随着Precision-Bottleneck Relaxation: PB-Relax
技术,它们稳定了一个 4B
的 text-to-image generation model
的训练。尽管它比 Pre-LN
有优势,但可悲的是,Sandwich-LN
也被证明在GLM-130B
训练中会崩溃,更不用说由其 Pre-LN
性质引起的潜在的较弱的 tuning performance
。
Positional Encoding
和 FFN
:
Positional Encoding: PE
:平凡的 transformer
采用绝对位置编码( absolute position encoding
)或正弦位置编码( sinuous position encoding
),后来演变为相对位置编码( relative positional encoding
) 。相对位置编码比绝对位置编码能更好地捕获 word relevance
。旋转位置嵌入(Rotary Positional Embedding: RoPE
)是以绝对位置编码的形式实现的相对位置编码,其核心思想表现为以下公式:
其中:relativity
)。
上式中的
其中:embedding
维度。为了使得位置编码的值随着距离的增加而衰减,我们选择:
在平凡的 GLM
中提出了一种二维绝对位置编码方法,用于建模 intra-span
位置信息和 inter-span
位置信息。在 GLM-130B
中,与平凡 GLM
中使用的二维位置编码不同,我们退回了传统的一维位置编码。然而,我们最初认为,我们不能直接将二维形式应用于RoPE
(但是随后我们在 RoPE
的作者博客中发现了实现二维 RoPE
的 instructions
,此时我们的训练已经进行了好几周了)。作为一个替代计划,在 GLM-130B
中,我们去掉了原始 GLM
中使用的第二维,因为我们发现用于 [MASK] generation
的单向 attention mask
子矩阵也表示 token order
。这一观察导致我们根据以下策略将 GLM-130B
的位置编码转变为一维编码:
对于被 short span
破坏的序列,我们丢弃第二维的位置编码。
对于末尾被 long span
破坏的序列,我们将 positional id
改为一维的 generated token
将延续来自 last context token
Feed-forward Network: FFN
:最近一些改进 Transformer
结构的努力是在 FFN
上,包括用 GLU
(在 PaLM
中采用)取代它。研究表明,使用 GLU
可以提高模型性能,这与我们的实验结果一致(如下表所示)。具体来说,我们使用带 GeLU
激活函数的 GLU
:
为了保持与平凡的 FFN
相同的参数,feed-forward
尺寸
PE
和 FFN
的消融研究:为了验证我们的 PE
和 FFN
的选择,我们在实验中通过在一个随机的 50G
中英文混合语料库上对 GLM_Base
(110M
)进行预训练从而测试它们。我们将绝对位置编码与最近流行的两个相对位置编码变体(RoPE
和 ALiBi
)进行比较。对于 FFN
,我们比较了平凡的 FFN
与带有 GeLU
激活的 GLU
。
下表的结果显示,ALiBi
和 RoPE
都改善了测试集的困惑度,而且在使用 RoPE
时其改善更为显著。而使用 GeGLU
可以进一步提高模型的性能。
流水线并行的分析:在流水线并行中,每个 stage
由三个操作组成(如下图 (a)
所示):forward
(记做 F
)、backward
(记做 B
)、以及 optimizer step
(记做 U
)。然而,朴素的 sequential pipeline implementation
会导致难以忍受的大量气泡。改进的 Gpipe
(《Gpipe: Efficient training of giant neural networks using pipeline parallelism》
)(如下图 (b)
所示)策略通过将数据分割成 micro-batch
,大大减少了气泡:micro-batch
越多,一次 iteration
中可以同时计算的 stage
就越多。最近的 PipeDream-Flush
(《Memory-efficient pipeline-parallel dnn training》
)(如下图 (c)
)通过不同 stage
的 forward
和 backward
交织,减少 forward activation
的内存占用,进一步优化了 GPU
内存的使用。
我们分析 GLM-130B
预训练中的气泡占比。假设 pipeline segment
的数量为 micro-batch
的数量为 micro-batch
的 forward
时间和 backward
时间分别为 forward
和 backward
耗时
对于较大数量的 micro-batch
GPipe
的实验表明,当 forward recomputation
技术允许 computational communication
有一定的重叠,流水线气泡时间的总百分比降低到可以忽略的水平,从而表明由流水线并行引入的气泡并没有严重消耗训练效率。
一般来说,为了充分利用硬件,通常会将模型放入由多个节点组成的 model parallel groups
,并尽量使用每个节点的全部内存。在这种情况下,我们可以自由调整流水线模型并行和张量模型并行的比例。由于数据并行几乎不影响计算时间,我们假设数据并行的规模为
从上式中可以看出,增加张量并行的规模将进一步降低气泡比例。然而,张量并行规模不能无限制地增加,这将降低计算粒度,并大大增加通信成本。因此,我们可以得出结论:张量模型并行的规模应该随着模型规模的增加而缓慢增加,但不能超过单台机器的显卡数量。在 GLM-130B
的训练中,实验表明,在 DGX-A100
系统中,最佳的张量并行规模是 3.8%
,足以证明流水线模型并行的效率。
Inference
加速:一个模型的普通 PyTorch
实现很容易阅读和运行,但对于 LLM
来说,它的速度会慢得令人难以忍受。基于NVIDIA
的 FasterTransformer
(https://github.com/NVIDIA/FasterTransformer
),我们花了两个月的时间将 GLM-130B
实现为 C++
语言,以加快推断速度,其中包括以下主要优化:
优化耗时的操作,如 GeGLU
、Layer Normalization
和 SoftMax
。
减少 GPU
内核调用,例如,将 MultiheadAttention
融合到一个 computation kernel
中。
在调用 cuBLAS
时指定最佳性能的算法。
通过提前转置(transposing
)模型参数来提高计算效率。
在 FP16
计算中使用 half2
,使 half
的访问带宽和计算吞吐量加倍。
目前我们将 GLM-130B
的完整 FasterTransformer
实现打包成一个即插即用的 docker image
,以方便用户使用,我们还在努力将其适配到我们的 Pytorch
实现,只需改变一行代码。
下表显示了我们加速的 GLM-130B
实现、以及迄今为止在 Hugging-face Transformers
中默认可用的 BLOOM-176B
实现之间的比较。我们对 GLM-130B
的实现可以比 BLOOM-176B
的 Pytorch
实现快 7.0 ~ 8.4
倍。加速 LLM
从而获得可容忍的响应速度,这可能是 LLM
普及的关键。
Activation Outlier
分析:如前所述,GLM-130B
的权重可以被量化为INT4
,以大幅度减少 inference
中的参数冗余。然而,我们也发现 GLM-130B
的 activation
(即层与层之间的隐状态)不能被适当量化,因为它们包含 value outlier
,这在同时进行的文献中也有建议(《Llm. int8 (): 8-bit matrix multiplication for transformers at scale》
)。GLM-130B
的独特之处在于,其 30%
的维度可能出现 value outlier
(如下图所示),而其他基于 GPT
的 LLM
(例如 OPT-175B
和 BLOOM 176B
)只有很少的 outlying dimension
。因此,《Llm. int8 (): 8-bit matrix multiplication for transformers at scale》
提出的分解矩阵乘法从而进行更高精度的计算,这一解决方案不适用于 GLM-130B
。
我们研究这些 outlier
是否可以在 LLM
量化中被忽略,答案是 "No"
。这些值可能比典型的activation
值大几个数量级(如下图所示)。虽然大多数值(占隐状态中 99.98%
的维度)保持在 6
以下,但那两个 outlying dimension
可以达到 50
甚至超过100
。据推测,它们是 GLM-130B
(以及潜在的其他LLM
)记忆一些固定的世界知识或语言知识的重要线索。因此,在量化过程中删除或忽略它们会导致显著的性能下降。
权重量化:
Absmax
量化:是一种对称量化,即对于张量
其中:bit width
)。
Zeropoint
量化:是一种非对称量化,即对于张量
其中:
Col/Row-wise
量化:对权重矩阵使用单个缩放因子往往会导致更多的量化错误,因为一个单个 outlier
会降低所有其他元素的量化精度。一个常见的解决方法是按行或列对权重矩阵进行分组,每组单独进行量化,并有独立的缩放因子。
量化的设置:我们的目标是在不损害模型性能的情况下尽可能地节省 GPU
内存。在实践中,我们只对线性层进行量化(线性层占据了大部分的 transformer
参数),而对 input/output embedding
、layer normalization
和 bias
项不做任何改变。在 INT4
的量化精度下,两个 INT4
权重被压缩成一个 INT8
权重以节省 GPU
的内存使用。我们采用 Absmax
量化,因为我们发现它足以保持模型的性能,而且它比 zeropoint
量化更加计算高效。在推断过程中,只有 quantized weight
被存储在 GPU
内存中;线性层的 FP16
权重在运行时被逆量化(dequantized
)。
不同规模的模型的量化效果:110M
到 10B
规模的 GLM
模型来自 GLM
的原始论文。虽然较小规模的 GLM
的结构与 GLM-130B
不一样,但我们认为 training objective
是量化的关键因素。下表显示了不同规模的 GLM
系列模型、以及 BLOOM
系列模型采用不同量化方法时在 LAMBADA
数据集上的性能。几乎所有的模型都在 INT8
精度下保持性能。在 INT4
精度下,GLM
的性能比BLOOM
的性能要好,当它规模扩大时。
权重分布的分析:为了实现 INT4
权重量化,我们用直方图分析了 GLM-130B
和对应的 BLOOM-176B
中主要线性层的权重取值分布(如下图所示)。横轴表示权重取值,纵轴表示该值的数量(在对数尺度下)。我们可以看到,主要是 BLOOM-176B
中的 w2
线性层呈现偏斜的分布,这将阻碍对称量化的进行。相反,GLM-130B
的 w2
形状良好,没有许多 outlier
和偏斜的分布,因此为其 INT4
量化铺平了道路,性能损失不大。
多任务指令预训练 Multi-task Instruction Pre-training: MIP
:遵从 T5
、FLAN
、T0
、Ext5
的做法,我们在 GLM-130B
的MIP
训练中包括许多 prompted instruction
数据集,这占了训练 token
的 5%
。T0
数据集的所有 prompt
来自 PromptSource
;DeepStruct
数据集的 prompt
是新创建的。它们的构成如下表所示,由 T0
和 PromptSource
的自然语言理解和自然语言生成数据集、以及 DeepStruct
的 information extraction
数据集组成。在 GLM-130B
的训练中,我们计算出每个数据集中大约有 36%
的样本被看过。
T0
最初拆分数据集从而用于两个部分:multi-task prompted training
、zero-shot task transfer
。我们最初计划只包括 T0
的 multi-task prompted training
部分、以及 DeepStruct
的训练集,但由于错误,我们在 MIP
中同时包括了 multi-task prompted training
部分和 zero-shot task transfer
部分,而排除了 DeepStruct
数据集。我们在 23k
步左右修复了这个错误,然后我们的模型继续在正确的数据集版本上训练。
Natural Language Understanding and Generation
:我们采用了来自 PromptSource
的数据集和相应的 prompt
。对于每个数据集中的所有 prompted sample
,我们设置了每个数据集最大 100k
个样本的截断,并将其合并为 MIP
数据集。prompted sample
和数据集的细节在 PromptSource
的 GitHub repo
中提供。
Information Extraction
:基于 DeepStruct
的数据集、以及一个用于信息提取任务的多任务语言模型预训练方法,我们为其部分数据集创建 instructions
和 prompts
(如下表所示)。我们将信息提取任务重新表述为 instruction tuning
格式,以允许 zero-shot generalization
到新的抽取模式。对于每个数据集的所有 prompted sample
,我们设置了每个数据集最大200k
个样本的截断,因为信息提取数据集的比语言理解数据集和语言生成数据集少(指的是集合数量更少,而不是数据集内的样本数更少)。对于 KELM
和 PropBank
数据集,由于它们的原始规模巨大,我们从它们的 prompted example
中各取500k
个样本。
在 MIP
中针对 DeepStruct
的数据和 prompts
:DeepStruct
中所有数据集的 prompts
和 instructions
是由作者手动创建的。每个数据集的介绍、任务描述和完整的 prompts
都附在下面的内容中。为了允许 template infilling
,我们将所有 prompts
写进 Jinja
模板。当一个数据集样本以我们的格式被提供时,Jinja
引擎将把它渲染成带有instructions
的 prompted sample
。
对 GLM-130B
的信息提取能力进行更系统的评估是留给未来工作的,因为这项工作集中在 LLM
的训练和设计细节上。
对话状态跟踪(Dialogue State Tracking
):我们采用 Multiwoz 2.1
对话状态追踪数据集。该数据集被重新表述为两个任务,每个任务有一个相应的 prompt
:
对话状态跟踪:给定关于一组特定的 slots
,要求模型从对话中提取信息,例如,"taxi_arrival_time"
、"destination"
。
槽位填充(slot filling
):模型应填充一个给定的槽,并识别没有答案的情况。
事件抽取(Event Extraction
):我们采用 ACE05
事件提取数据集,遵循 《Entity, relation, and event extraction with contextualized span representations》
中的设置。该数据集被重新表述为有三个 prompts
的两个任务,具体如下:
事件论据提取:给定文本中的 trigger
和其论据角色列表,要求模型从提供的文本中提取论据。
论据识别:给定一个 trigger
和某个论据角色(argument role
),如果该论据存在于所提供的文本中,则要求该模型提取该论据;否则,该模型应不产生任何结果。
联合实体和关系抽取(Joint Entity and Relation Extraction
):联合实体和关系抽取旨在识别一段文本中的命名实体并判断它们之间的关系。它与知识获取(knowledge acquisition
)密切相关,其最终目标是将非结构化的网络内容结构化为知识三元组(例如,"(London, capital_of, Britain)"
)。该任务可以被格式化为一个 pipeline framework
(命名实体识别和关系提取的组合)或端到端的训练。
在这项工作中,我们采用了三个经典的联合实体和关系提取数据集: CoNLL04
、NYT
、以及 ACE2005
。在 GLM-130B
中,我们遵循 《Deepstruct: Pretraining of language models for structure prediction》
将这种挑战格式化为 sequence-to-sequence generation
,其中我们的输入是原始文本,输出是三元组。我们在这里只对这些数据集进行 relation-related
的任务,而将 entity-related
的任务留在命名实体识别部分。
关系抽取(Relation Extraction
):给定一个关系候选列表,在这里我们提取由 "头实体"、"关系 "、"尾实体" 组成的知识三元组。例如,给定输入 "In Kunming the 800-some faculty and student established the National Southwestern Associated University"
,模型输出可能是 (National Southwestern Associated University, location of formation, Kunming)
。
条件关系抽取(Conditional Relation Extraction
):给定单个关系候选(relation candidate
),模型判断输入文本是否包含该关系。如果是,则提取所有相关的三元组;如果不是,则不生成。
知识槽填充(Knowledge Slot Filling
):从文本中指定一个特定的实体,并要求模型提取所有以该实体为头的三元组。
关系分类(Relation Classification
):给定文本中的两个实体,要求模型根据候选关系列表来判断它们之间的关系。
然而,现有的联合实体和关系提取数据集具有最小的关系模式。例如,CoNLL04
只包含五个不同的关系;最多样化的 NYT
数据集包含 24
个 Freebase predicates
。为了让模型能够捕捉到多样化的潜在 verbalized predicates
,我们用来自 KELM
的自动生成的 knowledge-text aligned data
来扩展任务。我们不包括其他 distantly supervised
的数据集(例如,T-Rex
),由于这些数据可能是极其噪音的。
对于KELM
数据,由于它是基于完整的 Wikidata
模式(其中包含太多的关系,无法枚举),我们为关系提取和知识槽填充的任务创建了两个 KELM-specific prompts
。
命名实体识别( Named Entity Recognition:NER
):命名实体识别是一项任务,旨在从原始文本语料库中识别命名实体,并为其分配适当的实体类型。例如,在 In 1916 GM was reincorporated in Detroit as "General Motors Corporation".
这句话中,"通用汽车公司"("General Motors Corporation"
)可能属于 organization
这种实体。
我们根据命名实体识别数据集 CoNLL03
、OntoNotes 5.0
、GENIA
设计了两种不同类型的任务。我们还包括来自联合实体和关系数据集的命名实体识别子任务。
命名实体识别:给定可能的实体类型列表(例如,地点、人、组织),从提供的文本内容中提取所有相关的实体。
实体定型(Entity Typing
):实体定型是命名实体识别的重要衍生任务之一。它的目的是对 entity mention
的正确类型进行分类 ,并经常作为后处理附加在 entity mention extraction
上。
关系分类(Relation Classification
):关系分类是信息提取的一项基本任务,它从两个给定实体之间的候选列表中确定关系。这个问题是一个长期存在的问题,因为它受制于数据标注的巨大成本,因为知识密集型(knowledge-intensive
)任务的人工标注需要受过教育的标注员,而标注员的费用很高。
关系提取中事实上的数据创建方法依赖于 distant supervision
,它自动将 knowledge base
中现有的知识三元组与文本内容相匹配。它假定这种 alignment
在某些条件下是正确的。这里我们只包括 TacRED
数据集,并基于它创建几个不同的任务。
关系分类:最传统的任务表述。给出文本中的两个实体,从一个候选列表中对它们的关系进行分类。该形式可以直接回答关系,也可以以三元组的形式回答(类似于关系提取)。
知识槽填充(Knowledge Slot Filling
):将任务改为,给定头部实体和关系从而确定尾部实体在输入文本中是否存在。如果没有,则不生成任何东西。
Yes or No
问题:把问题变成一个类似于自然语言推理的任务。例如,给定句子 "The series focuses on the life of Carnie Wilson, daughter of Brian Wilson, founder of the Beach Boys."
,模型将被要求通过回答 "是" 或 "否" 来判断 (Carnie Wilson, father, Brian Wilson )
这样的三元组是否正确。
语义角色标注(Semantic Role Labeling
):语义角色标注是一项由来已久的任务,它希望识别与句子中给定谓语(predicate
)相关的语义论据。例如,在 "Grant was employed at IBM for 21 years where she held several executive positions."
这个句子和其中的谓语 "employed"
,语义角色标注将 Grant
作为主语,将 IBM
作为第二宾语。
我们根据语义角色标注数据集 CoNLL05
、CoNLL12
和 PropBank
创建两个不同的任务。
语义角色标注:传统的任务形式,即在文本中注释一个动词(即谓语),要求模型生成相关的语义角色。
语义角色填充:给定一个动词和一个潜在的语义角色,要求模型判断该角色在句子中是否存在并生成它。
谓语识别:给定一个句子的片段及其相应的语义角色,识别它与哪个动词有关。
Big-Bench-Lite
评估:最近的工作显示,LLM
有能力进行超越传统语言任务的 reasoning
。作为回应,BIG-bench
最近通过从全球研究人员那里众包新型的任务来测试 LLM
的新能力。出于经济上的考虑,我们在原 150
个任务的 BIG-bench
的一个官方子集上评估 GLM-130B
,即有 24
个任务的 BIG-bench-lite
。这些任务可以分为两类:一类是基于带有答案选项的多选题问答任务,另一类是不带答案选项的答案直接生成任务。对于第一类,我们评估每个选项的完整内容的概率,并挑选概率最大的选项作为答案;对于第二类,我们使用贪婪解码来生成答案。在BIG-bench
中进行的所有评估都是基于 [MASK]
,因为这里的答案通常是短文。在 24
个 BIG-bench-lite
数据集上的三个 LLM
的所有结果都显示在下表和下图。我们采用了 BIG-bench
的原始 prompt
,并使用官方的实现来生成启动样本( priming example
)用于 few-shot
评估和计算最终得分。
MMLU
评估:下表中显示了 GLM-130B
和 BLOOM 176B
的 57
个 MMLU
数据集的所有结果。在前面内容中,我们报告了 GLM-130B
、GPT-3 175B
和 BLOOM 176B
的加权平均准确率(即每个样本的准确率平均值),遵循原始的 benchmark setting
。 下面是一个具有 1-shot priming
的 prompted example
。我们预测 next token
为 ['A', 'B', 'C', 'D']
的概率,并将概率最大的 token
作为答案。
xThe following are multiple choice questions about philosophy.
According to d'Holbach, people always act according to _____.
(A) free choices (B) dictates of the soul (C) necessary natural laws (D) undetermined will
Answer: (C) necessary natural laws
Epicurus holds that philosophy is:
(A) not suitable for the young. (B) not suitable for the old. (C) important, but unpleasant. (D) none of the above.
Answer: (
Language Modeling
评估:
LAMBADA
:我们遵循 GPT-2
中的评估设置,利用 stop-word filter
从而选择出得分最大的 valid final word prediction
作为我们的答案。我们使用 beam size = 16
的 beam search
解码策略,最大 generation
长度限制为 5
。遵从 《The lambada dataset:Word prediction requiring a broad discourse context》
的要求,我们预测的 final word
是一个自然的英语单词(即可能由多个 token
组成),而不是单个 GLM-130B token
。最后,我们用字符串匹配来判断正确性。
Pile
:Pile
是一个全面的语言建模 benchmark
,最初包括来自不同领域的 22
个不同文本数据集。我们在 18
个数据集的一部分上报告了我们的结果,《Jurassic-1: Technical details and evaluation》
报告了 baseline
的结果。与传统的语言建模基准不同,Pile
评估报告了 bits-per-byte: BPB
的困惑度,以避免不同词表的模型之间的不匹配比较。因为一般而言,如果不加以限制,具有较大词表的语言模型在困惑度比较中会受到青睐。在评估中,我们严格遵循 《The pile: An 800gb dataset of diverse text for language modeling》
中的 setting
,利用 [gMASK]
和具有双向注意力的 1024
长的上下文,剩余的 1024
个 token
以自回归方式计算 BBP
。加权平均 BBP
是根据每个共享数据集在 Pile
训练集中的比例计算的。
下表中报告了 Pile
测试集的详细指标。我们观察到,与 GPT-3
相比,GLM-130B
在 phil_papers
和 pile_cc
上的表现明显较弱,这可能是由于 GLM-130B
的双语特性、以及缺乏更多样化和高质量的私有语料库。
中文理解评估:在此,我们阐述了我们用于 CLUE
和 FewCLUE
评估的 prompts
。在中文数据集中,提示遇到了一些挑战,因为中文文本是由单个字符而不是单词组织的,在许多情况下导致 verbalizers
的长度不等。尽管针对数据集的校准可以帮助缓解这一问题,但过于具体的技术在实施中会很复杂。我们在本文中的评估采用了一种更容易解决的方法,利用 GLM-130B
的独特功能。由于GLM-130B
是一个带有英文 MIP
的双语 LLM
,我们采用了 《Promptsource: An integrated development environment and repository for natural language prompts》
的类似任务中的英文的 prompts
和 verbalizers
来进行中文数据集的评估,并发现这些策略相当有效。在评估指标方面,除了 DRCD
和 CMRC2018
这两个问答数据集报告了 EM
,其他数据集报告了准确率。
本文介绍了一个具有 130B
参数的开放式双语预训练语言模型。目前,大多数拥有超过 100B
参数的预训练语言模型被政府和大公司所私有。其中少数的政府或大公司提供了有限的付费的 inference API
。相比之下,GLM-130B
的权重和代码向任何对 LLM
感兴趣的人开放。此外,我们通过 speed-up implementation
和 INT4
量化,大大降低了推理的硬件要求。这篇论文可以对研究界、个人开发者、小公司和社会产生更广泛的影响。
对人工智能研究的影响:大多数研究机构无法承担预训练大型语言模型的巨大成本。因此,除了政府和大公司的雇员之外,大多数研究人员只能通过付费来使用有限的 inference API
。通过 inference API
,研究人员只能把模型的输出作为黑盒子来分析,这限制了潜在工作的范围。通过 GLM-130B
,研究人员可以分析与特定输入相对应的模型参数和内部状态,从而对 LLM
的理论、能力和缺陷进行深入研究。研究人员还可以修改模型结构和权重,以验证所提出的算法,从而改进 LLM
。
通过 INT4
量化,GLM-130B
可以在流行的 GPU
上进行推理,如 4
个 RTX 3090
或 8
个 RTX 2080 Ti
,这可以很容易地从云服务中获得。因此,买不起 DGX-A100
等强大的 data-center GPU server
的研究人员也可以利用 GLM-130B
。
对个人开发者和小公司的影响:想要将 LLM
整合到其业务中的个人开发者和小公司只能选择付费 inference API
。增加的成本会阻碍他们的尝试。相反,GLM-130B
可以部署在他们拥有的流行的硬件上,或者可以通过云服务访问,以降低成本。此外,他们可以利用蒸馏技术来获得较小的模型,在他们的特定任务上保持可比的性能。虽然一些开发者可能缺乏自行完成部署和蒸馏的能力,但我们相信随着 GLM-130B
和未来更多开放的 LLM
,相应的工具包和服务提供商,将变得更加可用。
我们还注意到,目前大多数 LLM
应用都是基于 prompt engineering
,部分原因是 inference API
的限制。在下游场景中,如在线客服,公司积累了大量的人类产生的数据,其中包含领域知识。通过开源的权重和代码,开发者可以在他们的数据上对GLM-130B
进行微调,以减轻 domain knowledge
的差距。
环境影响:对大型语言模型的主要关注之一是其巨大的能源使用和相关的碳排放。据估计,GPT-3
使用了 500
吨的碳排放足迹(CO2eq
)。在 60
天的训练过程中,我们总共消耗了 442.4MWh
的电力。考虑到当地电网的 0.5810
公斤/千瓦时的碳效率,预训练释放了 257.01
吨的二氧化碳。这大约是 GPT-3
的碳足迹的一半,可能是由于高效的并行策略和 NVIDIA
的硬件改进。这个碳排放量大约相当于 18
个普通美国人一年的排放量。然而,我们相信随着 GLM-130B
的发布,可以为复制 100B-scale LLM
节省更多的碳排放。
在过去的几年里,围绕自然语言处理的大型语言模型(large language model: LLM
)的研究出现了爆炸性增长,主要是由基于Transformer
的语言模型的令人印象深刻的性能所推动,如 BERT
、GPT-2
、GPT-3
和 T5
。这些研究的最有影响的成果之一是:发现大型语言模型的性能和参数数量呈现可预测的幂律(power law
)关系,其中诸如宽深比( width/depth ratio
)等结构细节在很大范围内对性能的影响很小(《Scaling laws for neural language models》
)。其结果是大量的研究集中在将 Transformer
模型扩展到更大的规模上,从而产生了超过 500B
参数的稠密模型,这是在几年前几乎无法想象的里程碑。
稠密模型指的是类似于
GPT-3
这种,没有采用mixture-of-experts
的模型。
今天,有几十个公开宣布的大型语言模型,最大的 LLM
的参数比 GPT-2
多两个数量级,即使在这个规模,也有近十种不同的模型。然而,这些模型几乎都是受保护的大型组织的知识产权,并且被限制在商业 API
,只能根据 request
来提供使用,或者根本不能供外部人员使用。据我们所知,唯一免费公开的比 GPT-2
更大的稠密的自回归语言模型是 GPT-Neo
( 2.7B
参数)、GPT-J-6B
、Megatron-11B
、Pangu-a-13B
以及最近发布的 FairSeq
模型(2.7B
、6.7B
、13B
参数)。
在论文 《GPT-NeoX-20B: An Open-Source Autoregressive Language Model》
中,作者介绍了 GPT-NeoX-20B
,一个 20B
参数的开源的自回归语言模型。作者通过 permissive license
向公众免费开放模型权重,其动机是相信开放 LLM
对于推动广泛领域的研究至关重要,特别是在人工智能安全、机制上的可解释性、以及研究 LLM
能力如何扩展等方面。LLM
的许多最有趣的能力只有在超过一定数量的参数时才会涌现,而且它们有许多属性根本无法在较小的模型中研究。虽然安全问题经常被作为保持模型权重私有化的理由,但作者认为这不足以防止滥用,而且对于能够获得 SOTA
语言模型的少数组织之外的研究人员来说,这在很大程度上限制了探究和研究 LLM
的能力。此外,作者在整个训练过程中以均匀的 1000
步的间隔提供 partially trained checkpoint
。作者希望通过免费提供在整个训练过程中的广泛的 checkpoint
,从而促进对 LLM
的 training dynamics
的研究,以及上述的人工智能安全性和可解释性等领域的研究。
在研究 GPT-NeoX-20B
的过程中,作者发现了几个值得注意的现象,与已有的文献不一致:
作者在一个包含重复数据的数据集上进行训练,训练超过一个 epoch
,但没有看到性能损失的证据。
虽然 《 Measuring massive multitask language understanding》
声称, few-shot prompting
并不能提高他们任务的性能,但作者发现,这实际上是 GPT-3
特有的现象,并不适用于 GPT-NeoX-20B
或 FairSeq
模型。
最后,作者发现 GPT-NeoX-20B
是一个强大的 few-shot learner
,与规模相当的 GPT-3
模型和 FairSeq
模型相比,从 few-shot examples
中获得的性能提升要大得多。作者看到 GPT-J-6B
也是如此,作者假设这可能是由于 GPT-J-6B
选择了相同的训练数据。
最后,训练和评估代码在 https://github.com/EleutherAI/gpt-neox
上公开,也可以在那里找到下载整个训练过程中模型权重的链接。
GPT-NeoX-20B
是一个 autoregressive transformer decoder model
,其结构基本遵循 GPT-3
的结构,但有一些明显的改变,如下所述。我们的模型有 20B
参数,其中 19.9B
参数是"non-embedding"
参数,《Scaling laws for neural language models》
认为这是用于 scaling laws analysis
的适当数量。我们的模型有 44
层,隐层维度大小为 6144
,有 64
个 head
。
虽然我们的架构与 GPT-3
基本相似,但也有一些明显的区别。在本节中,我们对这些不同之处进行了 high-level
的概述,但请读者参考 GPT-3
的原始论文以了解模型架构的全部细节。我们的模型架构几乎与 GPT-J
相同,但我们选择使用 GPT-3
作为参考,因为没有关于 GPT-J
设计的典型出版物作为参考。
Rotary Positional Embeddings
:我们使用 rotary embedding
(《RoFormer: Enhanced transformer with rotary position embedding》
),而不是 GPT
模型中使用的 learned positional embedding
,这是基于我们之前在训练 LLM
中使用 rotary embedding
的积极的经验。 rotary embedding
是 static relative positional embedding
的一种形式。简而言之,它们扭曲了emebdding
空间,使位置 token
对位置 token
的注意力线性地依赖于
更正式地说,标准的多头注意力方程为:
其中:
token embedding
。
注意:通常而言,通过在
token embedding
上添加positional embedding
从而得到和
query
投影矩阵和 key
投影矩阵。
而 rotary embedding
将这个方程修改为:
其中:block diagonal matrix
),其中第 block
是一个 2D rotation
,旋转角度为
其中,
为绝对位置。
虽然 《RoFormer: Enhanced transformer with rotary position embedding》
将 rotary embedding
应用于整个 embedding
向量,但我们遵从 《GPT-J-6B: A6 billion parameter autoregressive language model》
,而是只将 rotary embedding
应用于 embedding
向量维度的前 25%
。我们的初步实验表明,这在性能和计算效率上取得了最佳平衡。
并行计算 Attention Layer + FF Layer
:我们并行地计算注意力层和前馈层(Feed-Forward: FF
),并将结果相加,而不是串行地运行。这主要是为了提高效率,因为在 op-sharding
的情况下,每个残差加法(residual addition
)都需要在前向传递和后向传递中进行一次 all-reduce
(《Megatron-LM: Training multi-billion parameter language models using model parallelism》
)。通过并行计算 Attention
和 FF
,可以在执行单个 all-reduce
之前对结果进行局部规约(reduce
)。在Mesh Transformer JAX
中,这导致了 15%
的吞吐量增加,同时在训练的早期,与串行地运行它们的损失曲线相当。
由于我们代码中的一个疏忽,我们无意中应用了两个独立的 Layer Norm
,而不是像 GPT-J-6B
那样使用一个 tied layer norm
。 tied layer norm
的方式为:
相反,我们的代码实现为:
不幸的是,这只是在我们训练到很远的时候才注意到,无法重新开始。随后的小规模实验表明,untied layer norm
对性能没有影响,但为了透明性起见,我们还是希望强调这一点。
初始化:对于残差前的 Feed-Forward output layers
,我们使用了 《Mesh-Transformer-JAX: Model parallel implementation of transformer languagemodel with JAX》
中介绍的初始化方案,activation
随着深度和宽度的增加而增长,分子为 2
可以补偿注意力层和前馈层被组织为并行的事实。
对于所有其他层,我们使用 《Transformers without tears: Improving the normalization of self-attention》
的 small init
方案
所有的 Dense
层:虽然 GPT-3
使用 《Generating long sequences with sparse transformers》
介绍的技术交替使用 dense
层和 sparse
层,但我们却选择完全使用 dense
层来降低实现的复杂性。
软件库:我们的模型是使用建立在 Megatron
和 Deep-Speed
基础上的代码库进行训练的,以促进高效和直接地训练具有数百亿个参数的大型语言模型。我们使用官方的 PyTorch v1.10.0
发布的二进制包,用 CUDA 11.1
编译。该软件包与 NCCL 2.10.3
捆绑在一起,从而用于分布式通信。
硬件:我们在 12
台 Supermicro AS-4124GO-NART
服务器上训练 GPT-NeoX-20B
,每台服务器有 8
个 NVIDIA A100-SXM4-40GB GPU
,并配置了两个 AMD EPYC 7532 CPU
。所有的 GPU
都可以通过四个 ConnectX-6 HCA
中的一个直接访问 InfiniBand switched fabric
,从而用于 GPU Direct RDMA
。两个 NVIDIA MQM8700-HS2R
交换机通过 16
条链路连接,构成了这个InfiniBand
网络的主干,每个节点的 CPU socket
有一条链路连接到每个交换机。
下图显示了一个节点的简化概览,该节点为训练而配置。
由于对 20B
参数的模型进行超参数调优的难度很大,我们选择使用 GPT-3
的超参数值来指导我们对超参数的选择。
由于 GPT-3
没有以我们的 20B
规模训练一个模型,我们在他们的 13B
模型和 175B
模型的学习率之间进行插值,得出的学习率为 0.97e-5
。
基于较小的模型上的实验结果,我们选择 0.01
的 weight decay
。
为了达到更高的训练吞吐量,我们选择使用与 GPT-3
的 175B
模型相同的 batch size
:大约 3.15M token
,或者 1538
个上下文其中每个上下文 2048 token
(即,batch size = 1538
,序列长度 2048
),总共训练 150k
步,采用余弦学习率调度从而在训练结束时衰减到原始学习率的 10%
。
我们使用 AdamW
优化器,其中 ZeRO optimizer
来扩展 AdamW
,通过将 optimizer states
切分到各台 worker
机器上从而来减少内存消耗。
由于这种规模的模型权重和优化器状态不适合在单个 GPU
上使用,我们使用 Megatron-LM
介绍的张量并行方案、与 PipeDream
介绍的流水线并行方案相结合,从而在一组 GPU
上分配模型。
为了训练 GPT-NeoX-20B
,我们发现,考虑到我们的硬件设置,分配模型的最有效方式是将张量并行大小设置为 2
、将流水线并行大小设置为 4
。 这允许最密集的通信过程,张量并行、流水线并行发生在一个节点内,而数据并行通信发生在节点边界上。通过这种方式,我们能够实现并保持每个 GPU
的 117 TFLOPS
的效率。
训练数据:GPT-NeoX-20B
是在 Pile
上训练的,这是一个专门为训练大型语言模型而设计的大规模的数据集。它由 22
个数据源的数据组成,粗略地分为 5
个类别:
学术写作: Pubmed Abstracts and PubMed Central
、arXiv
、FreeLaw
、USPTO Backgrounds
、PhilPapers
、NIH Exporter
。
网络爬取和互联网资源:CommonCrawl
、 OpenWebText
、 StackExchange
、 Wikipedia (English)
。
散文: BookCorpus
、Bibliotik
、 Project Gutenberg
。
对话: Youtube subtitles
、Ubuntu IRC
、OpenSubtitles
、Hacker News
、EuroParl
。
其它杂项: GitHub
、DeepMind Mathematics dataset
、Enron Emails
。
总的来说,Pile
数据由超过 825GB
的原始文本数据组成。数据来源的多样性反映了我们对通用语言模型的渴望。某些数据子集被升采样以获得更平衡的数据分布。相比之下,GPT-3
的训练数据包括网络爬取(web-scrape
)数据、books
数据集、Wikipedia
。当把这项工作中的结果与 GPT-3
进行比较时,训练数据几乎肯定是最大的、已知的 unknown factor
。关于 Pile
的全部细节可以在技术报告 《The Pile: An 800GB dataset of diverse text for language modeling》
和相关数据表 《Datasheet for the Pile》
中找到。
特别值得注意的是,Pile
包含了 StackExchange
的爬取,并被预处理成 Q/A
形式。关于微调数据的句法结构对下游性能的影响,有大量的、不断增长的工作。虽然到目前为止还没有专注于 prompted pretraining
的系统工作,但最近的工作 《Neural language models are effective plagiarists》
观察到,Pile
的 StackExchange
子集的格式化( formulation
)似乎严重影响了 code generation
。
Tokenization
:对于 GPT-NeoX-20B
,我们使用了与 GPT-2
类似的 BPE-based tokenizer
,总的词表规模同样为 50257
。
tokenizer
有三个主要变化:
首先,我们在 Pile
的基础上训练一个新的 BPE tokenizer
,利用其不同的文本来源来构建一个更通用的 tokenizer
。
第二,GPT-2 tokenizer
将字符串开始处的 tokenization
视为 non-space-delimited token
。与 GPT-2 tokenizer
相比,GPTNeoX-20B tokenizer
无论如何都要应用一致的 space delimitation
。这解决了关于 tokenization input
的前缀空格符存在与否的不一致问题。 下图中可以看到一个例子。
第三,我们的 tokenizer
包含用于重复空格符的 token
,其中重复空格符的数量从 1
个空格到 24
个空格。这使得 GPT-NeoX-20B tokenizer
能够使用较少的 token
对具有大量空格的文本进行 tokenize
,例如,程序源代码、或 arXiv LATEX
源代码文件。
例如,
NeoX-20B
可以将连续的4
个空格视为一个token
,这在python
代码中经常见到。相比之下,GPT-3
将4
个空格视为四个token
,每个空格一个token
。
GPT-NeoX-20B tokenizer
和 GPT-2 tokenizer
在 50257
个 token
中共享 36938
个,重叠度为 73.5%
。总体而言,GPT-NeoX-20B tokenizer
使用更少的 token
数量来 tokenize
Pile
验证集,但是使用了更多的 token
来 tokennize
C4
数据集。
tokenization
对比的例子(全部的示例参考论文附录):
数据重复:在过去的两年里,训练自回归语言模型时的标准做法是只训练一个 epoch
。最近的研究声称,看到了更进一步地对训练数据去重的好处。特别是,除了 GPT-3
和 Jurassic-1
之外,每个公开的大型语言模型要么使用某种形式的数据去重,要么没有足够详细地讨论训练数据被做了什么处理。
当 Pile
最初被制作时,唯一存在的比 GPT-NeoX-20B
更大的语言模型是 GPT-3
,它对其训练数据的高质量子集进行了升采样。随后 Pile
被发布,由于缺乏大规模消融实验的资源、并且在较小的数据规模上缺乏明显的影响,我们选择按原样使用 Pile
。如下图所示,即使在 20B
的参数规模下,我们也没有看到跨越一个 epoch
边界后,测试损失和验证损失出现恶化。
不幸的是,那些声称从数据去重中看到改进的论文,没有一篇论文发布了证明这一点的 trained models
,这使得复现和确认他们的结果很困难。《Deduplicating training data makes language models better》
发布了他们使用的数据去重的代码,我们打算在未来用它来更详细地探索这个问题。
值得注意的是,即使在 loss
或 task evaluation
方面没有改善,但仍有令人信服的理由为任何投入生产的模型对训练数据去重。具体而言,系统分析表明,在减少训练数据的泄漏方面有很大的好处。
为了评估我们的模型,我们使用 EleutherAI Language Model Evaluation Harness
(《A framework for few-shot language model evaluation》
),这是一个用于语言模型评估的开源代码库,支持许多模型的 API
。由于我们的目标是使一个强大的模型可以公开访问,我们与至少有 10B
个参数可以公开访问的英语语言模型进行比较。我们与 OpenAI API
上的 GPT-3
模型、开源的FairSeq
稠密模型、以及 GPT-J-6B
进行比较。我们不与 T5
或其衍生模型进行比较,因为我们的评估方法假定这些模型是自回归的。虽然有一个已经公开发布的 Megatron-11B checkpoint
,但发布的代码是不能用的,我们也没能让模型运行起来。我们没有与任何 mixture-of-experts: MOE
模型进行比较,因为没有任何公开的 MoE
模型能达到与 10B
参数的稠密模型相当的性能。
GPT-3 API
模型的规模没有得到官方确认,但我们遵循《A framework for few-shot language model evaluation》
,认为 GPT-3
模型的规模为 350M (Ada)
、1.3B (Babbage)
、6.7B (Curie)
和 175B (Da Vinci)
。我们将 GPT-J-6B
和 GPT-NeoX-20B
都归入 GPT-NeoX
模型的范畴,因为这两个模型都是用相同的架构训练的,并且是在同一个数据集上训练的。然而,我们用虚线将它们连接起来,以反映这两个模型不是像 FairSeq
和 GPT-3
模型那样在两个不同的尺度上训练的同一模型,它们是用不同的代码库、不同的 tokenizer
、以及不同数量的 token
来训练的。
我们报告了两个 baseline
:人类水平性能、随机性能。所有的图表都包含代表两个标准差的 error bar
,表明每个点周围的 95%
的置信区间。对于一些图,标准差非常小,以至于区间不明显。
我们在一组不同的 standard language model evaluation dataset
上评估我们的模型。我们将评估数据集为三个主要类别:自然语言任务、基于知识的高级任务、以及数学任务。我们对 GPT-J-6B
、GPT-NeoX-20B
和 FairSeq
模型进行了 zero-shot
和 five-shot
评估,但由于资金限制,只对 GPT-3
模型进行了 zero-shot
评估。由于篇幅限制,这里只展示了一个有代表性的结果子集,其余的在原始论文的附录中。
自然语言任务:我们在一系列不同的 standard language model evaluation dataset
上评估我们的模型:ANLI
、ARC
、HeadQA (English)
、HellaSwag
、LAMBDADA
、LogiQA
、OpenBookQA
、PiQA
、PROST
、QA4MRE
、SciQ
、TriviaQA
、Winogrande
、以及Winograd Schemas Challenge (WSC)
的 SuperGlue
版。
数学任务:解决数学问题是一个在人工智能研究中有着悠久历史的领域,尽管大型语言模型在算术任务、以及用自然语言表述的数学问题上往往表现得相当糟糕。我们对 MATH
测试数据集以及 GPT-3
介绍的数字算术问题进行评估。请注意,MATH
测试数据集通常都会进行微调,但由于计算上的限制,我们在这里只对模型进行 zero-shot
和 five-shot
评估。
基于知识的高级任务:我们还对我们的模型回答事实问题( factual question
)的能力感兴趣,这种事实问题需要高级知识。为了做到这一点,我们使用了 《Measuring massive multitask language understanding》
开发的各种不同领域的选择题数据集。按照这个数据集的通常做法,我们聚焦于按学科领域聚合的结果: 如下图所示,包括人文、社会科学、STEM
和杂项。我们从 《Measuring massive multitask language understanding》
的 five-shot GPT-3
结果出发,报告了 five-shot
的性能,以便与以前的工作相比较。
自然语言任务的结果:虽然 GPT-NeoX-20B
在某些任务(如 ARC
、LAMBADA
、PIQA
、PROST
)上优于 FairSeq 13B
,但在其他任务(如 HellaSwag
、LogiQA
的 zero-shot
)上表现不佳。总的来说,在我们所做的 32
项评估中,我们在 22
项任务中表现优异,在 4
项任务中表现不佳,在 6
项任务中处于误差范围之内。
到目前为止,我们最弱的表现是在 HellaSwag
上,在 zero-shot
和 five-shot
的评估中,我们的得分都比 FairSeq 13B
低四个标准差。同样,GPT-J
在 HellaSwag
上的表现在 zero-shot
中比 FairSeq 6.7B
低三个标准差,在 five-shot
中低六个标准差。我们发现这种巨大的性能损失在很大程度上是无法解释的;虽然我们最初认为 Pile
中大量的非散文的数据子集是罪魁祸首,但我们注意到 GPT-J
和 GPT-NeoX
在非常相似的 Lambada
任务上比FairSeq
模型的性能要好得多,而且差距大致相同。
数学:虽然 GPT-3
和 FairSeq
模型在算术任务上的表现通常相当接近,但它们的表现一直被 GPT-J
和 GPT-NeoX
所超越。我们猜测,这可以追溯到训练数据中普遍存在的数学方程,但我们警告说,人们不应该认为这意味着在 Pile
上训练会产生更好的 out-of-distribution
的算术推理。《Impact of pretraining term frequencies on few-shot reasoning》
表明,Pile
中的数学方程的频率与 GPT-J
在该方程上的表现有很强的相关性,我们认为这在 GPT-NeoX 20B
、FairSeq
和 GPT-3
中没有理由不存在。遗憾的是,我们无法研究 FairSeq
和 GPT-3
模型中的这种效应,因为作者没有公布他们的训练数据。
基于知识的高级任务:虽然 GPT-NeoX
和 FairSeq
模型在 five-shot
的情况下,与 GPT-3
相比,在 MMLU
上都表现出优势的性能(Figure 7
),但在 zero-shot
的情况下,它们的性能要接近很多( 原始论文附录中的Table 10 ~ 13
)。《Measuring mathematical problem solving with the MATH dataset》
声称发现,相对于 zero-shot
, few-shot
并不能提高性能,但他们只研究了 GPT-3
。相比之下,我们发现 GPT-NeoX
和 FairSeq
模型在只有 5
个样本的情况下确实有很大的改善。我们认为这是一个警告,不要只根据一个模型得出关于评价指标的强烈结论,并鼓励研究人员开发新的 evaluation benchmark
从而利用多个不同类别的模型,以避免将他们的结论过度适用于一个特定的模型。
强大的 Few-Shot Learning
:我们的实验表明,GPT-J-6B
和 GPT-NeoX-20B
从 fews-hot
评估中获得的好处大大超过 FairSeq
模型。当从 0-shot
评估到 5-shot
评估时,GPT-J-6B
提高了 0.0526
,GPT-NeoX-20B
提高了 0.0598
,而 FairSeq 6.7B
和 13B
模型分别提高了 0.0051
和 0.0183
。这一结果在统计学上是显著的,并且对 prompting
的扰动是鲁棒的。虽然我们目前对此没有特别的解释,但我们认为这是对我们模型的强烈推荐。虽然由于资金限制,我们没有对 GPT-3
进行系统的 five-shot
评估,但 Table 10 ~ 13
(参考原始论文中的附录)和 Figure 7
中显示的性能变化进一步支持了 GPT-J-6B
和 GPT-NeoX-20B
能够从 five-shot examples
中获得明显的收益的说法。
局限性:
训练的最佳超参数:超参数调优是一个昂贵的过程,对于几十亿参数的模型来说,全面进行调优往往是不可行的。由于上述局限性,我们选择了根据较小规模的实验、以及根据以前发表的工作( GPT-3
)的超参数的插值(针对我们的模型规模),从而选择超参数。然而,我们的模型架构和 training setup
的几个方面(包括数据和 tokenizer
),都与 GPT-3
有很大分歧。因此,几乎可以肯定的是,我们的模型所使用的超参数不再是最佳的,而且有可能从来都不是最佳的。
缺乏 Coding Evaluation
:在这个模型的开发过程中,我们做出的许多设计选择都是为了提高 coding task
的性能。然而,我们低估了现有 coding benchmark
(《Evaluating large language models trained on code》
)的难度和成本,因此无法在该领域评估模型。我们希望在未来能做到这一点。
Data Duplication
:最后,缺乏数据去重也可能对下游性能产生影响。最近的工作表明,训练数据的去重会对困惑度产生很大影响(《Deduplicating training data makes language models better》
)。虽然我们的实验没有显示出这种迹象,但由于有很多研究者发现了相反的结果,所以很难否定数据去重。
发布一个 20B
参数的 LLM
:目前的研究现状是,大型语言模型只是人们训练和发表文章的东西,但并没有实际发布。据我们所知,GPT-NeoX-20B
是有史以来公开发布的最大、性能最强的稠密语言模型。各个团体对不发布大型语言模型提出了各种理由,但最主要的理由是:宣称公众对 LLM
的访问会造成伤害。
发布这个模型是我们让研究人员广泛使用 GPT-NeoX-20B
的工作的开始,而不是结束。由于模型的大小,在两个 RTX 3090Ti
或单个 A6000 GPU
上进行推理是最经济的,而微调需要明显更多的计算。真正促进 LLM
的广泛使用意味着除了模型本身之外,还要促进 computing infrastructure
的广泛使用。我们计划通过继续努力降低我们模型的推理成本,以及与研究人员合作,提供他们在我们的模型上进行实验所需的 computing infrastructure
,从而在这个问题上取得进展。我们强烈鼓励那些对研究 GPT-NeoX-20B
感兴趣、但缺乏必要的 infrastructure
的研究人员主动与我们联系,讨论我们如何为你助力。
pretrained language model
已经成为现代自然语言处理 pipeline
的基石,因为它们经常从较小数量的标记数据中产生更好的性能。ELMo
、ULMFiT
、GPT
、以及 BERT
的发展导致了 pretrained model
的广泛使用,并且作为初始化从而用于下游任务的微调。随后发现,pretrained language model
可以在没有任何额外训练的情况下执行有用的任务,这进一步证明了pretrained language model
的效用。此外,根据经验观察,语言模型的性能往往随着模型的变大而增加(有时是可预测的、有时是突然的),这导致了 scaling
的增加趋势。除了环境问题,训练大型语言模型(large language model: LLM
)的成本只有资源丰富的组织才能承受。此外,直到最近,大多数 LLM
都没有公开发布。因此,学术界的大多数人都被排除在 LLM
的发展之外。这种排斥产生了具体的后果;例如,大多数 LLM
主要是在英文文本上进行训练。
为了解决这些问题,论文 《BLOOM: A 176B-Parameter Open-Access Multilingual Language Model》
提出了 BigScience Large Open-science Open-access Multilingual Language Model: BLOOM
。BLOOM
是一个在 46
种自然语言和 13
种编程语言上训练的 176B
参数的语言模型,是由数百名研究人员合作开发并发布的。训练BLOOM
的算力是通过法国 GENCI
和 IDRIS
的公共拨款提供的,利用 IDRIS
的 Jean Zay
超级计算机。为了建立 BLOOM
,论文对它的每个组成部分都进行了彻底的设计,包括训练数据集、模型结构和训练目标、以及分布式学习的工程策略。论文还对该模型的能力进行了分析。论文的总体目标不仅是公开发布一个大规模的多语种语言模型,其性能可与最近开发的系统相媲美,而且还记录了其开发过程中的协调过程( coordinated process
)。本文的目的是对这些设计步骤提供一个 high-level
的概述,同时参考作者在开发 BLOOM
的过程中产生的个别报告。
语言建模:语言建模指的是对文本中的 token
序列的概率进行建模的任务,其中 token
是文本的一个单位(如单词、子词、字符或字节等)。在这项工作中(以及目前大多数语言建模的应用中),我们对文本中的 token
的联合概率建模为:
其中:token
的序列,token
,token
序列。
这种方法被称为自回归语言建模,可以被看作是反复预测 next token
的概率。
早期的语言模型:语言模型在 NLP
中的应用有很长的历史。早期的语言模型主要是 n-gram
模型,它根据一个长度为 token
序列在训练语料库中出现的次数来估计该序列的概率。在实践中,n-gram
模型面临两个主要问题:
首先,随着
其次,对于未出现在训练数据中的 token
序列,模型没有直接的方法来计算该序列的概率。
在这些问题上的进展使得 n-gram
模型在 NLP
的大多数领域得到了广泛的应用。
神经语言模型:神经语言模型是 n-gram
模型的替代,最早由 《Natural language processing with modular pdp networks and distributed lexicon》
以及 《Sequential neural text compression》
提出,后来由 《A neural probabilistic language model》
推广。神经语言模型使用一个神经网络来估计在给定 prior tokens
的条件下预测 next token
的概率。
虽然早期的工作使用了具有固定长度历史窗口的前馈神经网络,但 《Recurrent neural network based language model》
、《Generating text with recurrent neural networks》
、《Generating sequences with recurrent neural networks》
提议使用递归神经网络,并发现这大大改善了性能。
最近,基于 Transformer
架构的语言模型(《Attention is all you need》
)被证明比递归神经网络更有效。因此,Transformer
已经成为语言模型的事实选择。
迁移学习:随着使用神经网络的语言建模的进展,NLP pipeline
已经越来越多地采用迁移学习的框架。在迁移学习中,一个模型的参数首先在一个数据丰富的任务上进行预训练,然后再在一个下游任务上进行微调。
历史上常见的获得 pretrained
参数的方法是词向量(《Distributed representations of words and phrases and their compositionality》
),通过训练使共同出现的单词之间的词向量的内积很大。
然而,《Deep contextualized word representations》
、《Universal language model fine-tuning for text classification》
、《Improving language understanding by generative pre-training》
、《BERT: Pre-training of deep bidirectional transformers for language understanding》
的后续工作表明,《Natural language processing (almost) from scratch》
的框架,即整个模型在被微调之前进行预训练,可以达到更强的性能。
具体而言, GPT
、BERT
展示了使用 pretrained Transformer
语言模型的强大结果,促使人们在逐步完善的模型上开展工作(RoBERTa, XLNet, BART, T5, ERNIE
等等)。
Few-Shot/Zero-Shot Learning
:虽然对 pretrained
模型进行微调仍然是在有限的标记数据下获得高性能的有效方法,但并行推进的工作表明,pretrained
语言模型可以被诱导执行任务,而不需要任何后续的训练。
在 《A neural conversational model》
在一个神经对话模型中观察到有限的 task-performing
行为后, GPT-2
后来证明,基于 Transformer
的语言模型在从网络上爬取的文本上进行训练,可以在不同程度上执行各种任务。
值得注意的是, GPT-2
发现,性能随着模型规模的扩大而提高,从而激发了描述(《Scaling laws for neural language models》
、《Training compute-optimal large language models》
)和利用scale
的效益的工作(Megatron-LM
、GPT-3
、Megatron-Turing
、Palm
、Gopher
、Ernie 3.0 Titan
、PanGu-alpha
、OPT
)。这种方法成功的一个主要因素是 task-specific
样本在馈入模型时的格式化方式。
GPT-3
推广了设计 prompt
的想法,即提供任务的自然语言描述,同时允许输入一些 input-output behavior
的 demo
。
LLM
发展的社会局限性:虽然大型语言模型的大小持续地增加,使其在广泛的任务中得到改善,但也加剧了其开发和使用的问题(《On the dangers of stochastic parrots: Can language models be too big?》
)。
大型模型的计算费用也使学术界的大多数人无法参与其开发、评估和常规使用。
此外,计算成本也导致了对大型语言模型的训练和使用所产生的碳足迹(carbon footprint
)的担忧,现有的碳足迹研究可能低估了排放。促进全球碳足迹的增加会加剧气候变化,对已经被边缘化的社群产生最严重的影响。
此外,资源集中在少数(通常是工业)机构(主要是技术专家),阻碍了对该技术的包容性、协作性和可靠性的管理:
首先,由行业从业人员推动的关于技术的公共叙事会导致对其使用的适宜性产生夸大的期望,导致研究和政策优先级的错位,并可能在例如医疗应用中造成可怕的后果。
其次,在一个以技术为媒介的世界里,技术发展的各个阶段的选择最终都会影响人们的生活,其影响方式最接近于法规的影响,尽管在这个过程中没有同样明确的利益相关者。当开发工作以优先考虑内部定义的性能,而不是对社会的影响为指导时,开发者的价值就会被强调,而不是直接用户和间接用户的价值。尽管让这种技术由企业单方面开发会带来巨大的社会危险,但 EleutherAI
是中国以外唯一一个在 BigScience Workshop
召开之前就在开发大型语言模型的非企业实体。
BigScience
:
参与者: BLOOM
的发展是由 BigScience
协调的。 BigScience
是一个开放的研究协同,其目标是公开发布一个 LLM
。该项目是在获得 GENCI
在其 IDRIS/CNRS
的 Jean Zay
超级计算机上的算力资助后开始的。它最初是围绕着 Hugging Face
和法国NLP
社区(创始成员)的共同努力而建立的,并迅速开放,发展成为一个更广泛的国际合作,以支持其语言的、地理的、以及科学的多样性的目标。最终,超过 1200
人注册成为 BigScience
的参与者,并被允许进入其交流群。他们不仅有机器学习和计算机科学的背景,也有语言学、统计学、社会文化人类学、哲学、法律和其他领域的背景。在这些人中,有数百人直接为该项目发布的工件(artifact
)之一做出了贡献。虽然最多的参与者最终来自于美国,但也有 38
个国家的代表。
组织: BigScience
所解决的一系列相关研究问题,反映在项目的工作小组组织中。每个工作小组由不同程度的参与者组成,包括主席(主席的作用是围绕整个项目的特定方面进行自我组织)。重要的是,我们鼓励参与者加入一个以上的工作小组,以分享经验和信息,这就形成了下图中的 30
个工作小组。大多数工作组的工作重点是与 BLOOM
的开发直接相关的任务。此外,有几个小组专注于对 LLM
的评估和特定领域的数据集开发,如生物医学文本、历史文本。 《BigScience: A case study in the social construction of a multilingual large language model》
对这一倡议背后的动机、其历史和一些经验教训进行了更大的概述。
BigScience
中的伦理考虑:为了承认并开始解决 BigScience
中 LLM
的社会局限性,研讨会依靠合作设计的道德宪章(Ethical Charter
)和对美国以外的司法管辖区的适用法规的原始研究来指导整个项目的选择。具体而言,宪章强调了包容性和多样性、开放性和可复制性、以及组织的各方面的责任等价值观。在项目的数据集整理、建模、工程、评估、以及其他社会影响(贯穿始终)方面,这些价值观都以不同的方式展示出来。
BLOOM
在 ROOTS
语料库上进行了训练,该语料库是 498
个 Hugging Face datasets
的综合体,大约 1.61 T
的文本,涵盖了46
种自然语言和 13
种编程语言。该数据集的 high-level
概览可见于 Figure 3
,而每一种语言及其 linguistic genus
、族、以及宏观领域的详细列表则见于 Table 1
。除了语料库本身,这个过程还导致了一些组织工具和技术工具的开发和发布,包括 Figure 2
中所示的工具。本节的其余部分将通过提供编制语料库所采取的步骤的简要总结,从而说明这些努力的背景。更详细的关于整个数据集策划过程及其结果,我们请读者参考 《The BigScience ROOTS corpus:A 1.6TB composite multilingual dataset》
。
Figure 3
:左图中,每个方框代表一种语言,方块大小代表语言规模的占比(字节数);右图中,在大约三万个文件中,十三种编程语言的文件数量占比。
动机:背景知识中提到的开发者和技术的使用者(自愿的或非自愿的)之间的脱节,在数据集的策划工作中尤为明显。这些数据集支持最近的大型机器学习项目。而在这些项目中,有意(intentional
)的数据工作通常被低估。在 LLM
的背景下,这种趋势体现在一系列基于启发式的过滤方法上,这些方法优先考虑以尽可能少的成本获得尽可能多的高质量数据,而不是考虑数据主体(data subject
)的需求和权利,其中质量通常被定义为在下游任务中最大化性能,同时偶尔删除开发人员认为冒犯性的内容。
虽然这些方法确实以相对较少的人力产生了 TB
级的数据,但将源材料(如 CommonCrawl dumps
)的 bias
与过滤方法的 bias
相结合,往往会导致边缘化人群(marginalized population
)的负面结果。
在一个案例中,使用 block list
来删除色情文本被证明也抑制了语料库中的 LGBTQ+
和非裔美国人英语(African American English: AAE
)文本(《Documenting large webtext corpora: Acase study on the colossal clean crawled corpus》
)。
在另一个项目中,使用 Reddit
的外链作为种子语料库的质量指标(GPT-2
),导致 trained model
在其输出中隐含地优先考虑以美国为中心的观点(《The ghost in the machine has an american accent: value conflict in gpt-3》
)。
在另一个项目中,一个依靠机器学习的 image-text alignment model
的过滤方法,被证明在创建的多模态数据集中加剧了其偏见(《Multimodal datasets: misogyny, pornography, and malignant stereotypes》
)。
此外,这种抽象的数据策划方法导致了难以有意义地归档、以及事后治理的语料库,因为个别 item
的出处和 authorship
通常会在这个过程中丢失。尽管像 《The pile: An 800gb dataset of diverse text for language modeling》
这样的工作将先前记录的 individual sources
的 compilations
置于被抓取的数据之上,为解决这些问题迈出了一步(《Datasheet for the pile》
)。
在 BigScience workshop
的背景下,根据其道德宪章,我们的目标是在数据策划和归档过程中优先考虑人类的参与、当地的专业知识、以及语言知识,如以下各节所述。
数据治理:大型文本语料库包括关于人的文本和由人创造的文本,人是数据主体。不同的人和机构可能在法律上拥有这些数据,使他们成为数据权利人(rights-holder
)。随着机器学习开发者将这些数据收集并整理成越来越大的数据集从而支持训练更大的模型,开发新的方法来考虑所有相关方的利益变得越来越重要,这些相关方包括开发者、数据主体、以及数据权利人。
BigScience
的努力旨在通过一个结合技术、法律和社会学专业知识的多学科视角来满足这些需求。该小组在两个不同的时间范围内专注于两个相互关联的主要目标:
设计一个结构用于长期的国际数据治理(该数据治理有限考虑数据权利人的代理权)。
具体建议用于处理直接用于 BigScience
项目的数据。
《Data governance in the age of large-scale data-driven language technology》
的工作中介绍了第一个目标的进展,该工作进一步激发了数据治理的需求和要求,并概述了数据保管人(custodian
)、权利人和其他各方之间的 network
所需的结构,以适当地治理共享数据。这些行为者之间的互动旨在考虑数据和算法主体的隐私、知识产权和用户权利,其方式旨在优先考虑当地的知识、以及指导价值的 expression
。特别是,这种方法依赖于数据提供者和data host
之间的结构化协议,这些协议规定了数据可用于什么。
虽然我们没能在项目启动和模型训练之间的相对较短的时间内完全建立起一个国际组织,但我们主要通过以下方式努力整合这方面的经验教训(反过来说,也是为了适应我们遇到的实际问题):
首先,只要有可能,我们就从特定的提供者那里寻求明确的许可来使用 BigScience
背景下的数据(例如 《S2ORC: The semantic scholar open research corpus》
的 S2ORC
语料库,或者法国《世界报》的文章)。
其次,在预处理的最后阶段之前,我们将各个数据源分开,以保持可追溯性,并根据其特定上下文的需要处理每一个数据源。
再次,我们对构成整个语料库的各种数据源采取 composite release
的方式,以促进可重复性和后续研究,同时尊重这些 source-dependent
的需求。
可视化和访问 ROOTS
语料库的资源可以在 Hugging Face Hub
的 BigScience Data
组织上找到。该组织拥有几个 demo
(或 Space
),可以用来深入了解整个语料库,以及直接访问( 498
个中的)223
个 components
。考虑到它们的许可状态、隐私风险以及与原始保管人的协议,我们能够分发这些components
。
最后,由于我们知道未来对 BLOOM
模型的调研可能需要对整个语料库的完全访问,我们也邀请有相关研究项目的研究人员通过注册表格加入正在进行的数据分析工作。
数据源:给定数据治理的策略,下一步是确定训练语料库的构成。这个阶段是由几个目标驱动的,这些目标有时会有内在的竞争。其中一些竞争包括:建立一个世界上尽可能多的人可以使用的语言模型,同时只包括一些语言(在这些语言上,我们足够专业从而策划一个与以前数据集规模相当的数据集),同时提高文档的标准并尊重数据主体和算法主体的权利。
语言的选择:这些考虑导致我们采用了一个渐进的过程来选择哪些语言将被纳入语料库。我们首先列出了世界上使用人数最多的八种语言,在项目的早期阶段,我们对这些语言进行了积极的宣传,邀请流利地使用该语言的人加入数据工作。然后,根据语言社区的建议(《Participatory research for low-resourced machine translation: A case study inafrican languages》
),我们将最初选择的斯瓦希里语(Swahili
)扩大到尼日尔-刚果语(Niger-Congo
)语言类别,将印地语(Hindi
)和乌尔都语(Urdu
)扩大到印度语系(Indic
)语言。最后,我们提议,对于另一些语言,如果任何由 3
名或更多精通该语言的参与者组成的小组,如果他们愿意承诺选择数据源并指导处理过程,就可以将该语言添加到支持的列表中,以避免通过自动语言识别选择的语料库在没有特定语言专业知识的情况下出现常见问题(《Quality at a glance: An audit of web-crawled multilingual datasets》
)。
数据源选择:语料库的最大部分是由研讨会的参与者和研究集体策划的,他们共同编制了 BigScience Catalogue
目录:一个涵盖各种语言的 processed
和 non-processed
的数据源的大清单。这采取了由Machine Learning Tokyo
、Masakhane
和LatinX in AI
等社区共同组织的 hackathons
的形式。作为对这些努力的补充,其他工作组的参与者编制了 language-specific resource
,如专注于阿拉伯语的 Masader repository
。通过这种自下而上的方法,总共确定了 252
个数据源,每个语言类别至少有 21
个数据源。此外,为了增加我们的西班牙文、中文、法文和英文等数据源的geographic coverage
,参与者通过 pseudocrawl
(一种从通用 Common Crawl
快照中获取这些网站的方法)确定了他们语言中的本地相关网站,以添加到语料库中。
GitHub Code
:该目录进一步补充了从谷歌 BigQuery
上的 GitHub
数据集合中收集到的编程语言数据集,然后对 exact matches
的数据进行了去重。对语言的选择反映了 《Competition-level code generation with AlphaCode》
为训练AlphaCode
模型所做的设计选择。
OSCAR
: 为了不偏离使用互联网作为预训练数据来源的标准研究实践(GPT-1
、T5
),同时也为了满足我们在 BLOOM
大小下的计算预算的数据量需求,我们进一步从 OSCAR 21.09
版本中获取数据,对应于 2021
年 2
月的 Common Crawl
快照,最终占到语料库的 38%
。
数据预处理:在确定 source
后,数据处理过程涉及几个步骤来处理 data curation
的多个方面。下图中可以看到构建 ROOTS
的总体视图和 processing pipeline
。这个过程中开发的所有工具都可以在 GitHub
上找到。
获取源数据:第一步是获取前面所确定的所有文本数据源的数据,这包括从各种格式的 NLP
数据集中下载和提取文本字段(包括如问答数据集、摘要数据集、或对话数据集),从压缩文件(如法国的科学文章 repository
)爬取和处理大量的 PDF
文件,以及大量网站中提取和预处理文本(这些网站包括:从目录中的 192
个网站、数据工作组成员选择的另一批地域多样化的 456
个网站的集合)。 后者需要开发新的工具,从 Common Crawl WARC
文件中的 HTML
中提取文本,我们在 main data preparation repository
中提供了这些文件。 我们能够从 539
个网站的所有 URL
中找到并提取可用的文本数据。
192 + 456 = 548
,这里的539
说明作者对所有的网站进行了一些过滤处理。
质量过滤:在获得文本后,我们发现大多数数据源包含一些非自然语言的文本,例如 preprocessing error
、SEO
页面、或垃圾邮件(包括色情垃圾邮件)。为了过滤非自然语言,我们定义了一套质量指标,其中高质量的文本被定义为由人类为人类所写(written by humans for humans
),没有内容的区别(因为我们希望内容选择完全是由更负责任的 human source selection
的领域)或先验的语法判断。完整的指标列表见 《The BigScience ROOTS corpus:A 1.6TB composite multilingual dataset》
。重要的是,这些指标主要以两种方式适应每个数据源的需要。
首先,他们的参数,如阈值和支持的 term list
,是由 fluent speakers
为每种语言单独选择的。
其次,我们手动检查了每个数据源,以确定哪些指标最有可能识别非自然语言。
这两个过程都得到了工具的支持,以使其影响可视化。
数据去重和隐私再加工:最后,我们通过两个重复去重步骤删除了近乎重复的文件,并编辑了我们可以从语料库的 OSCAR
版本中识别的个人身份信息(如 social security number: SSN
),因为它被认为是呈现最高隐私风险的来源,这促使我们应用 regrex-based
的再加工,即使在正则表达式有一些假阳性的情况下。
Prompted Dataset
:multitask prompted finetuning
(也被称为 instruction tuning
)涉及在 training mixture
上微调 pretrained language model
,其中这个 training mixture
由自然语言 prompts
指定的一组大的不同的任务所组成。T0
(作为BigScience
的一部分开发)表明,在 prompted datasets
的 multitask mixture
上进行微调的语言模型具有很强的 zero-shot task generalization
能力。此外,T0
被证明优于那些大一个数量级但没有经过这种微调的语言模型。在这些结果的激励下,我们探索了使用现有的自然语言数据集来进行 multitask prompted finetuning
。
T0
是在 Public Pool of Prompts: P3
的一个子集上训练的,P3
是各种现有的和开源的英语自然语言数据集的 prompts
的集合。这个prompts
集合是通过一系列涉及 BigScience collaborators
的 hackathons
活动创建的, hackathons
参与者为 170
多个数据集编写了总共 2000
多个 prompts
。P3
中的数据集涵盖了各种自然语言任务,包括情感分析、问答、以及自然语言推理,不包括有害内容或非自然语言(如编程语言)。PromptSource
是一个开源工具包(也作为 BigScience
的一部分开发),为创建、共享、以及使用自然语言 prompts
提供了便利。收集过程的全部细节在(《Multitask prompted training enables zero-shot task generalization》
、《PromptSource: An integrated development environment and repository for natural language prompts》
)中给出。
在对 BLOOM
进行预训练后,我们应用同样的大规模多任务微调配方(recipe
),使 BLOOM
具备多语言 zero-shot task generalization
能力。我们将得到的模型称为BLOOMZ
。为了训练 BLOOMZ
,我们对 P3
进行了扩展,以包括除英语以外的新语言数据集和新任务,如翻译。这就产生了 xP3
,一个涵盖 46
种语言和 16
项任务的 83
个数据集的 prompts
集合。如下图所示,xP3
反映了 ROOTS
的语言分布。xP3
中的任务既有跨语言的(如翻译),也有单语言的(如摘要、问答)。我们使用PromptSource
来收集这些 prompts
,为 prompts
添加额外的 metadata
,如 input language
和 target language
。为了研究多语言 prompts
的重要性,我们还将 xP3
中的 English prompts
用机器翻译成相应的语言,以产生一个名为 xP3mt
的集合。关于 xP3
和 xP3mt
的 prompt collection
的进一步细节,见 《Crosslingual generalization through multitask finetuning》
。
这里讨论了我们的设计方法和 BLOOM
模型的架构。深入的研究和实验可以在 《What language model to train if you have one million GPU hours?》
和 《What language model architecture and pretraining objective works best for zero-shot generalization?》
找到。我们首先回顾了我们的设计方法,然后激励我们选择训练一个 causal decoder-only
的模型。最后,我们论证了我们的模型结构偏离标准做法的方式。
设计方法:所有可能的架构的设计空间是巨大的,使详尽的探索成为不可能。一种选择是完全复制现有大型语言模型的架构。另一方面,大量关于改进现有架构的工作相对来说很少被采用(《Do transformer modifications transfer across implementations and applications?》
);采用其中的一些推荐做法可以产生一个明显更好的模型。我们采取中间立场,关注如下的模型系列:已经被证明 scale well
,并且在公开可用的工具和代码库中有合理支持。我们对模型的组件和超参数进行消融分析,以寻求对我们的 final compute budget
的最佳利用。
消融分析的实验设计:LLM
的主要吸引力之一是它们以 zero-shot/few-shot
的方式执行任务的能力:足够大的模型可以简单地从上下文指令和例子中执行新的任务(GPT-2
),而不需要在监督样本上进行专门的训练。因此,由于对 100B+
的模型进行微调是不容易的,我们把对架构决策的评估集中在 zero-shot generalization
上,而不考虑迁移学习。
具体来说,我们在不同的任务集合上测量了 zero-shot
性能:来自 EleutherAI
语言模型评估工具(EAI-Eval
)的 29
个任务、以及来自 T0
评估集(T0-Eval
)的 9
个任务。两者之间有很大的重叠:只有 T0-Eval
的一个任务(StoryCloze
)不在 EAI-Eval
中,尽管两者之间的所有 prompts
都不一样。有关任务和 baseline
的详细清单,请参见 《What language model to train if you have one million GPU hours?》
。我们还注意到,我们的任务集合共享了 GPT-3 evaluation
的 31
个任务中的 17
个。
我们使用较小的模型进行消融实验。我们使用 6.7B
的参数规模进行 pretraining objective
的消融分析,用 1.3B
的参数规模进行剩余的消融实验(包括 position embedding
、activation
和 layer normalization
)。最近,《LLM.int8(): 8-bit matrix multiplication for transformers at scale》
确定了大于 6.7B
的模型的 phase transition
,其中观察到 outliers features
的出现。这就提出了疑问:是否应该假定在 13B
规模下获得的结果可以推断到我们最终的模型规模?
范围之外的架构:我们没有考虑 mixture-of-expert: MoE
,因为缺乏关于 MoE
的广泛使用的、能大规模训练 MoE
的 GPU-based
代码库。
同样地,我们也没有考虑 state-space
模型。在设计 BLOOM
的时候,它们在自然语言任务中一直表现不佳。这两种方法都很有前途:现在已经在 MoE
的 large scale
上表现出有竞争力的结果,在较小的 scale
上 state-space
模型与 H3
也表现出有竞争力的结果。
架构和 pretraining objective
:尽管大多数现代语言模型都是基于 Transformer
架构的,但架构实现之间存在着重大的 deviation
。值得注意的是,虽然最初的 Transformer
是基于 encoder-decoder
架构的,但许多流行的模型都选择了 encoder-only
(如 BERT
)或 decoder-only
(如 GPT
)方法。目前,所有超过 100B
参数的 SOTA
语言模型都是 causal decoder-only
模型。这与 T5
的研究结果相反,在 T5
的研究结果中,对于迁移学习, encoder-decoder
模型的表现明显优于 decoder-only
模型。
在我们的工作之前,文献中缺乏对不同架构和 pretraining objective
的 zero-shot generalization
能力的系统评估。我们在《What language model architecture and pretraining objective works best for zero-shot generalization?》
中探讨了这个问题,其中我们评估了 encoder-decoder
架构和 decoder-only
架构,以及它们与 causal
、prefix
、以及masked language
的 modeling pretraining objective
的交互。我们的结果显示,在紧接着预训练后,causal decoder-only
模型表现最好,验证了 SOTA
的 LLM
的选择。此外,causal decoder-only
模型可以在预训练后更有效地适应 non-causal
的架构和 objective
,这种方法已经被 《Transcending scaling laws with 0.1% extra compute》
进一步探索和证实。
建模细节:除了选择架构和 pretraining objective
外,人们还提出了对原始 Transformer
架构的一些改变。例如,替代的 positional embedding
方案(RoFormer
、ALiBi
)、或新的激活函数(《GLU variants improve transformer》
)。因此,我们进行了一系列的实验,以评估 《What language model to train if you have one million GPU hours?》
中的 causal decoder-only
模型的每一个修改的好处。我们在 BLOOM
中采用了两种架构的修改:
ALiBi Positional Embedding
:ALiBi
没有向 embedding layer
添加位置信息,而是直接根据按 key
和 query
的距离来减弱注意力分数(《Train short, test long: Attention with linear biases enables input length extrapolation》
)。虽然 ALiBi
最初的动机是它能够推断出更长的序列,但我们发现它也导致了更平滑的训练和更好的下游性能,甚至在原始序列的长度上超过了 learned embedding
和 rotary embedding
。
Embedding LayerNorm
:在训练 104B
参数模型的初步实验中,我们按照 bitsandbytes
库的 StableEmbedding layer
所推荐的,在 embedding layer
之后立即添加了一个 additional layer normalization
。我们发现这大大改善了训练的稳定性。尽管我们也发现它惩罚了 zero-shot generalization
(《What language model to train if you have one million GPU hours?》
),但我们在训练 BLOOM
时在第一个 embedding layer
之后增加了 additional layer normalization
从而避免训练不稳定。注意初步的 104B
实验是在 float16
中进行的,而最终的训练是在 bfloat16
中进行的。因为从那时起,float16
被认为是造成训练 LLM
中许多观察到的不稳定性的原因(《OPT: Open pre-trained transformer language models》
、《Glm-130b: An open bilingual pre-trained model》
)。可能是 bfloat16
减轻了对 embedding LayerNorm
的需要。
注意:虽然
embedding layer
之后添加一个layer norm
会有助于训练的稳定性,但是它降低了模型的性能。
我们在下图中展示了 BLOOM
的完整架构,供参考。
BLOOM
采用的是Pre-LN
的方案(原始Transformer
用的是Post-LN
的方案),即:Layer Norm
在残差块中、在函数之前。
训练 tokenizer
的设计决策往往被忽视,而采用默认配置(《Between words and characters: A brief history of open-vocabulary modeling and tokenization in nlp》
) 。例如,OPT
和 GPT-3
都使用 GPT-2
的 tokenizer
,这个 tokenizer
是为英语而训练的。这可以说是合理的,因为评估 tokenizer
的特定选择对模型下游性能的影响,这受到了巨大的训练成本的限制。然而,BLOOM
训练数据的多样的特性,需要谨慎的设计选择,以确保 tokenizer
以无损的方式对句子进行编码。
Validation
:与现有的 monolingual tokenizer
相比,我们使用我们的 tokenizer
的 fertility
(《Exploring bert's vocabulary》
)作为健全性检查(sanity check
)的一个指标。 fertility
被定义为 tokenizer
为每个单词或每个数据集创建的 subwords
的数量。我们使用 Universal Dependencies 2.9
和 OSCAR
中我们感兴趣的语言的子集来衡量 fertility
指标。与 monolingual tokenizer
相比,一种语言的 fertility
非常高,可能表明该模型的下游多语性能下降(《How good is your tokenizer? on the monolingual performance of multilingual language models》
)。我们的目标是,当我们的 multilingual tokenizer
与相应语言的 monolingual tokenizer
进行比较时,每种语言的 fertility
不能降低超过 10
个百分点。在所有的实验中,Hugging Face Tokenizers
库被用来设计和训练 tested tokenizers
。
Tokenizer Training Data
:我们最初使用的是 ROOTS
的非去重子集。然而,对 tokenizer
的词表(vocabulary
)的定性研究显示了其训练数据的问题。例如,在 tokenizer
的早期版本中,我们发现整个 URL
被存储为 tokens
,这是由几个包含大量重复内容的文件造成的。这些问题促使我们在 tokenizer
的训练数据中删除重复的行。然后,我们对每种语言采用与 training data
相同的采样比例。
词汇量:大的词汇量( vocabulary size
)可以减少对某些句子过度分割的风险,特别是对低资源语言(low-resource language
)。我们使用 150k
和 250k
的词汇量进行了验证实验,以便于与现有的多语言建模文献进行比较(《Unsupervised cross-lingual representation learning at scale》
、《mT5: A massively multilingual pre-trained text-to-text transformer》
)。与 monolingual tokenizer
相比,我们最终确定了 250k
的词汇量来达到我们的 initial fertility objective
。由于词汇量决定了 embedding
矩阵的大小,出于 GPU
效率的考虑,它也必须能被 128
整除;它也能被 4
整除,以便使用张量并行。我们使用了 250,680
个词表条目的最终规模,并为未来可能的应用保留了 200
个 token
,例如使用 placeholder tokens
来移除私人信息。
Byte-level BPE
:该 tokenizer
是一个 learned subword tokenizer
,使用 《A new algorithm for data compression》
介绍的 Byte Pair Encoding: BPE
算法训练。为了在 tokenization
过程中不丢失信息,tokenizer
从字节而不是字符作为最小的单位开始创建 merges
(GPT-2
)。这样一来,tokenization
永远不会导致 unknown tokens
,因为所有 256
个字节都可以包含在 tokenizer
的词表中。此外,Byte-level BPE
最大限度地实现了语言之间的 vocabulary sharing
(《Neural machine translation with byte-level subwords》
)。
Normalization
:在 BPE tokenization
算法的上游,没有对文本进行 normalization
,以便拥有尽可能通用的模型。在所有情况下,我们观察到,在所有考虑到的语言中,添加 NFKC
等 unicode normalization
并没有将 fertility
降低 0.8%
以上,但其代价是使模型的通用性降低;例如,导致
Pre-tokenization
:我们的 pre-tokenization
有两个目标:
产生文本的第一次分割(通常使用空白符号和标点符号)。
限制 token
序列的最大长度,其中 token
由 BPE
算法来产生。
所使用的 pre-tokenization
规则是以下的正则表达式:"?[^(\S|[.,!...。,、~“])]+"
,它将单词分割开来,同时保留所有的字符,特别是对编程语言至关重要的空格和换行序列。我们不使用其他 tokenizer
中常见的以英语为中心的拆分(例如围绕 'nt
或 'll
的拆分)。我们也没有在 numbers
和 digits
上使用拆分(如果这么拆分,会在阿拉伯语和 code
中造成问题)。
数字
112
要不要拆分成1 1 2
三个数字?LLaMA
进行了这种拆分,而BLOOM, GLM-130B
没有进行这种拆分。
硬件:该模型在 Jean Zay
上进行训练,这是一台法国政府资助的超级计算机,由 GENCI
拥有,在法国国家科学研究中心(French National Center for Scientific Research: CNRS
)的国家计算中心 IDRIS
运行。训练 BLOOM
花了大约 3.5
个月时间,消耗了 1,082,990
个计算小时。训练在 48
个节点上进行,每个节点有 8
个 NVIDIA A100 80GB GPU
(总共 384
个 GPU
)。由于训练期间可能出现硬件故障,我们还保留了 4
个备用节点。这些节点配备了 2x AMD EPYC 7543 32-Core CPU
和 512GB
内存,而存储则由全闪存和硬盘驱动器混合处理,使用 SpectrumScale
(GPFS
)并行文件系统,在超级计算机的所有节点和用户之间共享。每个节点有 4
个 NVLink GPU-to-GPU
的互连,实现了节点内的通信;而每个节点有 4
个 Omni-Path 100 Gbps
链接,以enhanced
的超立方体 8D
全局拓扑结构排列,用于节点间的通信。
框架:BLOOM
是用 Megatron-DeepSpeed
(《Using DeepSpeed and Megatron to train Megatron-Turing NLG 530B, a large-scale generative language model》
)训练的,这是一个大规模分布式训练的框架。它由两部分组成:
Megatron-LM
提供了Transformer
实现、张量并行、以及数据加载原语。
DeepSpeed
提供了 ZeRO optimizer
、模型流水线、以及通用分布式训练组件。
这个框架允许我们用 3D
并行(如下图所示)有效地训练,这是分布式深度学习的三种互补的方法的融合。这些方法描述如下:
数据并行(Data parallelism: DP
):拷贝模型多次,每个副本放在不同的设备上,并馈入数据的一个分片。处理是并行进行的,所有的模型副本在每个 training step
结束时都被同步。
张量并行(Tensor parallelism: TP
):将模型的各个 layer
以层为单位,拆分到多个设备上。这样,我们不是让整个 activation
张量或梯度张量驻留在单个 GPU
上,而是将该张量的分片(以层为单位)放在不同的 GPU
上。这种技术有时被称为水平并行、或层内模型并行。
流水线并行(Pipeline parallelism: PP
):将模型的每一层分割到多个 GPU
上,因此每个 GPU
上只放置模型的某些层的一部分。这有时被称为垂直并行。
最后,Zero Redundancy Optimizer
(《ZeRO: Memory optimizations toward training trillion parameter models》
)允许不同的进程只持有一个 training step
所需的一部分数据(parameters
、梯度、以及 optimizer states
)。我们使用了 ZeRO stage 1
,也就是说,只有 optimizer states
是以这种方式分片的。
上述四个组件组合在一起,可以扩展到数百个 GPU
,并具有极高的 GPU
利用率。在我们使用 A100 GPU
的fastest
配置中,我们能够实现 156 TFLOPs
,达到了目标:理论峰值性能 312 TFLOPs
( float32
或 bfloat16
)的一半。
浮点格式:在 NVIDIA V100 GPU
上早期的的 104B
参数模型实验中,我们观察到了数值不稳定性,导致了不可逆的训练发散。我们假设,这些不稳定性源于我们最初使用的 IEEE float16
,这是一种动态范围非常有限的 16
位浮点格式,可能会导致溢出。我们最终获得的 NVIDIA A100 GPU
支持 bfloat16
格式,其动态范围与 float32
相同。另一方面,bfloat16
的精度仍然低得多,这促使我们使用混合精度训练(《Mixed precision training》
)。这种技术以 float32
的精度执行某些精度敏感的操作,如 gradient accumulation
和 softmax
,其余操作则以较低的精度执行,使我们能够实现高性能和训练稳定性的平衡。最终,我们在 bfloat16
混合精度下进行了最终训练,这被证明解决了不稳定问题(与 《Using DeepSpeed and Megatron to train Megatron-Turing NLG 530B, a large-scale generative language model》
之前的观察一致)。
融合的 CUDA kernels
:一般来说,GPU
不能在检索数据(为了进行计算)的同时进行这些计算。此外,现代 GPU
的计算性能远远高于每个操作(在 GPU
编程中通常称为 kernel
)所需的内存传输速度。Kernel fusion
(《Optimizing data warehousing applications for GPUs using kernel fusion/fission》
)是一种优化 GPU-based
的计算的方法,只在一个 kernel call
中执行几个连续的操作。这种方法提供了一种最小化数据传输的方法:中间结果留在 GPU
寄存器中,而不是被复制到 VRAM
中,从而节省了开销。
我们使用了由 Megatron-LM
提供的几个自定义的 fused CUDA kernels
。
首先,我们使用一个 optimized kernel
来执行 LayerNorm
,以及融合了各种操作(如scaling, masking, softmax
等等)的组合的 kernel
。
此外,还使用 PyTorch
的 JIT
功能将 bias
项的加法与 GeLU activation
融合。作为使用 fused kernel
的一个例子,在GeLU
操作中增加 bias
项不会增加额外的时间,因为该操作是 memory-bound
的:与 GPU VRAM
和寄存器之间的数据传输相比,额外的计算可以忽略不计,因此融合这两个操作基本上可以将其运行时间减半。
额外的变化:扩展到 384
个 GPU
需要两个 final changes
:禁用异步的 CUDA kernel launches
(为了便于调试和防止死锁)、将 parameter groups
拆分成更小的 subgroups
(以避免过度的 CPU
内存分配)。
在训练期间,我们面临着硬件故障的问题:平均每周有 1 ~ 2
个 GPU
发生故障。由于有备份节点并自动使用,而且每三个小时保存一次 checkpoint
,这并没有对训练的吞吐量产生很大影响。data loader
中的 PyTorch
死锁错误、以及磁盘空间问题导致了 5 ~ 10
小时的停机时间。鉴于工程问题相对稀少,而且只有一个 loss spike
,模型很快就恢复了,因此与同类项目(《OPT: Open pre-trained transformer language models》
)相比,人工干预的必要性较小。我们训练 BLOOM
的经验的全部细节、以及我们面临的所有问题,这些详细报告都是公开的。
Pretrained Model
:我们用下表中详列的相应的超参数来训练 BLOOM
的六种尺寸变体。架构和训练超参数来自于我们的实验结果(《What language model to train if you have one million GPU hours?》
)和之前训练大型语言模型的工作(GPT-3
、《Scaling laws for neural language models》
)。
non-176B
模型的模型深度和宽度大致遵循以前的文献(GPT-3
、OPT
),对 3B
和 7.1B
的模型有所偏离,只是为了在我们的训练设置上更容易适应这些模型。由于多语言词汇量较大,BLOOM
的 embedding
参数规模也较大,但 scaling
文献对 embedding
操作进行了折扣(《Scaling laws for neural language models》
)。
在104B
参数规模的开发过程中,我们试验了不同的 Adam
参数值、权重衰减值和梯度剪裁值,以达到稳定的目的,但没有发现有什么帮助。
对于所有的模型,我们使用 cosine learning rate decay schedule
,超过 410B tokens
(即,cosine length
的长度) ,训练的序列长度选择计算允许条件时的上限,并在前 375M tokens
进行预热。我们使用权重衰减、梯度剪裁、以及 no dropout
。ROOTS
数据集包含大约 341B
个文本 token
,所以我们的目标是对所有模型进行等量 token
的训练。然而,考虑到训练期间公布的 revised scaling laws
(《Training compute-optimal large language models》
),我们决定在重复数据上对大型模型进行额外的 25B tokens
的训练。由于 warmup tokens + decay tokens
大于 tokens
总数,因此从未达到 learning rate decay
的终点。
余弦学习率调度的周期为
410B tokens
,它是数据集规模341B
的1.20
倍。这是《Training Compute-Optimal Large Language Models》
论文得出的经验结果。
多任务微调: finetuned BLOOMZ
模型(《Crosslingual generalization through multitask finetuning》
)保持与 BLOOM
模型相同的架构超参数。微调超参数粗略地基于 T0
(《Multitask prompted training enables zero-shot task generalization》
)和 FLAN
(《Finetuned language models are zero-shot learners》
)。学习率是由各自 pretrained model
的最小学习率的两倍决定的,然后进行四舍五入。对于小型变体, global batch size
乘以4
,以增加吞吐量。虽然模型被微调了 13B tokens
,但 best checkpoint
是根据一个单独的验证集选择的。我们发现在经过 1B ~ 6B tokens
的微调后,性能趋于稳定。
Contrastive Finetuning
:我们还使用 SGPT Bi-Encoder
配方(《SGPT: GPT sentence embeddings for semantic search》
)对 1.3B
和 7.1B
参数的 BLOOM
模型进行了对比性微调,以训练产生高质量 text embedding
的模型。我们创建了面向多语言信息检索的 SGPT-BLOOM-7.1Bmsmarco
、以及面向多语言语义文本相似性(semantic textual similarity: STS
)的SGPT-BLOOM-1.7B-nli
。然而,最近的基准测试发现,这些模型也推广到其他各种 embedding
任务,如 bitext mining
、reranking
、或用于下游分类任务的特征提取(《MTEB: Massive text embedding benchmark》
)。
碳足迹(Carbon Footprint
):虽然大多数估算语言模型碳足迹的尝试都揭示了由于模型训练过程中消耗的能源而产生的排放,但其他排放源也是需要考虑的。在估算 BLOOM
的碳排放时,我们受到生命周期评估(Life Cycle Assessment: LCA
)方法的启发,旨在考虑设备制造、中间模型训练、以及部署等方面的排放。根据我们的估计,BLOOM training
的碳排放加起来约为 81
吨 CO2eq
,其中 14%
是由设备制造过程产生的(11
吨)、30%
是训练期间消耗的能源(25
吨)、55%
是用于训练的设备和计算集群的闲置消耗(45
吨)。
将 BLOOM
训练的碳排放与其他类似模型进行比较(见下表),发现虽然 BLOOM
的能耗(433 Mwh
)略高于 OPT
( 324 Mwh
),但其排放量却减少了约 2/3
(25
吨对比70
吨)。这要归功于用于训练 BLOOM
的能源网( energy grid
) 的低碳强度,其排放量为57 gCO2eq/kWh
,而用于 OPT
训练的能源网为 231 gCO2eq/kWh
。具体来说,法国的国家能源网( Jean Zay
所使用的)主要由核能驱动,与由煤炭和天然气等能源驱动的电网相比,核能是低碳的。虽然对核能的可持续性存在争议,但它是目前碳密集度最低的能源之一。BLOOM
和 OPT
比 GPT-3
的碳排放量要少得多(《Carbon emissions and large neural network training》
),这可以归因于几个因素,包括更有效的硬件、以及碳密集度较低的能源。
我们还进一步探讨了:在 Big Science
研讨会范围内在 Jean Zay
上进行的计算,以及实时运行 BLOOM
模型 API
的碳足迹。就整个计算的碳足迹而言,我们估计最终的 BLOOM
训练约占总排放量的 37%
,其他过程如中间的 training run
和模型评估加起来占其他的 63%
。这略低于 OPT
论文作者的估计,他们说由于实验、baseline
、以及消融分析,其模型的总碳足迹大约高 2
倍。我们正在对 BLOOM API
的碳排放进行探索,估计模型在具有 16
个 GPU
的 GCP instance
上的实时部署,在 us-central
地区运行,每天的部署会排放大约 20
公斤的 CO2eq
(或 0.83 kg/hour
)。这个数字并不代表所有的部署用例,而且会因使用的硬件以及模型实施的具体情况(如是否使用 batching
)和模型收到的请求数量而有所不同。关于 BLOOM
的碳足迹的更多信息可以在 《Estimating the Carbon Footprint of BLOOM, a 176B Parameter Language Model》
中找到。
开放性一直是 BLOOM
发展的核心,我们希望确保它能被社区轻松使用。因此,我们致力于将文档制作成 Model Card
、以及致力于一个新的 license
用于解决项目的具体目标。
Model Card
:按照发布机器学习模型的最佳实践,BLOOM
模型已经与详细的 Model Card
一起发布,描述了其技术规范、训练细节、预期用途、范围外用途、以及模型的局限性。各工作小组的参与者共同制作了最终的Model Card
、以及每个checkpoint
的类似的 Model Card
。这项工作是协作性的,主要是通过思考和讨论每一个部分,然后根据参与者在讨论过程中自然形成的分类和区别,进一步划分为子部分。
Licensing
:考虑到 BLOOM
可能带来的潜在有害的使用情况,我们选择在无限制的开放使用、以及负责任的使用之间取得平衡,包括行为使用条款(《Behavioral use licensing for responsible ai》
),以限制该模型在潜在有害使用情况下的应用。这类条款通常包括在越来越多的负责任的人工智能许可证(Responsible AI Licenses: RAIL
) 中,社区在发布他们的模型时一直在采用这类许可证。为 BLOOM
开发的 RAIL license
的一个突出方面是,它将源代码 license
和模型 license
分开,其中模型指的是 trained parameters
。它还包括对模型的使用和衍生作品的详细定义,以确保通过prompting
、finetuning
、distillation
、使用 logits
和概率分布等预期的下游使用被明确地确定。license
包含 13
个行为使用限制,这些限制是根据 BLOOM
模型卡中描述的预期用途和局限性,以及 BigScience
的道德宪章确定的。license
免费提供该模型,用户只要遵守条款(包括使用限制),就可以自由使用该模型。BLOOM
的源代码已在 Apache 2.0 open source license
下提供。
我们的评估集中在 zero-shot/few-shot setting
上。我们的目标是准确描述:在最真实地反映模型在实践中可能被使用的方式的setting
中, BLOOM
与现有的 LLM
相比如何。由于这些模型的规模,prompt-based adaptation
和 few-shot in-context learning
目前比微调更常见。因此,我们报告了在 zero-shot/one-shot
的 prompt-based setting
中,以及在多任务微调之后,一系列任务和语言的结果。为了与其他模型进行比较,我们首先报告了在 zero-shot setting
设置下的标准基准任务的性能。然后,我们使用多语言摘要、以及机器翻译来比较不同语言的性能。我们还从 multilingual probing
的角度来解释 BLOOM
的泛化能力。
prompts
:基于最近关于 prompting
对语言模型性能的影响的研究,我们决定建立一个语言模型评估套件,允许我们改变基本的任务数据以及用于 contextualize
任务的 prompting
。我们的 prompts
是在 BLOOM
发布之前开发的,并没有使用模型进行任何先验的完善。也就是说,我们在评估中使用的 prompts
是人类认为从语言模型中获取所需 task behavior
的合理方式。我们以这种方式设计 prompts
的目的是为了模拟一个新用户可以从 BLOOM
中期待的真实的 zero-shot/one-shot
的结果。这与呈现最佳性能的prompt design
形成对比,其中结果来自于多轮 trial-and-error
。我们选择报告前者是因为后者更难系统性地复现,可以说是对模型在一般情况下如何工作的一种不太有代表性的描述,不能代表真正的 zero-shot learning
(zero-shot learning
没有任何标记数据,而 trial-and-error
事实上存在一些标记数据)。
我们使用 promptsource
为每个任务生成多个 prompts
。我们遵循 《Multitask prompted training enables zero-shot task generalization》
使用的程序,其中 prompt generation
是众包的,因此我们看到整个 prompts
的长度和风格有很大的不同。为了提高质量和清晰度,我们对每个 prompt
进行了多次同行评议,以确保 artifacts
和一致性。
下表显示了用于 WMT'14
任务的 prompts
的例子。我们还为许多任务生成了 prompts
,但由于资源限制,这些 prompts
没有包括在本文的页面中。我们对所有任务(包括本文分析的任务和尚未分析的任务)的所有 prompts
都是公开的。
基础设施:我们的框架扩展了 EleutherAI
的语言模型评估工具(《A frameworkfor few-shot language model evaluation》
),将其与前面 ”训练数据集“ 章节中描述的promptsource library
整合。我们将我们的 Prompted Language Model Evaluation Harness
作为一个开放源码库发布给人们使用。我们使用这个框架来运行实验和汇总结果。
数据集:
SuperGLUE
:我们使用 SuperGLUE
评估套件的分类任务子集,具体而言是: Ax-b, Ax-g, BoolQ, CB, WiC, WSC,RTE
任务。我们排除了其余的任务,因为它们需要的计算量比我们考虑的所有这些任务的总和还要多一个数量级。这些任务是纯英语的,因此它们被包含在以前的工作中从而便于比较,而以前的工作主要集中在纯英语的模型上。我们还注意到,这些任务的性能还没有使用 zero-shot/one-shot prompt-based setting
来广泛报道过。T0
是第一个例外,但该模型是 instruction-tuned
的,因此不能与 BLOOM
和 OPT
等模型直接比较。
对于每个任务,我们从 promptsource
中随机选择五个 prompts
样本,在这组 prompts
上评估所有模型。与 Evaluation Harness
(《A framework for few-shot language model evaluation》
)中的其他 prompting task
一样,一个模型对给定 prompt
的预测是这样得到的:使用与prompt
相关的、指定的一组候选 label string
,然后选择这些 label string
中对数似然最大的那个。
机器翻译(Machine Translation: MT
):我们在三个数据集(使用 ISO-639-2 code
来指代语言)上评估 BLOOM
:WMT14 eng <-> fre and eng <-> hin
、Flores-101
和 DiaBLa
。我们使用 BLEU
的 sacrebleu
实现进行评估,对 WMT
和 DiaBLa
使用默认的 tokenization
,对 Flores
使用 spm-flores-101
。我们使用贪婪解码,生成预测直到 EOS token
,或者另外对1-shot
的情况使用 \n###\n
。每个数据集的最大生成长度被设定为与文献中通常使用的长度一致;具体来说,WikiLingua
和WMT14
为 64 tokens
,Flores-101
和 DiaBla
为 512 tokens
。具体任务的实验设计细节参考后文。
摘要:我们对 WikiLingua
数据集的摘要进行评估。WikiLingua
是一个多语言摘要数据集,包括 WikiHow
文章、以及 step-by-step summary
的 pair
对。 pair
对在多种语言之间进行对齐,source
和摘要的翻译由一个国际翻译团队进一步审核。 one-shot
条件自然语言生成通常未被规模与 BLOOM
相当的模型所报道。PaLM
是第一个例外,它在 WikiLingua
上报告了分数;但是,只考察了该模型在英语中的摘要能力。相比之下,我们选择通过评估源语言的抽象摘要能力来测试 BLOOM
固有的多语言能力。我们专注于九种语言(阿拉伯语、英语、西班牙语、法语、印地语、印度尼西亚语、葡萄牙语、越南语、汉语),这些语言是 BigScience
工作的目标之一。
自然语言生成是众所周知的对于评估是一个挑战,而多语言生成由于缺乏指标支持而使这一挑战更加复杂。根据 《Repairing the cracked foundation: A survey of obstacles in evaluation practices for generated text》
的建议,我们报告了 ROUGE-2
、ROUGE-L
和 Levenshtein
距离。对 ROUGE
的一个重要修改是使用从 Flores-101
数据集建立的 SentencePiece tokenizer
。一个朴素的方法会使用基于英语的 tokenizer
,但使用多语言 tokenizer
可以提高能力来衡量多语言生成的 fidelity
。为了尽量减少模型的inference
时间,我们使用了更新后的 GEM
基准的子样本(3000
个均匀采样的测试集的样本)。作者指出,在比较测试集子样本和完整测试集之间的模型性能时,差异很小。对于解码和生成,我们使用与上述机器翻译相同的程序。
baseline
模型:我们在适当的时候(如,它们支持 evaluation
数据集的语言的情况下)使用以下 baseline
模型:
mGPT
:在 Wikipedia
和 Common Crawl
的 60
种语言上训练的 GPT-style
模型。
GPT-Neo, GPT-J-6B, GPTNeoX
:在 Pile
上训练的一系列 GPT-style
模型。
T0
: T5
的一个变体,在 P3
的数据集上进行了 multitask prompted finetuning
。
OPT
:一系列的 GPT-style
模型,在混合数据集上训练,其中训练集包括 RoBERTa
和 Pile
。
XGLM
:一个在 CC100
数据集的变体上训练的 GPT-style
多语言模型。
M2M
:一个大型多语言模型,它被训练从而用于在 100
种语言之间进行翻译。
AlexaTM
:一个 encoder-decoder
模型,它在 Wikipedia
和 mC4
数据集上训练,混合了 masked language modeling
和 causal language modeling
的 objective
。
mTk-Instruct
:T5
的一个变体,在来自 Super-NaturalInstructions
的数据集上进行了 multitask prompted finetuning
。
Codex
:在 GitHub
的代码上微调的一系列 GPT
模型。
GPT-fr
:一个在法语文本上训练的 GPT-style
模型。
在整个自然语言理解任务、和自然语言生成任务中,我们发现 pretrained
模型的 zero-shot
性能接近随机。下图显示了模型在一系列SuperGLUE
基准任务的一组 prompts
中的平均 zero-shot
表现。Table 6
和 Table 7
显示了多个模型和数据集在 English-French
和 English-Hindi
上的 zero-shot
机器翻译结果。我们没有报告 zero-shot
在文本摘要方面的表现,因为文本生成实验的运行成本很高,而且根据这里报告的结果、以及在zero-shot
文本摘要上的的初始实验,很明显文本摘要方面的表现会很差。在所有的情况下,在标准语言模型上训练的模型的 zero-shot
性能都接近于随机。
SuperGLUE
:在 SuperGLUE
上,虽然某些 prompts
显示出性能的提高,幅度高达 10
个点的准确率,但各 prompts
的平均性能总是在随机值附近徘徊,这表明单个 prompts
的成功主要是统计上的方差。T0
模型是个例外,它显示了强大的性能。然而,这个模型在多任务设置中进行了微调(类似于 BLOOMZ
),以提高在 zero-shot prompting setting
中的性能,因此与这里显示的其他模型没有直接可比性。
翻译:在 zero-shot setting
中,翻译的结果通常很差,如 Table 6
所示,该表给出了不同 prompts
和多次运行的平均分数。多次运行是在不同的 BLOOM
版本(不同规模)中进行的。不同的run
的得分不同(例如,"version" prompt
的得分是 0.32 ~ 21.96
),有点令人惊讶的是,最好的 prompts
往往是比较啰嗦的prompts
( "version"
和 "a_good_translation"
的 prompts
)。
一个直觉是:啰嗦的
prompts
提供了更多的信息。
观察到的两个主要问题是:over-generation
、没有产生正确的语言(一个好的翻译的明显前提条件)。这些问题在其他语言模型中也可以看到,从 Table 7
中显示的 DiaBla
数据集上的普遍不良结果就可以看出。尽管不是一个多语言模型,T0
有时可以进行英语翻译(12.53
和 13.77
的 BLEU
分),尽管它是一个基于英语的模型这一事实可能解释了为什么它表现得更好。对于 BLOOM
来说,通过使用以目标语言结尾的 prompts
(而不是以要翻译的源文本结尾,其中 gpt3
风格的 prompts
是以源文本结尾),在 into-English
的方向上,错误语言的问题得到了部分缓解,这可能是因为用相同的语言生成 prompt
的 continuation
更容易。
在 one-shot evaluation
中,模型被给定一个 in-context training example
,我们发现,生成任务(机器翻译和文本摘要)的性能普遍提高,但 SuperGLUE
的分类任务却没有。
SuperGLUE
:Figure 7
显示了one-shot
的性能和 zero-shot
的结果。与 zero-shot
性能相比,在所有的 prompts
和模型中,对SuperGLUE
的 one-shot
性能变化都有所降低。总的来说,one-shot setting
没有明显的改善:模型的平均准确率仍然几乎总是处于随机状态( T0
除外)。
我们进行了一项额外的分析,比较了不同模型规模的 BLOOM
模型。作为 baseline
,我们还测量了类似规模的 OPT
模型( 350M
参数到 175B
参数)的平均 one-shot
准确率。Figure 8
显示了不同模型规模下每个 prompt
在每个任务上的准确率。OPT
模型系列和 BLOOM
模型系列都随着规模的扩大而略有改善,在所有任务中,模型族之间没有一致的差异。BLOOM-176B
在 Ax-b
、CB
和 WiC
上领先于 OPT-175B
。
机器翻译:在 1-shot setting
中,我们使用 XGLM prompt
测试了 Flores-101
的 dev-test
数据集中的几个语言方向。我们从同一数据集中随机选择 1-shot example
,这可能与过去的工作不同。我们将 high-resource language pairs
(Table 8(c)
)、high-to-mid-resource language pair
(Table 8(d)
)、low-resource language pair
(Table 8(a)
)以及Romance
语系相关语言之间(Table 8(b)
)的结果分开。
语言被分为低资源、中资源、以及高资源,取决于它们在 ROOTS
中的表现。对于 high-resource pair
和 mid-to-high-resource pair
,我们与有 615M
参数的 M2M-124
模型的监督结果进行比较, 《The Flores-101 evaluation benchmark for low-resource and multilingual machine translation》
计算了该模型的分数。此外,我们还与 XGLM(7.5B)
的 1-shot
结果(《Few-shot learning with multilingual language models》
)和 32-shot AlexaTM
结果(《Few-shot learning using a large-scale multilingual seq2seq model》
)进行比较。
无论是高资源语言之间的翻译、还是从高资源语言到中等资源语言的翻译,结果都很好,这表明 BLOOM
具有良好的多语言能力,甚至可以跨文字(这里是拉丁文或扩展拉丁文、中文、阿拉伯文和梵文之间)。与有监督的 M2M
模型相比,在这种 1-shot setting
下,结果往往是相当的、有时甚至更好,而且在许多情况下,结果与 AlexaTM
的结果相当。
许多低资源语言的翻译质量很好,与有监督的 M2M
模型相当,甚至略好。然而,斯瓦希里语(Swahili
)和约鲁巴语(Yoruba
)之间的结果非常差,这两种语言在 BLOOM
的训练数据中存在但代表性不足(每种语言 <50k tokens
)。这与 Romance
(因此也是相关语言)之间的翻译结果形成鲜明对比,后者的翻译结果全面良好,包括从 Galician: glg
的翻译(这种语言没有包括在训练数据中,但与其他罗曼语有许多相似之处,特别是与葡萄牙语(Portuguese: por
))。然而,这确实对 BLOOM
在训练中所包含的那些代表性不足的低资源语言上的质量提出了质疑。
文本摘要:下图显示了 OPT-175B
和 BLOOM
模型的 one-shot
结果。每点代表 per-prompt score
。关键的启示是,BLOOM
在多语言文本摘要方面取得了比 OPT
更高的性能,而且性能随着模型的参数数的增加而增加。我们怀疑这是由于 BLOOM
的多语言训练的结果。
正如在 ”实验设计“ 章节所讨论的,我们报告 ROUGE-2
的分数是为了与以前的工作进行比较,也是因为缺乏替代的 generation evaluation
。然而,我们从质量上观察到,在许多情况下,ROUGE-2
得分低估了系统所生成的摘要的质量。
这里没有画出横坐标。读者猜测横坐标是模型大小。
在最近关于多任务微调的工作基础上(《Multitask prompted training enables zero-shot task generalization》
、《Finetuned language models are zero-shot learners》
、《What language model architecture and pretraining objective works best for zero-shot generalization?》
),我们探索使用多语言多任务微调来提高 BLOOM
模型的 zero-shot
性能。
我们使用 ”训练数据集“ 章节所述的 xP3
语料库对 BLOOM
模型进行了多语言多任务微调。我们发现,zero-shot
的性能明显增加。在下图中,我们比较了 pretrained BLOOM
和 pretrained XGLM
模型与多任务微调的 BLOOMZ
、T0
、以及 mTk-Instruct
的zero-shot
性能。BLOOM
和 XGLM
的表现接近 random baseline
,对于NLI (XNLI)
为33%
、对于共指解析(XWinograd
)和句子补全(XCOPA
和 XStoryCloze
)为 50%
。
在经历了多语言多任务微调之后(BLOOMZ
),在所描述的保留任务上,zero-shot
性能有了明显的改善。尽管也经过了多任务微调,但由于 T0
是一个单语的英语模型,它在所展示的多语言数据集上的表现很差。然而,《Crosslingual generalization through multitask finetuning》
提供的其他结果显示,在控制模型规模和架构时,在 xP3
上进行微调的模型在英语数据集上的表现也优于 T0
。这可能是由于 T0
的微调数据集(P3
)包含的数据集和 prompts
的多样性不如 xP3
。多任务微调性能已被证明与数据集和 prompts
的数量相关(《Scaling instruction-finetuned language models》
)。
BLOOM
的预训练语料库 ROOTS
包括大约 11%
的代码。在下表中,我们报告了 BLOOM
在 HumanEval
(《Evaluating large language models trained on code》
)的基准测试结果。我们发现 pretrained BLOOM
模型的性能与在 Pile
上训练的类似规模的 GPT
模型相似。Pile
包含英文数据和大约 13%
的代码(GitHub + StackExchange
),这与ROOTS中
的代码数据来源和代码数据比例相似。
仅仅对代码数据进行了微调的 Codex
模型明显强于其他模型。多任务微调的 BLOOMZ
模型并没有比 BLOOM
模型有明显的改善。我们假设这是由于微调数据集 xP3
不包含大量的 pure code completion
。相反,xP3
包含与代码相关的任务,如估计一个给定的 Python
代码片段的时间复杂性。《Crosslingual generalization through multitask finetuning》
提供了额外的分析。
在 ”训练“ 章节中,我们概述了 contrastive finetuning procedure
用于创建 SGPTBLOOM text embedding
模型。在下表中,我们报告了来自 Massive Text Embedding Benchmark: MTEB
的两个多语言数据集的基准测试结果。我们发现:
SGPT-BLOOM-7.1B-msmarco
在几个分类任务和语义文本相似性任务上提供了 SOTA
性能。然而,它有 7.1B
参数,比多语言 MiniLM
和MPNet
等模型大一个数量级。
SGPT-BLOOM-1.7B-nli
的表现明显较差,可能是由于参数较少,其微调时间较短(NNI
是一个比MS-MARCO
小得多的数据集)。
除了 BLOOM
模型之外,ST5-XL
是最大的模型,有 1.2B
参数。然而,作为一个纯英语的模型,它在非英语语言上的表现很差。
下表中的语言是 BLOOM
预训练语料库的一部分。更多语言和数据集的性能可以在 MTEB
排行榜上查看。
probing
已经成为分析和解释 LLM
内部运作的重要评价范式,尽管它带有某些不足(《Probing classifiers: Promises, shortcomings, and advances》
)。除了 training objective loss
或下游任务评估外,对 LLM embedding
的考察有助于阐明模型的泛化能力,这对考察缺乏标记数据集或 benchmark
的语言尤其有利。
方法:为了解释 BLOOM
的多语言泛化能力,我们利用 Universal Probing
框架对 104
种语言和 80
种形态句法特征进行系统性的 probing analysis
(《Universal and independent: Multilingual probing framework for exhaustive model interpretation and evaluation》
)。该框架针对 Universal Dependencies:UD
中的每种语言提供了 SentEval-style
(《What you can cram into a single vector: Probing sentence embeddings for linguistic properties》
)的 probing steup
和数据集。我们考虑了 BLOOM
的预训练语料库、以及 UD treebanks
中存在的 7
个语系的以下17
种语言:Arabic (Afro-Asiatic), Bambara (Mande), Basque (language isolate), Bengali, Catalan, English, French,Hindi, Marathi, Portuguese, Spanish, Urdu (Indo-European), Chinese (Sino-Tibetan), Indonesian(Austronesian), Tamil (Dravidian), Wolof, Yoruba (Niger-Congo)
。我们的设置总共涵盖了 38
个形态句法特征,这些特征代表了特定语言的语言学信息。我们在下表中提供了一个数据集样本(标签为单数 Single
/复数 Plural
)。
probing
程序的进行情况如下:
首先,我们在 1.7B
参数的 BLOOM
变体(BLOOM 1B7
)和 BLOOM
(有 176B
参数)的每一层计算输入句子的 <s>-pooled representation
。
其次,我们训练一个二元逻辑回归分类器,以预测句子中是否存在形态句法特征。选择逻辑回归是因为它相对于非线性 probing
分类器有更高的 selectivity
。我们在这里使用原始的 UD training/validation/test splits
。
第三,由于大多数 probing
任务的 target class
不平衡,probing
性能是通过 F1
加权得分来评估的。结果是不同随机种子的三次运行的平均值。
baseline
:我们将 probing
性能与随机猜测、基于以下 TF-IDF
特征训练的逻辑回归分类器进行比较: word unigrams, character N-grams, BPE42 token N-grams, SentencePiece token N-grams
。我们使用 N-gram
范围为 [1,2,3,4]
,并将 TF-IDF
词表限制在 top-250k
个特征。
相关性:我们进行统计测试,从而分析 probing
性能与语言学、数据集和模型配置准则之间的相关性:
language script
:结果按 language script
,拉丁文和其他文字(Devanagari, Tamil, and Arabic
),分为两组。在这里,我们使用 non-parametric Mann-Whitney U test
。
语系:结果按语系分为 7
组。我们应用方差分析法(ANOVA
)来分析各组之间的差异。
probing
和预训练数据集大小:我们运行 Pearson correlation coefficient test
来计算 probing
性能和这些 data configuration criteria
之间的相关性。
模型大小的影响:按 BLOOM
版本将结果分为两组。在这里,我们使用 Mann-Whitney U test
检验,看看参数数量和 probing
结果之间是否存在相关性。
Probing
结果:下表列出了 probing
实验的结果,是每种语言内 probing task
和实验运行的平均数。总的情况是,BLOOM-1B7
的表现与 BLOOM
相当或更好,而两种 LLM
的表现都超过了基于计数的 baseline
。
具体而言,LLM
在 Arabic, Basque, and Indo-European languages (e.g., Catalan, French, Hindi, Portuguese, Spanish, and Urdu)
上的表现更为强劲,而 Bengali, Wolof, and Yoruba
的得分最低。我们把这种行为归因于为迁移能力: BLOOM
对于构成大量数据集的密切相关的语言,能更好地推断其语言属性。例如,在任何 Romance
上的表现都比英语好,而印度语的结果与高资源语言的结果接近。
下图显示了至少在5
种语言中的形态句法特征的 language-wise probing
性能结果。尽管规模不同,但两种 LLM
的 probing
性能是相似的。我们发现,在不考虑语言的情况下,LLM
可以很好地推断出情绪(Mood
)和人称(Person
)。数字、NumType
(数字类型)和声音在大多数语言中的推断效果一般。这些模型在其他类别中普遍表现出较差的质量,表明它们没有编码这种形态学信息。对这种性能差异的可能解释可能是这些类别的可能值的多样性。例如,情绪和人称在所提交的语言中具有相似的值,而 Case
值的集合则高度依赖于语言。
相关性结果:相关性分析结果支持关于probing
性能的结论,并揭示了贡献因子(如下表所示)。
两种模型在具有不同 language script
的语言上显示出类似的结果。
BLOOM-1B7
的结果与语系、probing dataset size
、和预训练数据集大小高度相关。
根据Mann-Whithey U test
的结果,BLOOM-1B7
的结果明显优于 BLOOM(P < 0.01)
。然而,BLOOM
在不同的语言上表现出更稳定的性能,尽管它在预训练期间看到了大量的数据。这可能表明有更多参数的模型具有更好的泛化能力。
作为对 BLOOM
学到的 bias
的初步研究,我们提出了对多语言 CrowS-Pairs
数据集的评估,该数据集结合了 《CrowS-pairs:A challenge dataset for measuring social biases in masked language models》
开发的 CrowS-Pairs
数据集的修订版和《French CrowS-pairs: Extending a challenge dataset for measuring social bias in masked language models to a language other than English》
引入的法语版 CrowS-Pairs
。
这项评估的一个挑战是如何将原本用于 masked language model
的数据集适应于 autoregressive language model
(如 BLOOM
)。CrowS-Pairs
依靠 minimal pairs
来比较一个刻板印象的语句、以及一个非刻板印象的语句(例如,"Women can't drive."
是一个性别刻板印象,而 "Men can't drive."
则不是)。这两种陈述的不同之处在于刻板印象所针对的 social category
,而且该 social category
在刻板印象陈述(stereotyped statement
)中存在而在非刻板印象陈述(non-stereotyped statement
)中不存在。评价的目的是评估模型对刻板印象陈述的系统偏好。最初的 metric score
比较了一对句子的 pseudo-loglikelihood
,以确定哪个句子从 masked language model
中获得了更高的分数。prompts
被设计成要求模型根据所描述情况的可能性和现实性来选择其中一个语句。
下图显示,BLOOM
的 overall prompt accuracy
接近 0.50
,这表明总体上没有偏差。我们注意到,英语和法语的得分非常接近,这表明模型在这两种语言上的整体行为相似。我们还展示了英语和法语的mono-lingual autoregressive model
的结果,包括 GPT-Neo
和 GPT-FR
。
下表列出了CrowS-Pairs
数据集中每个 bias
类型的结果。结果在各个类别上是相当均匀的,这与以前关于 masked language model
的研究形成了鲜明的对比(这些研究表明模型在特定的类别中容易出现 bias
)。尽管如此,两种语言的准确率总体上与 50
有明显的差异(T-test, p < .05
),以及一些偏见的类别,如表中的星号所示。
局限性:《Stereotyping Norwegian salmon: An inventory of pitfalls in fairness benchmark datasets》
讨论了原始CrowS-Pairs
语料库的有效性问题。这里使用的 CrowS-Pairs
版本与原始版本不同,它解决了论文指出的一些问题,并根据从法语使用者那里收集的可变印象构建了 200
个额外的句子对。在最近对英语和法语的 masked language model
的bias
评估中,在修订后的数据集上获得的结果与在原始数据集上获得的结果没有明显的区别(《French CrowS-pairs:Extending a challenge dataset for measuring social bias in masked language models to a language other than English》
)。然而,它的原始 validation
在这里并不自然适用,与其他 CrowS-Pairs
结果的比较也更加困难。为了更有力地评估偏差,用 CrowS-Pairs
得到的结果应该与其他的 measures of bias
进行比较,同时对模型中的所有语言进行评估。然而,正如 《You reap what you sow: On the challenges of bias evaluation under multilingual settings》
所指出的,可用于多语言bias
评估的材料(语料、measures
)非常少。
尽管我们的检查表明模型中存在着有限的偏见,但它们不能涵盖可能的使用场景的广度。模型可能产生较大影响的一种情况是语言多样性(linguistic diversity
)和语言变体(language variation
)。由于 BLOOM
的训练资源是精心策划的,它们也可能比其他模型更大程度地捕捉到一些语言变体。这也影响了 trained model
公平地代表不同的语言变体的能力。这种差异可能有助于某些语言变体比其他语言变体的传播和合法化。我们对模型中的偏差的评估进一步限制在多语言 CrowS-Pairs
所涵盖的场景、语言、以及语言变体上。因此,我们期望在我们使用 CrowS-Pair
的结果和更广泛的模型使用之间有一个区别(关于这种差异的更详细的探索,见 《Ai and the everything in the whole wide world benchmark》
)。
语言变体:比如中国国内的各种方言。