[论文笔记]Baichuan 2: Open Large-scale Language Models

[论文笔记]Baichuan 2: Open Large-scale Language Models

dikw

dikw

原文链接:[论文笔记]Baichuan 2: Open Large-scale Language Models - 知乎

贝壳 高级工程师

目录

收起

Abstract

Introduction

Pre-training

数据

数据源

数据清洗

基础架构:

分词器(Tokenizer):

位置编码 :

激活函数和归一化

优化器

NormHead

Max-z loss

Scaling Laws

Infrastructure

Alignment对齐阶段

1 监督微调

2 奖励模型:

3 PPO:

4 训练细节:

评估与总结

Abstract

大型语言模型 (LLMs) 在自然语言任务上展现了出色的性能,减少了对大量特征工程的需求但大多数高效的LLMs主要针对英语或为闭源。本技术报告介绍了Baichuan 2,一个大规模多语言模型系列,包含70亿和130亿参数,基于2.6万亿tokens从零开始训练。Baichuan 2在公开基准测试如MMLU、CMMLU、GSM8K和HumanEval上达到或超过了其他同类开源模型的性能,并在医学和法律等垂直领域表现优异。我们发布所有预训练模型checkpoints,帮助研究社区更好地理解Baichuan 2的训练过程。

Introduction

强调了大型语言模型的重要性和进展,特别是在开源和多语言处理方面的挑战和机会。Baichuan 2作为一个新的多语言模型,旨在解决这些挑战并为社区提供有价值的资源。

  1. 大型语言模型的进展:近年来,大型语言模型(LLMs)的领域取得了显著的进展。模型的规模从数百万参数(如ELMo和GPT-1)增长到数十亿甚至数万亿参数(如GPT-3、PaLM和Switch Transformers)。这种规模的增长显著提高了语言模型的能力,使其能够更具人性化地流利地执行各种自然语言任务。特别是OpenAI的ChatGPT展示了这些模型在各种领域生成类似人类的文本的能力。
  2. 开源与封闭的模型:尽管LLMs取得了令人兴奋的突破和应用,但大多数领先的LLMs(如GPT-4、PaLM-2和Claude)仍然是闭源的。这限制了开发者和研究者对完整模型参数的访问,使得社区难以深入研究或微调这些系统。与此相反,完全开源的LLMs(如LLaMA、OPT、Bloom、MPT和Falcon)为研究者提供了自由访问模型的机会,从而加速了该领域的研究和进展。
  3. 中文模型的缺失:大多数开源的大型语言模型主要集中在英语上。例如,LLaMA的主要数据来源是Common Crawl,它包含了LLaMA的预训练数据的67%,但被过滤为仅包含英文内容。其他开源LLMs(如MPT和Falcon)也主要关注英语,并且在其他语言上的能力有限。
  4. Baichuan 2的介绍:本技术报告介绍了Baichuan 2,一系列大型多语言语言模型。Baichuan 2有两个独立的模型:Baichuan 2-7B(70亿参数)和Baichuan 2-13B(130亿参数)。这两个模型都在2.6万亿tokens上进行了训练。Baichuan 2在各种基准测试上都取得了显著的进步,并且在医学和法律领域也表现出色。
  5. 开放资源:为了促进研究合作和持续改进,作者还发布了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字节。

Tokenzier对比

位置编码 :

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的时候,训练变得非常不稳定。

有无NormalHead训练对比

Max-z loss

洞察:

使用deepspeed训练过程中会出现明显的logits变得非常大的情况,对于这个情况笔者在deepspeed的issue上面搜索了一下发现有人提到了类似的BUG。所以除了pretraining的时候会出现这种BUG,是否SFT的时候deepspeed应该也存在logits漂移变大的情况?
由于repetition penalty的存在,largit logits会导致推理的时候存在问题,非常大的 logits 可以显着改变 softmax 之后的概率,使模型对重复惩罚超参数的选择敏感。
基于NormSoftmax 的启发,百川团队提供了一个Max-z的辅助loss来解决这种情况
Lmax-z =2e−4∗z2

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阶段总共使用了10万条SFT数据。

2 奖励模型

我们为所有提示设计了一个三层分类系统,包括6个主要类别、30个次要类别和超过200个三级类别。从用户的角度看,我们希望分类系统全面覆盖所有类型的用户需求。从奖励模型训练的角度看,每个类别中的提示应该有足够的多样性,以确保奖励模型能够很好地泛化。

细节:

RM模型在不同差距的pair数据上面的准确率

洞察:

RM数据使用百川 2 个不同大小的模型和阶段 (SFT, PPO) 模型生成响应以增强响应多样性。RM 训练中只使用了百川 2 模型家族生成的response来自其他开源数据集和专有模型的response并没有提高奖励模型的准确性。这也强调了百川模型系列从另一个角度的内在一致性。这里说明了偏好数据必须来自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。

PPO迭代流程

评估与总结

看上去百川2训练到百川1相同的tokens数时候在ceval和cmmlu分数其实差不太多,说明百川2的主要提升还是由于数据,大力出奇迹是有道理的!

发布于 2023-09-11 16:57・IP 属地北京

猜你喜欢

转载自blog.csdn.net/sinat_37574187/article/details/133101991