Fork me on GitHub

【论文笔记】baichuan 2训练报告

以下文章来源于 https://zhuanlan.zhihu.com/p/655576902



一、前言

Baichuan 2有两个版本的型号,Baichuan 2-7B 70亿参数和Baichuan 2 - 13B拥有130亿个参数。 两个都模型接受了 2.6 万亿个token的训练,其中据我们所知,迄今为止最大的预训练数据量,是baichuan 1的两倍。有了如此海量的训练数据,Baichuan 2较之取得显着提升。在 MMLU 等通用基准CMMLU和 C-Eval中Baichuan 2 - 7B 性能较Baichuan 1提高近 30%。 具体来说,Baichuan 2 进行优化以提高数学成绩和代码问题。 在 GSM8K 和 HumanEval评测中Baichuan 2成绩比Baichuan 1高一倍。此外,Baichuan2还在医疗和法律领域表现强劲 在基准测试中,例如MedQA和 JEC-QA,Baichuan 2 优于其他开源模型,使其成为合适的基础特定领域优化的模型。

此外,百川智能还发布了两个聊天模型,分别是Baichuan 2-7B-Chat和Baichuan 2-13B-Chat,这两个模型专门针对遵循人类指令进行了优化。这些模型在对话和上下文理解方面表现优异。将详细介绍在提高Baichuan 2安全性方面的方法。通过公开这些模型,百川智能希望能够让社区进一步提高大型语言模型的安全性,从而促进更多关于负责任的LLM开发的研究。

二、预训练

1、预训练数据

**数据来源:**在数据获取过程中,目标是在数据规模和代表性方面追求全面的数据多样性。百川智能从各种来源收集数据,包括通用互联网网页、书籍、研究论文、代码库等,以构建一个广泛的世界知识体系。

Baichuan 2训练数据中不同类别的分布情况如下:

  1. Web pages: 40%
  2. Books: 30%
  3. Research papers: 20%
  4. Codebases: 5%
  5. Other resources (e.g., news articles, blogs): 5%

这个分布是根据各类数据的特点和可用性进行选择的。Web页面主要包含了大量的文本信息,可以提供丰富的语言理解能力;书籍则提供了更深层次的知识背景;研究论文则提供了专业领域的深度理解能力;代码库则为模型提供了编程相关的知识;而其他资源(如新闻文章、博客)则提供了更多的上下文信息。
预训练数据类别分布

**数据处理:**对于数据处理,关注的是数据频率和质量。数据频率依赖于聚类和去重。百川智能建立了一个支持LSH(Locality Sensitive Hashing)特征和密集嵌入特征的大规模去重和聚类系统。这个系统可以在数小时内对数十亿甚至万亿级别的数据进行去重和聚类。基于聚类,单个文档、段落和句子被去重并打分。这些分数随后用于预训练阶段的数据采样。

**Tokenizer:**tokenizer需要平衡两个关键因素:高效推理的高压缩率和适当大小的词汇表,以确保每个单词嵌入的充分训练。主要考虑到了这两个方面。Baichuan 2将词汇表大小从Baichuan 1中的64,000扩展到125,696,旨在在计算效率和模型性能之间取得平衡。

使用字节对编码(BPE)去处理预训练数据。具体来说,我们不对输入文本进行任何规范化处理,也不像Baichuan 1那样添加一个占位符前缀。将大额数字拆分为单独的数字,以便更好地表示数值数据。为了处理包含额外空格的代码数据,我们在分词器中添加了仅有空白的标记。字符覆盖设置为0.9999,罕见字符则退回到UTF-8字节。我们把最大标记长度设为32,以适应长长的汉语短语。Baichuan 2的分词器训练数据来自于Baichuan 2预训练语料库,其中包括更多经过采样的代码示例和学术论文,以提高覆盖范围(Taylor等人,2022)。表2详细比较了Baichuan 2的分词器与其他分词器的差异。
多模型词表尺寸和压缩率 Baichuan 2预训练数据的数据处理流程。


2、位置编码

基于Baichuan 1,采用了Rotary Positional Embedding(RoPE)用于Baichuan 2-7B和ALiBi用于Baichuan 2-13B。ALiBi是一种更新的位置编码技术,已显示出更好的外推性能。然而,大多数开源模型都使用RoPE作为位置嵌入,并且优化的注意力实现如Flash Attention目前更适合RoPE,因为它是基于乘法的,无需通过传递注意力掩码来实现注意力操作。尽管如此,在初步实验中,位置嵌入的选择并没有显著影响模型性能。为了支持关于基于偏差和基于乘法的注意力的进一步研究,在Baichuan 2-7B上应用了RoPE,与Baichuan 1保持一致,而在Baichuan 2-13B上应用了ALiBi。
Baichuan 2模型的参数细节和学习率


