作者:dikw
原文: https://zhuanlan.zhihu.com/p/655606405
进NLP群—>加入NLP交流群
大型语言模型 (LLMs) 在自然语言任务上展现了出色的性能,减少了对大量特征工程的需求。但大多数高效的LLMs主要针对英语或为闭源。本技术报告介绍了Baichuan 2,一个大规模多语言模型系列,包含70亿和130亿参数,基于2.6万亿tokens从零开始训练。Baichuan 2在公开基准测试如MMLU、CMMLU、GSM8K和HumanEval上达到或超过了其他同类开源模型的性能,并在医学和法律等垂直领域表现优异。我们发布所有预训练模型checkpoints,帮助研究社区更好地理解Baichuan 2的训练过程。
Introduction
强调了大型语言模型的重要性和进展,特别是在开源和多语言处理方面的挑战和机会。Baichuan 2作为一个新的多语言模型,旨在解决这些挑战并为社区提供有价值的资源。
大型语言模型的进展:近年来,大型语言模型(LLMs)的领域取得了显著的进展。模型的规模从数百万参数(如ELMo和GPT-1)增长到数十亿甚至数万亿参数(如GPT-3、PaLM和Switch Transformers)。这种规模的增长显著提高了语言模型的能力,使其能够更具人性化地流利地执行各种自然语言任务。特别是OpenAI的ChatGPT展示了这些模型在各种领域生成类似人类的文本的能力。
开源与封闭的模型:尽管LLMs取得了令人兴奋的突破和应用,但大多数领先的LLMs(如GPT-4、PaLM-2和Claude)仍然是闭源的。这限制了开发者和研究者对完整模型参数的访问,使得社区难以深入研究或微调这些系统。与此相反,完全开源的LLMs(如LLaMA、OPT、Bloom、MPT和Falcon)为研究者提供了自由访问模型的机会,从而加速了该领域的研究和进展。
中文模型的缺失:大多数开源的大型语言模型主要集中在英语上。例如,LLaMA的主要数据来源是Common Crawl,它包含了LLaMA的预训练数据的67%,但被过滤为仅包含英文内容。其他开源LLMs(如MPT和Falcon)也主要关注英语,并且在其他语言上的能力有限。
Baichuan 2的介绍:本技术报告介绍了Baichuan 2,一系列大型多语言语言模型。Baichuan 2有两个独立的模型:Baichuan 2-7B(70亿参数)和Baichuan 2-13B(130亿参数)。这两个模型都在2.6万亿tokens上进行了训练。Baichuan 2在各种基准测试上都取得了显著的进步,并且在医学和法律领域也表现出色。
开放资源:为了促进研究合作和持续改进,作者还发布了Baichuan 2在从2000亿tokens到完整的2.6万亿tokens的各个训练阶段的checkpoints。这些中间结果的发布旨在为社区提供更深入了解Baichuan 2的训练。
Pre-training
数据
调了为Baichuan 2模型进行预训练时使用的数据的来源和处理方法的重要性。数据的全面性和高质量是训练大型语言模型的关键。
数据源
在数据获取过程中,目标是追求数据的全面性和代表性。数据来自多种来源,包括普通的互联网网页、书籍、研究论文、代码库等,以构建一个广泛的世界知识系统。
数据清洗
数据频率:侧重于数据的频率和质量。数据频率依赖于聚类和去重。为此,建立了一个大规模的去重和聚类系统。这个系统可以在几小时内对万亿规模的数据进行聚类和去重。
基于聚类:根据聚类,单个文档可以被标记为高、中或低频。这有助于优化数据的质量和多样性。模型结构
基础架构:
Baichuan 2的模型架构基于流行的Transformer 。但是,作者对其进行了若干修改。
分词器(Tokenizer):
分词器需要平衡两个关键因素:高压缩率以实现高效的推断,以及适当大小的词汇表以确保每个词嵌入的充分训练。
为了平衡计算效率和模型性能,Baichuan 2的词汇表大小从Baichuan 1的64,000扩展到125,696。
与其他模型相比,Baichuan 2的分词器的词汇大小和文本压缩率列在了一个表格中。其中,文本压缩率越低越好。
Baichuan 2使用SentencePiece (Kudo and Richardson, 2018)中的byte-pair encoding (BPE) (Shibata et al., 1999)来分词。具体来说,它不对输入文本应用任何规范化,并且不像Baichuan 1那样添加虚拟前缀。它将数字分割成单个数字以更好地编码数值数据。为了处理包含额外空格的代码数据,它在分词器中添加了仅空格的令牌。字符覆盖率设置为0.9999,稀有字符回退到UTF-8字节。
位置编码 :
Baichuan 2在其7B版本中采用了旋转位置嵌入 (Rotary Positional Embedding, RoPE)而在其13B版本中,采用了ALiBi(由Press等人于2021年提出)。ALiBi是一个较新的位置编码技术,已经显示出了改进的外推性能。
开源模型的选择:大多数开源模型使用RoPE作为位置嵌入,优化的注意力实现,如Flash Attention,目前更适合于RoPE,因为它是基于乘法的,绕过了将attention_mask传递给注意力操作的需要。
初步实验:在初步的实验中,位置嵌入的选择并没有显著影响模型的性能。
为了促进基于偏置和基于乘法的注意力的进一步研究,作者在Baichuan 2-7B上应用了RoPE,在Baichuan 2-13B上应用了ALiBi,这与Baichuan 1保持一致。
激活函数和归一化
激活函数:Baichuan 2使用了SwiGLU(Shazeer, 2020)作为其激活函数。SwiGLU是GLU(Dauphin et al., 2017)的一个变种,它通过一个开关激活机制展现了更好的结果。不同于传统Transformer的前馈层只有两个矩阵,SwiGLU包含三个参数矩阵。因此,模型将隐藏层的大小从原来的4倍减少到8/3倍,并且进行了适当的调整。
注意力层:Baichuan 2采用了由xFormers2实现的内存高效注意力(Rabe和Staats, 2021)。通过利用xFormers的优化注意力和偏置能力,模型能够有效地整合ALiBi的基于偏置的位置编码,同时减少了内存开销。这为Baichuan 2的大规模训练带来了性能和效率上的好处。
归一化:
Baichuan 2在Transformer块的输入上应用了层归一化Layer Normalization,这种方法对于warmup更为稳健。
此外,模型使用RMSNorm实现,该实现仅计算输入特征的方差以提高效率。
优化器
超参数:
训练时使用了AdamW优化器,其中β1设置为0.9,β2设置为0.95。
使用了0.1的权重衰减,并将梯度范数裁剪到0.5。
模型的学习率首先经过2,000步的线性缩放预热到最大学习率,然后应用余弦衰减到最小学习率。
整个模型使用BFloat16混合精度进行训练。与Float16相比,BFloat16具有更好的动态范围,但其低精度在某些设置中会导致问题。因此,对于某些值敏感的操作(如位置嵌入),使用了全精度。
NormHead
为了稳定训练并提高模型性能,对output embeddings进行归一化。
洞察:
1.output embedings容易不稳定。在训练过程中,稀有令牌嵌入的范数变小,干扰训练
2.对于KNN检索任务,我们发现语义信息主要由嵌入的余弦相似度编码,而不是L2距离。当前的线性分类器通过点积计算logits,这是L2距离和余弦相似度的混合。NormHead减少了在计算logits时L2距离的干扰。并在附录里面添加的消融实验,验证了在去除NormHead的时候,训练变得非常不稳定。
Max-z loss
洞察:
使用deepspeed训练过程中会出现明显的logits变得非常大的情况,对于这个情况笔者在deepspeed的issue上面搜索了一下发现有人提到了类似的BUG。所以除了pretraining的时候会出现这种BUG,是否SFT的时候deepspeed应该也存在logits漂移变大的情况?
由于repetition penalty的存在,largit logits会导致推理的时候存在问题,非常大的 logits 可以显着改变 softmax 之后的概率,使模型对重复惩罚超参数的选择敏感。
基于NormSoftmax 的启发,百川团队提供了一个Max-z的辅助loss来解决这种情况。
�max-z =2�−4∗�2
Scaling Laws
调了缩放定律在预测大型模型的性能方面的重要性,以及它们如何指导这些模型的训练以实现期望的结果。
缩放定律描述了模型的误差如何随着训练集大小、模型大小或两者的函数而减少。随着深度学习模型的训练变得越来越计算密集,这些定律变得越来越重要。
在训练他们的大型模型(拥有数十亿参数)之前,作者首先训练了较小的模型,以建立训练更大模型的缩放定律。使用来自Baichuan 2的相同数据集和一致的超参数,对从1000万到30亿参数的模型进行了训练,最多达到1万亿个令牌。
缩放定律使用Henighan等人(2020)提供的公式来制定,该公式描述了训练flops与目标损失之间的关系。该公式由不可约损失和可约损失组成,其中可约损失被制定为幂律缩放项。
拟合的缩放定律能够准确预测Baichuan 2模型的最终损失。具体来说,缩放定律准确地预测了Baichuan 2-7B和Baichuan 2-13B模型的最终损失。
在给定的数据下面, 模型越大,loss越小。看上去比较奇怪的是这三个模型同时在600B的时候收敛
Infrastructure
对deepspeed做了改造,优化训练。这里略过。
Alignment对齐阶段
Baichuan 2 的对齐过程主要包括两个主要组件:监督微调 (SFT) 和基于人类反馈的强化学习 (RLHF)。
1 监督微调
在监督微调阶段,我们使用人类标注者为从各种数据源收集的提示进行标注。每个提示都根据与Claude (2023) 类似的关键原则被标记为有帮助或无害。为了验证数据质量,我们使用交叉验证——权威标注者检查特定众包工作组注释的样本批次的质量,过滤底质量数据。SFT阶段总共使用了1万条SFT数据。
2 奖励模型:
我们为所有提示设计了一个三层分类系统,包括6个主要类别、30个次要类别和超过200个三级类别。从用户的角度看,我们希望分类系统全面覆盖所有类型的用户需求。从奖励模型训练的角度看,每个类别中的提示应该有足够的多样性,以确保奖励模型能够很好地泛化。
细节:
洞察:
RM数据使用白川 2 个不同大小的模型和阶段 (SFT, PPO) 模型生成响应以增强响应多样性。RM 训练中只使用了白川 2 模型家族生成的响应。来自其他开源数据集和专有模型的响应并没有提高奖励模型的准确性。这也强调了百川川模型系列从另一个角度的内在一致性。这里说明了偏好数据必须来自SFT或者PPO模型自身生成的,保证了RM模型训练来自PPO同分布的数据。说明了同分布数据对模型准确率的重要性。
3 PPO:
获得奖励模型后,我们使用PPO ( 算法训练我们的语言模型。我们使用四个模型:actor模型(负责生成响应)、reference模型(用于计算具有固定参数的KL惩罚)、奖励模型(为整个响应提供总体奖励)和critic模型(设计为学习每个令牌的值)。
4 训练细节:
在RLHF训练过程中,critic模型首先提前进行了20个训练步骤的预热。随后,通过标准的PPO算法更新critic和actor模型。对于所有模型,我们使用0.5的梯度裁剪,5e-6的恒定学习率和PPO裁剪阈值ϵ= 0.1。我们为所有的聊天模型设置了350次迭代,从而得到了Baichuan 2-7B-Chat 和 Baichuan 2-13B-Chat。
评估与总结
看上去百川2训练到百川1相同的tokens数时候在ceval和cmmlu分数其实差不太多,说明百川2的主要提升还是由于数据,大力出奇迹是有道理的!
进NLP群—>加入NLP交流群