今天我们从论文中观察,百川智能的baichuan2好在哪里。
近年来,大语言模型领域取得了令人瞩目的进步。语言模型的规模已经从数百万参数(如 ELMo、GPT-1)增长到了数十亿甚至数千亿参数,例如 GPT-3、PaLM 和 Switch Transformers。这种规模的增大导致了语言模型能力的显著提高,使其能够更像人类一样流利地表达,并具备执行各种自然语言任务的能力。随着 ChatGPT 的发布,这些模型生成类似人类文本的能力引起了广泛关注。ChatGPT 在各种领域都表现出了强大的语言能力,从随意交谈到解释复杂概念。这个突破强调了大语言模型在自动化涉及自然语言生成和理解的任务方面的潜力。
尽管大语言模型取得了令人兴奋的突破和应用,但大多数领先的大语言模型(如 GPT-4、PaLM-2 和 Claude)仍然是闭源的。开发者和研究人员只能有限地访问全模型参数,这使得社区很难深入研究或微调这些系统。在 LLM 领域,更多的开放性和透明度可以加速研究和负责任的开发。LLaMA 是由元宇宙开发的一系列大语言模型,具有高达 650 亿个参数,通过完全开源,极大地有益于 LLM 研究社区。LLaMA 的开放性,以及其他开源 LLM(如 OPT、Bloom、MPT 和 Falcon)的存在,使得研究人员可以自由访问模型。
Baichuan 2,一系列大规模多语言语言模型。Baichuan 2 包含两个独立的模型:Baichuan 2-7B,具有 70 亿参数,以及 Baichuan 2-13B,具有 130 亿参数。这两个模型都在 2.6 万亿个令牌上进行了训练,据我们所知,这是迄今为止最大的训练数据集,超过
Baichuan 1(Baichuan,2023b,a)的两倍。凭借如此庞大的训练数据,Baichuan 2 在 Baichuan 1 上取得了显著的改进。
在诸如 MMLU (Hendrycks et al., 2021a)、CMMLU (Li et al., 2023) 和 C-Eval (Huang et
al., 2023) 等通用基准测试中,Baichuan 2-7B 的性能比 Baichuan 1-7B 高出近 30%。具体来说,Baichuan 2 优化了数学和代码问题上的性能。在 GSM8K (Cobbe et
al., 2021) 和 HumanEval (Chen et al., 2021) 评估中,Baichuan 2 的性能几乎翻了一番。此外,Baichuan 2 还在医疗和法律领域任务上表现出强大的性能。在诸如 MedQA (Jin et al., 2021) 和 JEC-QA (Zhong et
al., 2020) 等基准测试中,Baichuan 2 在其他开源模型中表现优异,使其成为特定领域优化的合适基础模型。
此外,还发布了两个聊天模型,Baichuan 2-7B-Chat 和 Baichuan 2-13B-Chat,优化了遵循人类指令的能力。这些模型在对话和上下文理解方面表现出色。将详细介绍提高 Baichuan 2 安全性的方法。通过开源这些模型,希望社区能够进一步提高大型语言模型的安全性,促进对负责任的 LLM 开发的研究。
此外,为了促进研究合作和不断改进,还将发布 Baichuan 2 在各个训练阶段(从 2000 亿个令牌到完整的 2.6 万亿个令牌)的检查点。发现,即使对于 70 亿参数的模型,在训练超过 2.6 万亿个令牌后,性能仍在继续提高。通过分享这些中间结果,希望为社区提供有关 Baichuan 2 训练动态的更大洞察。了解这些动态对于揭示大型语言模型的内在工作机制至关重要(Biderman et al., 2023a; Tirumala et al., 2022)。相信,检查点的发布将为这一迅速发展的领域的进一步进步铺平道路。
在本技术报告中,将分享在训练 Baichuan 2 过程中遇到的一些尝试、错误和经验教训。在下面的章节中,将详细介绍对 vanilla Transformer 架构和训练方法所做的详细修改。然后,将描述微调方法,以将基础模型与人类偏好对齐。最后,我们将在我们的模型与其他 LLM 之间的性能进行基准测试。在整个报告中,旨在提供关于过程的透明度,包括不成功的实验,以促进开发 LLM 的集体知识。Baichuan 2 的基础模型和聊天模型可供研究和商业使用,地址为 https://github.com/baichuan-inc/Baichuan2。
预训练原理
本节将介绍 Baichuan 2 基础模型的训练过程。在详细介绍模型之前,我们首先在表 1 中展示了 Baichuan 2 基础模型与其他开源或闭源模型的整体性能对比。然后,我们描述了预训练数据和数据处理方法。接下来,我们将详细介绍 Baichuan 2 的架构和扩展结果。最后,我们将描述分布式训练系统。
预训练数据集
数据来源:在数据收集过程中,我们的目标是追求数据的全面可扩展性和代表性。我们从包括普通互联网网页、书籍、研究论文、代码库等多个来源收集数据,以构建一个全面的世界知识体系。训练语料库的组成如图 1 所示。
数据处理:在数据处理方面,我们关注数据的频率和质量。数据频率依赖于聚类和去重。我们构建了一个支持 LSH-like 特征和密集嵌入特征的大规模去重和聚类系统。这个系统可以在几个小时内对亿级规模的数据进行聚类和去重。基于聚类,单独的文档,
令牌
分词器需要平衡两个关键因素:一是为了高效的推理,需要具有高压缩率;二是需要具有适当大小的词汇表,以确保每个词嵌入的充分训练。我们已经考虑到了这两个方面。我们将词汇表大小从 Baichuan 1 的 64,000 扩大到了 125,696,旨在在计算效率和模型性能之间达到平衡。
我们使用来自 SentencePiece(Kudo 和 Richardson,2018)的 byte-pair encoding(BPE)对数据进行分词。具体来说,我们不对输入文本进行任何归一化处理,并且我们不再像 Baichuan 1 那样添加一个虚拟前缀。我们将数字拆分成单个数字以更好地编码数值数据。为了处理包含额外空格的代码数据,我们在分词器中添加了仅包含空格的令牌。字符覆盖率设置为 0.9999,稀有字符回退到 UTF-8 字节。
我们将最大令牌长度设置为 32,以考虑长的中文短语。Baichuan 2 分词器的训练数据来自 Baichuan 2 预训练语料库,通过更多抽样的代码示例和学术论文来提高覆盖率(Taylor 等人,2022)。表 2 详细比较了 Baichuan 2 的分词器与其他分词器的差异。
位置编码
基于 Baichuan 1,我们为
Baichuan 2-7B 采用旋转位置嵌入(RoPE)(Su
等人,2021),为 Baichuan 2-13B 采用 ALiBi(Press 等人,2021)。ALiBi 是一种较新的位置编码技术,已经显示出改进的外推性能。然而,大多数开源模型都使用 RoPE 作为位置嵌入,优化注意力实现如 Flash Attention(Dao 等人,2022;Dao,2023)目前更适合 RoPE,因为它是基于乘法的,无需将 attention_mask 传递给注意力操作。尽管如此,在初步实验中,位置嵌入的选择并未显著影响模型性能。为了进一步研究基于偏见的乘法注意力,我们遵循 Baichuan 1 的做法,在 Baichuan 2-7B 上应用 RoPE,在 Baichuan 2-13B 上应用 ALiBi。
激活函数和归一化
我们使用 SwiGLU(Shazeer,2020)激活函数,这是 GLU(Dauphin
等人,2017)的一个开关激活变体,表现出更好的结果。然而,SwiGLU
有一个 "双线性" 层,包含三个参数矩阵,与普通 Transformer 的前馈层有两个矩阵不同,所以我们将隐藏层大小从 4 倍的隐藏层大小减少到 8 倍的隐藏层大小,并四舍五入为 128 的乘积。
对于 Baichuan 2 的注意力层,我们采用 xFormers2(Rabe 和
Staats,2021)实现的记忆高效注意力。通过利用
xFormers 的优化注意力与偏见能力,我们可以在减少内存开销的同时,高效地集成 ALiBi 的基于偏见的位置编码。这为 Baichuan 2 的大规模训练提供了性能和效率优势。
我们应用层归一化(Ba 等人,2016)到 Transformer 块的输入,这对暖机计划(Xiong 等人,2020)更具鲁棒性。此外,我们使用 Zhang 和 Sennrich(2019)引入的
RMSNorm 实现,它只计算输入特征的方差以提高效率。
优化器
我们在训练过程中使用了 AdamW(Loshchilov
和 Hutter,2017)优化器。β1 和 β2 分别设置为 0.9 和 0.95。我们使用权重衰减(weight decay)和 0.1,并将梯度范数剪裁到 0.5。模型首先使用 2,000 个线性缩放步长进行暖机,达到最大学习率,然后应用余弦衰减(cosine
decay)到最小学习率。表 3 中显示了参数详细信息和学习率。
整个模型都使用 BFloat16 混合精度训练。与 Float16 相比,BFloat16 具有更好的动态范围,使它在训练大型语言模型时对大型值更鲁棒。然而,BFloat16 的低精度在某些情况下会导致问题。例如,在某些公开的 RoPE 和 ALibi 实现中,由于整数超过 256,导致 torch.arange 操作失败,防止了附近位置的微分。因此,我们使用全精度对于一些值敏感的操作,例如位置嵌入。
NormHead:为了稳定训练并提高模型性能,我们对输出嵌入(也称为“头”)进行归一化。在我们的实验中,NormHead
有两个优点。首先,在初步实验中,我们发现头的范数容易不稳定。在训练过程中,稀有令牌的嵌入范数会变小,从而干扰训练动态。NormHead 可以显著稳定这种动态。其次,我们发现语义信息主要由嵌入之间的余弦相似度编码,而不是 L2 距离。由于当前的线性分类器通过点积计算 logits,这是 L2 距离和余弦相似度的混合。NormHead 减轻了在计算 logits 时 L2 距离的干扰。更多细节,请参见附录 C。
Max-z 损失:在训练过程中,我们发现 LLM 的
logits 可能变得非常大。尽管 softmax 函数对
logit 的绝对值一无所知,因为它只依赖于它们的相对值。大的 logits 在推断过程中会导致问题,因为常见的重复惩罚实现(例如 Hugging Face 实现 3 在
model.generate 中)将标量(例如 1.1 或
1.2)直接应用于 logits。这样收缩非常大的
logits 会显著改变软阈后的概率,使模型对重复惩罚超参数的选择敏感。受到 NormSoftmax
(Jiang et al., 2023b) 和 PaLM (Chowdhery et al., 2022) 的辅助 z 损失的启发,我们添加了一个 max-z 损失来归一化 logits:
Lmax-z = 2e−4 * z^2 (1)
其中 z 是最大的 logit 值。这有助于稳定训练并使推断对超参数更稳健。
神经标度定律,其中误差作为训练集大小、模型大小或两者的幂函数而减小,已经在深度学习和大型语言模型的训练中实现了令人放心的性能。在训练具有数十亿参数的大型语言模型之前,我们首先训练一些小型模型并拟合一个标度定律来训练更大的模型。我们推出了一系列模型大小,从 10M 到 3B,范围从最终模型的
1/1000 到 1/10,每个模型都使用一致的超参数和源自
Baichuan 2 的相同数据集,训练多达 1 万亿个令牌。基于不同模型的最终损失,我们可以获得从训练浮点操作到目标损失的映射。
LC = a × Cb + L∞ (2)
其中 L∞ 是不可约损失,第一项是可约损失,形式化为一个幂律标度项。C 是训练浮点,LC 是在该浮点处的模型最终损失。我们使用 SciPy4 库中的 curve_fit 函数来拟合参数。图 4 中显示了最终拟合的标度曲线以及预测的 70 亿和 130 亿参数模型的最终损失。我们可以看到,拟合的标度定律以高精度预测了
Baichuan 2 的最终损失。
分布式计算优化
高效利用现有的 GPU 资源在训练和开发大型语言模型中起着至关重要的作用。为了实现这一点,我们开发了一种弹性训练框架和智能集群调度策略的协同设计方法。
由于我们的 GPU 在多个用户和任务之间共享,每个任务的具体行为都是不可预测的,通常导致集群内的 GPU 节点空闲。考虑到一台配备 8 个 A800 GPU 的机器可以充分满足我们的 Baichuan 7B 和 Baichuan 13B 模型的内存需求,我们的训练框架的主要设计标准是机器级别的弹性,根据集群状态动态调整任务资源,从而为我们的智能调度算法提供基础。
为了满足机器级别的弹性要求,我们的训练框架集成了张量并行(Narayanan et
al., 2021)和 ZeRO 驱动的数据并行(Rajbhandari
et al., 2020),其中我们在每台机器内设置张量并行,并使用 ZeRO 共享数据并行实现跨机器的弹性缩放。
此外,我们采用了一种张量拆分技术(Nie et al., 2022),将某些计算拆分以降低峰值内存消耗,例如具有大型词汇的交叉熵计算。这种方法使我们能够在不额外计算和通信的情况下满足内存需求,使系统更加高效。
为了在不牺牲模型准确性的情况下进一步加速训练,我们实现了混合精度训练,其中我们使用
BFloat16 进行前向和后向计算,而优化器更新则使用 Float32。
此外,为了将训练集群高效扩展到数千个 GPU,我们整合了以下技术以避免通信效率的下降:
• 面向拓扑的分布式训练。在大规模集群中,网络连接经常跨越多个交换机的层。我们策略性地安排分布式训练的秩,以最小化在不同交换机之间的频繁访问,从而降低延迟,从而提高整体训练效率。
• 适用于 ZeRO 的混合和分层划分。通过在 GPU 之间划分参数,ZeRO3 可以降低内存消耗,但会牺牲额外的全聚集通信。当扩展到数千个 GPU 时,这种方法将导致通信瓶颈(Jiang 等人,2023a)。为了解决这个问题,我们提出了一种混合和分层的划分方案。具体来说,我们的框架首先在所有 GPU 之间划分优化器状态,然后自适应地决定哪些层需要激活 ZeRO3,以及是否分层划分参数。通过整合这些策略,我们的系统能够在 1,024 个 NVIDIA A800 GPU 上高效地训练 Baichuan 2-7B 和 Baichuan 2-13B 模型,实现超过 180 TFLOPS 的计算效率。
Alignment 对齐
Baichuan 2 还引入了对齐程序,产生了两个聊天模型:Baichuan 2-7B-Chat 和 Baichuan 2-13B-Chat。Baichuan 2 的对齐过程涵盖了两个主要组件:监督微调(SFT)和基于人类反馈的强化学习(RLHF)。
监督微调
在监督微调阶段,我们使用人类标签员对从不同数据源收集的提示进行标注。每个提示根据类似于
Claude (2023) 的关键原则被标记为有帮助或有害。为了验证数据质量,我们使用交叉验证——一个权威的标注者检查由特定众包工人组标注的一个样本批次的质量,拒绝任何不符合我们质量标准的批次。
我们收集了超过 100k 个监督微调样本,并在此基础上训练了基础模型。接下来,我们通过 RLHF 方法明确了强化学习过程,以进一步提高结果。图 5 展示了包括 RM 和 RL 训练在内的整个
RLHF 过程。
奖励模型
我们对所有提示设计了一个三层分类系统,包括 6 个主要类别、30 个次要类别和 200 多个三级类别。从用户的角度来看,我们希望分类系统能够全面覆盖所有类型的用户需求。从奖励模型训练的角度来看,每个类别内的提示应该具有足够的多样性,以确保奖励模型具有很好的泛化能力。
训练阶段策略
在监督微调阶段,我们使用人类标签员对从不同数据源收集的提示进行标注。每个提示根据类似于
Claude (2023) 的关键原则被标记为有帮助或有害。为了验证数据质量,我们使用交叉验证——一个权威的标注者检查由特定众包工人组标注的一个样本批次的质量,拒绝任何不符合我们质量标准的批次。
我们收集了超过 100k 个监督微调样本,并在此基础上训练了我们的基础模型。接下来,我们通过 RLHF 方法明确了强化学习过程,以进一步提高结果。RLHF 的整个过程,包括 RM 和 RL 训练,如图 5 所示。
首先,在监督微调阶段,使用人类标签员对提示进行标注。然后,通过 RLHF 方法进行强化学习,以进一步提高模型的结果。整个过程包括 RM 和 RL 训练,如图 5 所示。在这个过程中,为了验证数据质量,使用了交叉验证的方法。
baichuan2为所有提示设计了一个三层的分类系统,包括 6 个主要类别、30 个次要类别和 200 多个三级类别。从用户的角度来看,baichuan2希望分类系统能够全面涵盖所有类型的用户需求。从奖励模型训练的角度来看,每个类别中的提示应该具有足够的多样性,以确保奖励模型能够很好地泛化。
奖励模型在不同响应分数差距上的测试准确性。响应分数差距越大,奖励模型的准确性就越高。这里的差距 1、2、3、4、5 分别对应着不确定、略微更好、稍微更好、更好和显著更好。
给定一个提示,通过不同大小和阶段的 Baichuan 2 模型(SFT,PPO)生成的回答,以增强回答的多样性。只有由 Baichuan 2 模型家族生成的回答才用于奖励模型的训练。来自其他开源数据集和专有模型的回答并不能提高奖励模型的准确性。这也从另一个角度强调了 Baichuan 模型系列的内在一致性。
用于训练奖励模型的损失函数与 InstructGPT 中的一致(Ouyang et al., 2022)。从训练中得到的奖励模型的表现与 LLaMA 2
(Touvron et al., 2023b) 一致,表明两个回答之间的分数差距越大,奖励模型的区分准确性就越高,如表 4 所示。
在获得奖励模型后,我们使用 PPO(Schulman
等人,2017)算法来训练我们的语言模型。我们使用了四个模型:演员模型(负责生成回应)、参考模型(用于计算具有固定参数的 KL 惩罚)、奖励模型(为整个回应提供总体奖励,参数固定)以及批评者模型(旨在学习每个令牌的值)。
在 RLHF 训练过程中,Baichuan
2首先用初始的 20 个训练步骤来预热批评者模型。然后,批评者和演员模型都通过标准的 PPO 算法进行更新。对于所有模型,Baichuan 2都使用了 0.5 的梯度裁剪,常数学习率为 5e-6,PPO 剪切阈值 ϵ = 0.1。Baichuan
2设定了 KL 惩罚系数 β = 0.2,并且在步骤中衰减至 0.005。Baichuan 2对所有聊天模型进行 350 次迭代训练,最终得到了 Baichuan 2-7B-Chat 和 Baichuan 2-13B-Chat。
模型安全性
模型安全性的提升不仅来源于数据清洗或对齐阶段的约束,而且也来源于在所有训练阶段中利用积极知识和识别负面知识。遵循这个理念,在整个 Baichuan 2 训练过程中都加强了模型安全性。
预训练阶段
设计了一套严格的规则和模型来过滤有害的内容,如暴力、色情、种族歧视、仇恨言论等。此外,他们还从数百个信誉良好的网站中收集了数百万个网页,这些网站涵盖了许多积极的价值领域,包括政策、法律、弱势群体、一般价值观、传统美德等等。他们还提高了这个数据集的采样概率。
对齐阶段
对齐阶段的数据安全由一套红队策略的建立过程,主要包括以下几个步骤:
构建红队策略:包括 6 种攻击方式和
100 多种精细的安全值类别。由 10 名具有传统互联网安全经验的专家组成了标注团队,初始化了安全对齐提示。从预训练数据集中检索相关片段以创建响应,导致大约有 1K 个标注数据用于初始化。
红蓝对抗:专家标注团队通过红蓝对抗指导了一个 50 人的外包标注团队,与初始化的对齐模型进行对抗,产生了 200K 个攻击提示。
多值监督采样:采用专用的多值监督采样方法,最大化了攻击数据的利用率,以在各种安全级别下生成响应。
强化学习优化:在强化学习优化阶段,将安全放在首位。在安全增强的开始阶段,DPO(Rafailov 等人,2023)方法有效地利用了有限的标注数据,以提高有关特定漏洞问题的性能。通过采用一个将 Helpful 和 Harmless 目标整合在一起的奖励模型,进行了 PPO 安全强化训练。
模型验证
预训练基础模型在标准基准上的零散或少量拍摄结果。特别地,本文评估了 Baichuan 2
在自由形式生成任务和多项选择任务上的表现。
• 自由形式生成:模型被给予一些样本输入(射击),然后生成继续以获得结果,比如问题回答、翻译等任务。
• 多项选择:模型被给予一个问题和多个选择,任务是选择最合适的候选人。
考虑到各种任务和示例,将开源评估框架(如 lm-evaluation-harness(Gao 等人,2021)和
OpenCompass(OpenCompass,2023))纳入内部实现,以便与其他模型进行公平基准测试。
选择的比较模型与 Baichuan 2 具有相似的尺寸,并且是开源的,因此可以复制结果:
• LLaMA (Touvron 等人,2023b):由 Meta 训练的语言模型,具有 1 万亿个标记。上下文长度为 2,048,我们评估 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):开源 LLM,训练了 1 万亿个英语文本和代码。
• Falcon-7B (Penedo 等人,2023):一系列训练有 1 万亿个标记的 LLM,增强了精选语料库。它根据 Apache 2.0 许可证发布。
• Vicuna-13B (Chiang 等人,2023):通过在 LLaMA-13B 上对 Vicuna 进行微调训练的语言模型。
Chinese-Alpaca-Plus-13B (Cui et al., 2023)
是一个通过在 ChatGPT 生成的对话数据集上对 LLaMA-13B 进行微调训练的语言模型。这个模型可能是为了应对 ChatGPT 在中文对话中的表现不佳而提出的。
XVERSE-13B 是一个 13B 多语言大型语言模型,训练数据超过 1.4 万亿个标记。这个模型可能是为了处理多语言对话任务而设计的。
在整体上的性能表现进行评估和描述
Baichuan 2 基础模型与其他类似大小模型的整体性能对比。他们选择了 8 个基准模型进行比较:
MMLU (Hendrycks et al., 2021a):大规模多任务语言理解,包括一系列学术主题的多选题。
C-Eval (Huang et al., 2023):一个全面的中文评估基准,包括超过 10000 个多选题。
CMMLU (Li et al., 2023):一个专门用于评估语言模型在中文和文化背景下的知识和推理能力的通用评估基准。
AGIEval (Zhong et al., 2023):一个人中心基准,专门设计用于评估人类认知和问题解决等一般能力。
Gaokao (Zhang et al., 2023):一个利用中国高中入学考试问题的评估框架。
BBH (Suzgun et al., 2022):一套挑战性的 BIG-Bench
(Srivastava et al., 2022) 任务,这些任务的语言模型评估没有超过平均人类评分。
GSM8K (Cobbe et al., 2021):一个专注于数学的评估基准。
HumanEval (Chen et al., 2021):一个包含 164 个编程逻辑测试问题的 docstring-to-code 数据集。
对于 CMMLU 和 MMLU,他们采用了官方实现并采用 5-shot 进行评估。对于 BBH,他们采用 3-shot 评估。对于 C-Eval、Gaokao 和 AGIEval,他们只选择 4 个候选人的多选题进行更好的评估。对于 GSM8K,他们采用了来自 OpenCompass (OpenCompass, 2023) 的 4-shot 测试。他们还纳入了 GPT-4 和 GPT-3.5-Turbo7 的结果。除非另有说明,否则本文中的结果都是使用他们内部的评估工具获得的。
整体结果如表 1 所示。与其他类似大小的开源模型相比,模型具有明显的性能优势。特别是在数学和编程问题上,他们的模型表现尤为突出。
出自:https://zhuanlan.zhihu.com/p/655497274