3、激活函数

使用SwiGLU激活函数,这是一种开关触发的GLU变体,表现有所改善。然而,SwiGLU具有一个"双线性层",包含三个参数矩阵,与原始Transformer的前馈层不同,后者只有两个矩阵,因此将隐藏大小从4倍隐藏大小降低到8倍隐藏大小并四舍五入为128的整数倍。对于Baichuan 2的注意力层,采用xFormers2实现的内存高效注意力。通过利用xFormers的优化注意力及其偏置能力,可以有效地整合ALiBi的基于偏差的位置编码,同时减少内存开销。这为Baichuan 2的大规模训练提供了性能和效率优势。

对Transformer块的输入应用Layer Normalization。此外,使用RMSNorm实现,它只计算输入特征的方差以提高效率。


4、优化器

使用AdamW进行训练。β1和β2分别设置为0.9和0.95。使用权重衰减,值为0.1,并修剪梯度范数至0.5。模型在达到最大学习率之前先用2000个线性缩放步骤进行预热,然后应用余弦退火到最小学习率。

整个模型使用BFloat16混合精度进行训练。与Float16相比,BFloat16具有更好的动态范围,使其在训练大型语言模型时更能抵抗关键的大值问题。然而,BFloat16的低精度会导致某些设置出现问题。例如,在一些公开的RoPE和ALiBi实现中,torch.arange操作由于整数超过256而发生冲突,导致附近位置的微分变得困难。因此,在某些敏感操作,如位置嵌入,使用全精度。

**NormHead:**为了稳定训练并提高模型性能,将输出嵌入(也称为"头")进行归一化。在我们实验中,NormHead有两个优势。首先,在初步实验中发现,头的范数容易不稳定。稀有标记嵌入的范数在训练过程中会变小,这会干扰训练动力学。NormHead可以显著稳定动力学。其次,发现语义信息主要由嵌入的余弦相似性编码,而不是L2距离。因为当前的线性分类器计算logits是通过点积完成的,这是一种L2距离和余弦相似性的组合。NormHead缓解了计算中的L2距离干扰。

**Max-z loss:**在训练过程中,我们发现LLM的逻辑值可能非常大。绝对逻辑值在softmax函数不太重要,因为它只取决于它们之间的相对值。在大逻辑值在推理过程中造成了问题,因为重复惩罚的常见实现直接应用到逻辑值上。以这种方式收缩非常大的逻辑值可能会显著改变softmax后的概率,使模型对重复罚球超参数的选择敏感。受NormSoftmax和PaLM的辅助Z损失的启发,添加了一个Max-z损失来规范化逻辑值:

\iota_{max-z} = 2e^{-4} * z^{2}

其中 z 是最大 logit 值。 这有帮助稳定训练。
Baichuan 2 训练loss


5、缩放法则

神经元放缩定律,其中误差按训练集大小、模型大小或两者同时呈幂函数减少,已经在深度学习和大语言模型的训练变得越来越昂贵时,为训练提供了较好的效果。在训练数十亿参数的大型语言模型之前,会先训练一些小型模型,并为训练更大模型拟合一个放大率法则。我们在一系列模型尺寸范围内进行了发射,从10M到3B,从小型模型的1%到最终模型的1%,每个模型都经过了最多1万亿个标记的训练,使用一致的超参数和相同的数据集源自Baichuan 2。根据不同模型的最终损失,我们可以获得从训练浮点数到目标损失的映射。为了适应模型的放大率法则,采用了Henighan等人的公式(2020年):

\iota_{C} = a\times C^{b} + \iota_{\infty}

其中L∞是不可简化的损失,第一个项是可简化的损失,它被表示为幂律缩放项。C是训练浮点数,而LC是该模型在那个浮点数下的最终损失。使用SciPy库中的curve_fit函数来拟合参数。拟合的最终放大曲线和预测的70亿和130亿参数模型的最终损失如图4所示。我们可以看到,拟合的放大率法则对Baichuan 2的最终损失的预测具有很高的准确性。
Baichuan 2的放大率法则们用1万亿个标记训练了各种模型,从1000万到30亿个参数。通过将功率项拟合到给定训练浮点数的损失中,预测了在2.6万亿个标记上训练Baichuan 2-7B和Baichuan 2-13B的损失。这个拟合过程精确地预测了最终模型的损失(用两个星号标记)。


