Paper name
Baichuan 2: Open Large-scale Language Models
Paper Reading Note
Paper URL: https://cdn.baichuan-ai.com/paper/Baichuan2-technical-report.pdf
Code URL: https://github.com/baichuan-inc/Baichuan2
Blog URL: https://zhuanlan.zhihu.com/p/655984589 https://mp.weixin.qq.com/s/gUBH7Q_lLPiliSRZed_GRA
TL;DR
2023 年百川智能的技术报告,详细介绍了 baichuan2 的研发细节,同时也开源了 7b/13b 系列的基础模型以及经过 SFT/RLHF 微调后的 chat 系列模型,是中文社区中为数不多公开具体细节的大模型技术报告
Introduction
背景
目前大多数优秀的大语言模型是非开源或是对于英语外的语言效果不佳
比如目前有突破的大语言模型和应用(GPT4、PaLM-2、Claude等)都是非开源的 开源的 LLaMA 模型,以及 Bloom 和 Falcon 等开源模型,能够促进大语言模型的研究进展,比如促使了 Alpaca、Vicuna 等工作的诞生。但是目前开源的大语言模型主要是基于英语训练的,比如 LLaMA 的主要训练语料之一的 CommonCrawl(占比 67%),被过滤为只包含英文内容。另外 MPT 和 Falcon 也主要关注于英文 目前急需有面向中文场景的开源大语言模型
本文方案
本文提出了 Baichuan2
提出 baichuan2-7b 和 baichuan2-13b,这两个模型都是在2.6万亿令牌上进行训练的,比 Baichuan 1 的数据集大了一倍多。
在像 MMLU、CMMLU 和 C-Eval 等一般基准上,Baichuan 2-7B 的性能比 Baichuan 1-7B 提高了近 30%。具体来说,Baichuan 2 优化了数学和代码问题的性能
GSM8K 和 humaneval 几乎涨点一倍 在医疗和法律上也有提升,比如 MedQA 和 JEC-QA 数据集 提出 Baichuan 2-7B-Chat 和 Baichuan 2-13B-Chat,经过微调后的对话模型 为了推动研究合作和持续改进,还发布了 Baichuan 2 在各个训练阶段的检查点,从 2000 亿 token 到完整的 2.6 万亿 token 分享一些通过训练 Baichuan 2 获得的试验、错误和经验教训
Methods
预训练
预训练数据
在数据获取过程中,我们的目标是追求全面的数据可伸缩性和代表性。我们从各种来源获取数据,包括一般的互联网网页、书籍、研究论文、代码库等,以构建一个广泛的世界知识系统。
数据处理
对于数据处理,我们关注数据的频率和质量。数据的频率依赖于聚类和去重。我们构建了一个支持 LSH-like 特征和密集嵌入特征的大规模去重和聚类系统。这个系统可以在几小时内对万亿级别的数据进行聚类和去重。基于聚类,个别文档、段落和句子都被去重并评分。这些评分然后用于预训练中的数据抽样。在数据处理的不同阶段,训练数据的大小如下图所示,绝对匹配去重 29.89% 数据,启发式方法去除 1.77%,句子级别的质量过滤 3%,句子级别和段落级别去重 14.47%,文档级别去重 19.13%
模型架构
tokenizer 设计
分词器需要平衡两个关键因素:利于高效推理的高压缩率 和适当大小的词汇表,以确保每个词嵌入的充分训练 。我们考虑了这两个方面。我们将词汇表的大小从 Baichuan 1 的 64,000 扩展到 125,696,旨在在计算效率和模型性能之间取得平衡 使用 SentencePiece 的字节对编码(BPE)来对数据进行 tokenize 处理 没有对输入文本应用任何规范化,并且没有像 Baichuan 1 那样添加虚拟前缀 将数字拆分成单个数字以更好地编码数字数据 为了处理包含额外空格的代码数据,我们向分词器添加了仅包含空格的 token。字符覆盖率设置为 0.9999,罕见字符回退到 UTF-8 字节 将最大 token 长度设置为 32,以考虑长的中文短语。Baichuan2 分词器的训练数据来自 Baichuan2 预训练语料库,包括对于代码示例和学术论文更多采样以提高覆盖率
位置编码
Baichuan 2-7B 采用了 Rotary Positional Embedding,对于 Baichuan 2-13B,采用了 ALiBi
ALiBi 是一种较新的位置编码技术,已经显示出更好的外推性能。然而,大多数开源模型使用 RoPE 作为位置嵌入,并且像 Flash Attention 这样的优化的注意力实现目前更适合 RoPE,因为它是基于乘法的,无需将 attention_mask 传递给注意力操作 然而,在初步实验中,位置嵌入的选择对模型性能影响不大。为了进一步研究基于偏置和基于乘法的注意力,我们在 Baichuan 2-7B 上应用 RoPE,而在 Baichuan 2-13B 上应用 ALiBi,与 Baichuan 1 保持一致
激活函数和归一化
使用 SwiGLU 激活函数,是 GLU 的变体,有一定效果提升 SwiGLU 具有一个“双线性”层,并包含三个参数矩阵,与传统的 Transformer 的前馈层不同,后者只有两个矩阵,因此我们将 hidden size 大小从原始 hidden size 大小的 4 倍减少到
8
3
\frac{8}{3}
3 8 倍 hidden size 大小,并四舍五入到 128 的倍数 对于 Baichuan 2 的注意力层,采用了 xFormers2 实现的高效内存注意力。通过利用 xFormers 的优化注意力和偏置功能,可以高效地将 ALiBi 的基于偏置的位置编码整合进来,同时减少内存开销。这为 Baichuan 2 大规模训练提供了性能和效率上的好处 对 Transformer 块的输入应用了 Layer Normalization,这对于热身阶段调度更加稳健。此外,我们使用了 RMSNorm,它只计算输入特征的方差以提高效率
优化器
使用 AdamW ,其中 β1 和 β2 分别设置为 0.9 和 0.95。我们采用了权重衰减(weight decay)为 0.1,并将梯度范数(grad norm)剪裁为 0.5。
模型在经过 2,000 个线性缩放步骤进行 warmup 后,达到最大学习率,然后应用余弦衰减(cosine decay)到最小学习率
整个模型使用了 BFloat16 混合精度(mixed precision)进行训练。与 Float16 相比,BFloat16 具有更好的动态范围,使其在训练大型语言模型时更加稳健。然而,BFloat16 的低精度在某些情况下会引发问题。例如,在一些公共的 RoPE 和 ALibi 实现中,当整数超过 256 时,torch.arange 操作会发生冲突,导致附近位置无法区分。因此,我们在一些值敏感的操作(如位置嵌入)中使用全精度。
NormHead
为了稳定训练并提高模型性能,我们对输出嵌入(也称为“head”)进行了归一化。NormHead 在我们的实验中有两个优点:
首先,在初步实验中,我们发现头部的范数容易不稳定。在训练过程中,罕见 token 的嵌入范数会变小,扰乱了训练动态。NormHead 可以显著稳定动态 其次,我们发现语义信息主要通过嵌入的余弦相似性而不是 L2 距离来编码。由于当前的线性分类器通过点积计算 logits,这是 L2 距离和余弦相似性的混合。NormHead 减轻了计算 logits 时 L2 距离的干扰
通过一个词嵌入的 KNN 检索任务,验证了基于余弦距离检索的词汇是语义相近的,但是 l2 距离检索的词汇是几乎无关的 本文做了一个验证性实验,在 7B 模型的 softmax 层之前增加了 NormHead,loss 收敛更为稳定 Max-z 损失:
在训练过程中,我们发现 LLMs 的 logits 可能变得非常大。虽然 softmax 函数对于绝对的 logits 值是不敏感的,因为它仅依赖于它们的相对值。但是大的 logits 在推理过程中会引发问题,因为常见的重复惩罚实现(例如模型生成中的 Hugging Face 实现 )会直接应用于 logits 的标量(例如 1.1 或 1.2)。以这种方式压缩非常大的 logits 可以显著改变 softmax 之后的概率,使模型对重复惩罚超参数的选择变得敏感。受到 NormSoftmax 和 PaLM 的辅助 z-loss 的启发,我们添加了一个 max-z 损失来归一化 logits: 其中 z 是最大的 logits 值。这有助于稳定训练,并使推理更加健壮,对超参数更具鲁棒性。下图显示了 Baichuan 2-7B 和 Baichuan 2-13B 的最终训练损失
Scaling Laws
Neural scaling laws 指错误率随着训练集大小、模型大小或两者之一的幂函数减小,使得在深度学习和大型语言模型的训练变得越来越昂贵时,能够保证性能。在训练数十亿参数的大型语言模型之前,我们首先训练了一些小型模型,并拟合了训练更大模型的缩放定律。 我们启动了一系列模型尺寸,从 10M 到 3B 不等,大小范围从最终模型的 1/1000 到1/10,每个模型都在高达 1 万亿 token 的数据上进行训练,使用一致的超参数和来自Baichuan2 的相同数据集。根据不同模型的最终损失,我们可以获得从训练 FLOPs 到目标损失的映射关系。为了拟合模型的缩放定律,我们采用了 Scaling laws for autoregressive generative modeling 论文中提供的公式: 其中
L
∞
L_{\infty}
L ∞ 是不可减小的损失,第一项是可减小的损失,它被构建为幂律缩放项。C是训练 FLOPs,而
L
C
L_{C}
L C 是该 FLOPs 下模型的最终损失。我们使用 SciPy 库中的 curve_fit
函数来拟合参数。最终拟合的缩放曲线和预测的 70 亿和 130 亿参数模型的最终损失如下图所示。我们可以看到,拟合的缩放定律高度准确地预测了Baichuan 2 的最终损失
Infrastructure
机器调度算法:高效地利用现有的GPU资源在今天的大型语言模型的训练和开发中起着至关重要的作用。为了实现这一目标,我们开发了一种弹性训练框架和智能集群调度策略的协同设计方法。由于我们的 GPU 资源被多个用户和任务共享,每个任务的具体行为是不可预测的,这经常导致集群内部的 GPU 节点处于空闲状态。考虑到一台配备了八个 A800 GPU 的单机已经足以满足我们 Baichuan 7B 和 Baichuan 13B 模型的内存需求,我们的训练框架的主要设计标准是机器级的弹性 ,它支持根据集群状态动态修改任务资源,因此它成为我们智能调度算法的基础 训练框架集成了张量并行性 和 ZeRO 支持的数据并行性 ,其中我们在每台机器内设置了张量并行性,并采用了 ZeRO 共享数据并行性,以实现跨机器的弹性扩展。此外,我们采用了一种张量分割技术,其中我们将某些计算分割以减少内存消耗峰值,例如具有大词汇表的交叉熵计算。这种方法使我们能够满足内存需求,而无需额外的计算和通信,从而使系统更加高效。 为了进一步加速训练而不影响模型的准确性,我们实施了混合精度训练,其中我们在 BFloat16 中执行前向和反向计算,同时在 Float32 中执行优化器更新 。此外,为了有效地将我们的训练集群扩展到数千个 GPU,我们集成了以下技术,以避免通信效率的降低:
拓扑感知的分布式训练 。在大规模集群中,网络连接通常跨越多层交换机。我们战略性地安排了分布式训练的排名,以最小化跨不同交换机的频繁访问,从而降低延迟,提高整体训练效率。ZeRO 的混合和分层分区 。通过在 GPU 之间分区参数,ZeRO3 减少了内存消耗,但增加了额外的全局通信。当扩展到数千个 GPU 时,这种方法将导致显著的通信瓶颈。为了解决这个问题,我们提出了一种混合和分层分区方案。具体来说,我们的框架首先将优化器状态分区到所有 GPU 上,然后自适应地决定哪些层需要激活 ZeRO3,以及是否分层分区参数 。通过集成这些策略,我们的系统能够在 1,024 个 NVIDIA A800 GPU 上高效训练 Baichuan 2-7B 和 Baichuan 2-13B 模型,实现了超过 180 TFLOPS 的计算效率。
对齐(Alignment)
经过对齐步骤得到 Baichuan2-7B-Chat 和 Baichuan2-13B-Chat 对齐步骤包括 SFT和 RLHF
SFT
在监督微调阶段,我们使用人工标注员对从各种数据源收集的提示进行注释。根据与Claude(2023)类似的关键原则,每个提示都被标记为有帮助或无害。为了验证数据质量,我们使用了交叉验证的方法——一位权威的标注员检查了由特定众包工作组标注的样本批次的质量,拒绝任何不符合我们质量标准的批次。我们收集了超过 100,000 个监督微调样本 ,并在它们上训练了我们的基础模型。
RLHF
接下来,我们通过RLHF方法明确了强化学习过程,以进一步提高结果。RLHF的整个过程,包括RM和RL训练,如下图所示
reward model :为所有提示设计了一个三层分类系统,包括 6 个主要类别、30 个次要类别和 200 多个三级类别。从用户的角度来看,我们的分类系统旨在全面涵盖所有类型的用户需求。从奖励模型训练的角度来看,每个类别内的提示应具有足够的多样性,以确保奖励模型能够很好地泛化。
给定一个提示,不同大小和阶段(SFT、PPO)的 Baichuan 2 模型生成响应以增强响应的多样性。在 RM 训练中,只使用 Baichuan 2 模型系列生成的响应。其他开源数据集和专有模型生成的响应不会提高奖励模型的准确性。这也从另一个角度突显了 Baichuan 模型系列的内在一致性。用于训练奖励模型的损失函数与 InstructGPT 中的损失函数一致。从训练得到的奖励模型表现出与 LLaMA2 相一致的性能,表明两个响应之间的分数差异越大,奖励模型的判别准确性越高,如下表所示 PPO :获得奖励模型之后,我们使用 PPO 算法来训练我们的语言模型。我们使用了四个模型:actor 模型(负责生成响应)、reference 模型(用于计算具有固定参数的KL惩罚)、奖励模型(提供整个响应的总体奖励,带有固定参数)和 critic 模型(用于学习每个标记的 value)。
在RLHF训练过程中,critic 模型首先进行了 20 个初始训练步骤的预热。随后,critic 模型和 actor 模型都通过标准的 PPO 算法进行更新。 对于所有模型,我们使用了 0.5 的梯度剪切、恒定的学习率为 5e-6 和 PPO 剪切阈值ε=0.1。我们将 KL 惩罚系数 β 设置为 0.2,并随着步数减小到 0.005。 我们对所有的聊天模型进行了 350 次迭代的训练,从而得到了Baichuan 2-7B-Chat和Baichuan 2-13B-Chat。
安全性
我们认为,模型的安全性改进不仅来源于数据清理或对齐阶段的约束,还来源于在所有训练阶段中利用积极知识并识别负面知识。基于这一理念,我们在整个Baichuan 2训练过程中增强了模型的安全性。
预训练阶段
在预训练阶段,我们特别关注数据的安全性
整个预训练数据集经历了严格的数据过滤过程,旨在提高安全性。 设计了一套规则和模型来消除暴力、色情、种族歧视、仇恨言论等有害内容 此外,我们策划了一个中英双语数据集,包括数百个值得信赖的网站上的数百万网页,代表了各种积极价值领域,包括政策、法律、弱势群体、普遍价值观、传统美德等等。我们还增加了对这个数据集的抽样概率。
对齐阶段
对齐阶段我们建立了一个 red-teaming 测试程序,包括 6 种攻击类型和 100 多个细粒度的安全价值类别,一个由 10 名具有传统互联网安全经验的专家注释团队初始化了安全对齐提示。从预训练数据集中检索相关片段以创建响应,结果是大约有 1 千个初始化的注释数据。
专家注释团队通过与初始化的对齐模型进行红蓝对抗,指导了一个 50 人的外包注释团队,从而生成了 200K 个攻击提示。 通过使用专门的多值监督抽样方法,我们最大程度地利用攻击数据以生成具有不同安全级别的响应。 在RL优化阶段,我们还首先考虑了安全性:
在安全性强化初期,DPO 方法高效地利用有限数量的注释数据来增强特定漏洞问题的性能。 通过使用集成了有益和无害目标的奖励模型,进行了 PPO 安全性强化训练
模型评估
Experiments
总体精度
垂类任务精度
评测数据集
JEC-QA:中国国家司法考试,包含多项选择和多项答案的问题,为了和评估工具兼容这里只测试多项选择 CMC:C-Eval(val)、MMLU和CMMLU中的医学相关学科的平均分数(缩写为CMC) MedQA:美国和中国专业医学委员会考试中收集,包括 USMLE、MCMLE和TWMLE三个子集,我们报告USMLE和MCMLE MedMCQA:从印度医学入学考试中收集 评测结果如下:Baichuan 2-7B-Base在中国法律领域超越了GPT-3.5 Turbo、ChatGLM 2-6B和LLaMA 2-7B等模型,仅次于GPT-4。与Baichuan 1-7B相比,Baichuan 2-7B-Base显示出近10个分数的提高。在医学领域,Baichuan 2-7B-Base胜过了ChatGLM 2-6B和LLaMA 2-7B等模型,也在Baichuan 1-7B上取得了显著的改进。
数理和代码性能
只评估了预训练模型的结果,gsm8k 和 math 基于 4-shot 进行评估,Humaneval 使用 0-shot 评估,MBPP 使用 3-shot 评估。达到超过 llama2 的水平
多语言性能
使用 Flores-101 评估多语言能力,Flores-101覆盖了来自世界各地的101种语言。其数据来自各个领域,如新闻、旅游指南和书籍。我们选择了联合国的官方语言(阿拉伯语(ar)、中文(zh)、英语(en)、法语(fr)、俄语(ru)和西班牙语(es)),以及德语(de)和日语(ja)作为测试语言。我们在Flores-101的七个子任务中进行了8-shot测试,包括zh-en、zh-fr、zh-es、zh-ar、zh-ru、zh-ja和zh-de。 评测结果:Baichuan 2-7B-Base在所有七个任务中超越了相同规模的所有模型,并与Baichuan 1-7B相比显示出显著的改进。Baichuan 2-13B-Base在七个任务中的四个任务中超越了相同规模的模型。在zh-en和zh-ja任务中,它超越了GPT3.5 Turbo并达到了GPT-4的水平。
安全性评估
Baichuan 2 安全对齐前后的有益性和无害性。x 轴显示了安全对齐之前的度量标准,y 轴显示了之后的结果。我们可以看到,在这个过程之后,有益性基本保持不变,而无害性显着提高(上三角区域的质量更大)
使用 Toxigen 数据集评测,效果优于 llama2
收到 BeaverTails 启发,构建了 Baichuan Harmless Evaluation Dataset (BHED) 安全性评估数据集,包含 bias/discrimination, insults/profanity, illegal/unethical content, physical health, mental health, financial privacy, sensitive topics 这 7 个类别。人工先标注 1400 个数据,然后基于self-instruction 扩充到 70000 个样本。这里基于微调后的 chat 模型测试,在安全性方面超过其他模型:
不同训练 iteration 模型的结果消融
从 220b token 到 2640b token 的模型结果都进行了评测,ceval 显示了明显的饱和现象
Thoughts
技术报告展示的技术细节已经接近于 llama2 了,适合看一下了解目前国内大模型创业公司具体在做的工作(训练集群搭建、数据收集清洗、预训练、sft、rlhf、模型评估) 其中预训练模型的训练方式和评估结果很详细,chat 模型的微调流程和相关测试没有过多介绍,chat 模型只在内部的安全评估数据集上报告了相关精度,猜测是 baichuan 的微调技术不够成熟到公开或特意有一定保留