6、训练设备

高效利用现有的GPU资源在训练和开发大型语言模型方面发挥着至关重要的作用。为了实现这一目标,采用了一种针对弹性和训练框架和智能集群调度策略的协同设计方法。

由于GPUs被多个用户和任务共享,每个任务的具体行为是不确定的,这往往导致集群内部的空闲GPU节点。考虑到配备有8个A800 GPU的单台机器足以满足Baichuan 7B和Baichuan 13B模型的内存需求,训练框架的主要设计标准是对机器级别的弹性支持,即根据集群状态动态调整任务资源,从而为我们的智能调度算法奠定基础。

为了满足机器级别的弹性要求,训练框架整合了张量并行化和ZeRO驱动的数据并行化,我们在每台机器内设置张量并行化,并在机器之间采用ZeRO共享数据并行化以实现弹性扩展。

此外,采用张量分割技术,在某些计算中分解任务以减少峰值内存消耗,例如具有大型词汇表的交叉熵计算。这种方法能够在不增加额外的计算和通信的情况下满足内存需求,从而提高系统的效率。为了在不牺牲模型准确性的情况下进一步加速训练,将混合精度训练实现为:在BFloat16上执行正向和反向计算,同时在Float32上进行优化器更新。此外,为了有效地将我们的训练集群扩展到数千个GPU,集成以下技术以避免通信效率的降低:拓扑感知分布式训练。在大规模集群中,

  1. 网络连接频繁跨越多个层的交换机。针对性地安排分布式训练的等级,以最小化不同交换机之间的频繁访问,这降低了延迟并提高了整体训练效率。
  2. ZeRO的混合和分层划分。通过在GPU之间分配参数,ZeRO3以减少内存消耗为代价增加了额外的全聚集通信。当扩展到数千个GPU时,这种方法会导致显著的通信瓶颈。为了解决这个问题,提出了一种混合和分层划分方案。具体来说,框架首先将在所有GPU之间分配优化器状态,然后自适应地决定哪些层需要激活ZeRO3,以及是否对参数进行分层划分。通过整合这些策略,系统能够在1024个NVIDIA A800 GPU上高效地训练Baichuan 2-7B和Baichuan 2-13B模型,实现计算效率超过180 TFLOPS。

三、有监督微调

在监督微调阶段,使用人工标注者对从各种数据源收集的提示进行标注。每个提示都被标记为根据关键原则是有帮助还是无害的。为了验证数据质量,使用交叉验证------权威标注者检查特定人群工作者群体标注的一批样本的质量,拒绝使用不符合质量标准的任何一批样本。收集了超过10万个监督微调样本,并在此基础上训练了的基座模型。接下来,通过RLHF方法划定了强化学习过程,以进一步提高结果。


四、基于人工反馈强化学习

人工反馈强化学习流程图

1、奖励模型

所有提示设计了一个三层分类系统,由6个主要类别、30个次要类别和超过200个三级类别组成。从用户的角度来看,目标是这个分类系统能全面覆盖所有类型的用户需求。从奖励模型训练的角度来看,每个类别的提示应该具有足够的多样性,以确保奖励模型能够很好地泛化。

给定一个提示,通过不同大小和阶段的Baichuan 2模型(SFT、PPO)生成响应以增强响应多样性。只有来自Baichuan 2模型副本用于RM训练。其他开源数据集和专有模型生成的响应不会提高奖励模型的准确性。这也从另一个角度强调了Baichuan模型系列的内在一致性。

用于训练奖励模型的损失函数与InstructGPT中使用的损失函数相同。从训练中得出的奖励模型表现与LLaMA 2相当,表明两个响应之间的评分差异越大,奖励模型的判别准确度越高,
奖励模型在不同分数上的测试准确性两个响应之间的差距。 响应差距越大,RM 精度越高。 标签1,2,3,4,5对应不确定、差、稍微好一点、更好,以及分别明显更好。

2、PPO强化学习

在获得奖励模型后,使用PPO算法来训练我们的语言模型。我们使用四个模型:演员模型(负责生成响应)、参考模型(用于计算与固定参数相关的KL惩罚)、奖励模型(提供整个响应的总体奖励,参数固定)和批评家模型(旨在学习每个token的值)。

这一部份可以参考我之前写的强化学习内容:
归来仍是少年:大模型中的人工反馈强化学习详解

3、训练细节

在RLHF训练过程中,批评家模型在开始前的20个训练epoch中进行了预热。然后,通过标准的PPO算法更新批评家和演员模型。对于所有模型,使用梯度裁剪0.5,恒定的学习率5e-6,以及PPO裁剪阈值ε=0.1。设置KL惩罚系数β=0.2,并在步数减少到0.005。让所有的聊天模型训练350轮迭代,产生了Baichuan 2-7B-Chat和Baichuan 2-13B-Chat。


五、模型安全性

除了在数据清洗或对齐阶段的约束外,模型安全性的提高还源于在所有训练阶段利用正面知识和识别负面知识。根据这一概念,在Baichuan 2培训过程中增强了模型的安全性。

1、预训练阶段

在预训练阶段,密切关注数据安全。整个预训练数据集经过了一个旨在提高安全的严格数据过滤过程。设计了一套规则和模型来消除有害内容,如暴力、色情、种族歧视、仇恨言论等。

此外,整理了一个包含数百万来自数百个知名网站的中英双语数据集,这些网站代表了各种积极价值领域,包括政策、法律、弱势群体、一般价值观、传统美德等方面。将这个数据集的抽样概率提高。

2、对齐阶段

建立了一个由六种攻击类型和100多个细粒度安全值类别组成的红队程序,一个具有传统互联网安全经验的专家标注团队,并为安全对齐提示进行了初始化。从预训练数据集中提取相关片段以创建回应,导致大约1K个已标记的数据进行初始化。

专家标注团队指导一个由50人组成的外包标注团队与初始化的对齐模型进行红蓝对抗,从而生成了200k个攻击提示。

通过采用一种专门的多值监督抽样方法,最大限度地利用攻击数据生成不同安全级别的回应。

在强化学习优化阶段,需要把安全放在第一位:

在安全强化开始时,DPO方法有效地利用有限的带标签数据来提高特定漏洞问题的性能。

通过采用一个奖励模型,整合有益和无害的目标,使用PPO进行安全强化训练。


六、模型评估

实验报告中预训练的基础模型在标准基准上的Free-form generationMultiple-choice的成果。我们在自由形式生成任务和多项选择任务上评估了Baichuan 2。

Free-form generation: 给定一些示例输入(镜头),然后生成续集以获得结果,就像问答、翻译和其他任务一样。
•**Multiple-choice:**给定一个问题和多个选项,任务是选择最合适的候选者。

比较的模型具有与Baichuan 2相似的大小,并且是开源的,因此结果可以重复:

LLaMA(Touvron等人,2023b):Meta训练的语言模型,涉及1万亿个标记。上下文长度为2048,我们评估了LLaMA 7B和LLaMA 13B。

LLaMA 2(Touvron等人,2023c):LLaMA 1的继任者,在2万亿个标记上进行了训练,并改进了数据混合。 • Baichuan 1(Baichuan,2023b):Baichuan 7B在1.2万亿个标记上进行了训练,Baichuan 13B在1.4万亿个标记上进行了训练。两者都专注于英语和中文。

ChatGLM 2-6B(Zeng等人,2022):一款在几个基准测试中表现优异的聊天语言模型。

MPT-7B(MosaicML,2023):一种开源的LLMs,在1万亿个英语文本和代码标记上进行了训练。

Falcon-7B(Penedo等人,2023):一系列在1万亿个标记上进行了训练,并通过精选语料库增强的LLMs。它以Apache 2.0许可证发布。

Vicuna-13B(Chiang等人,2023):由对LLaMA-13B进行微调以适应由ChatGPT生成的对话式数据集而训练的语言模型。

Chinese-Alpaca-Plus-13B(崔等人,2023):由对LLaMA13B进行微调以适应由ChatGPT生成的对话式数据集而训练的语言模型。

XVERSE-13B:这是一个13B的多种语言大型语言模型,已经在超过1.4万亿个标记上进行了训练。


不同聊天模型在安全评估基准上的结果Baichuan 2-13B和Baichuan 2-7B在不同预训练步骤上的评估结果。


七、往期文章回顾

归来仍是少年:大模型中的人工反馈强化学习详解归来仍是少年:开源baichuan 7b聊天大模型归来仍是少年:LLM(大语言模型)部署加速方法归来仍是少年:开源LLM大模型位置编码探索归来仍是少年:LLM大模型低资源微调p tuning v2和lora区别


八、原文链接

https://baichuan-paper.oss-cn-beijing.aliyuncs.com/Baichuan2-technical-report.pdf



本文地址:https://www.6aiq.com/article/1694432400946
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出