查看原文
其他

BaiChuan2技术报告细节分享&个人想法

刘聪NLP NLP工作站 2024-04-07

写在前面

大家好,我是刘聪NLP。

已经好久没有动手写东西了,主要是前一阵子一直在忙着新书《ChatGPT原理与实战》的宣传,再加上自己的一点拖延症,明明周一就要写好的BaiChuan2技术报告分析,一直拖到了今天。争取下半个月让自己卷起来,Fighting!

目前比较多的开源模型基本上都是没有一个完整技术报告的,baichuan2这次给了技术报告,已经堪比llama2,是「真开源」。让我们先看一下Baichuan2相较于Baichuan1的区别和提升吧。

主要改进在于:

  • 模型覆盖的语种变多:支持更多语言;
  • 训练数据量增加:数据增多导致模型能力更强;
  • 词表扩张:数据压缩更多,模型解码效率提高;
  • 开源中间步骤模型:更多checkpoint更方便学术研究;
  • 垂域支持:通用模型vs垂域大模型。

下面主要从预训练、人类偏好对齐、模型安全性、模型评估四个方面进行细节分享&说说自己一些想法。

PS:对于新书一直有一个遗憾,就是写书的时候,很多模型都还没有出来,因此决定会定期更新新书的Github,补充一些大模型相关的内容,让知识更加系统,让书更加充实。因此本内容增加在新书的Github中,以作增补内容。

《ChatGPT原理与实战》的Github: https://github.com/liucongg/ChatGPTBook

模型预训练

数据

以前是“有多少人工就有多少智能”,当然现在依然成立,并新增一条“有多少高质量数据就有多少智能”。

在数据采集过程中,为了数据的全面性和代表性,从多个来源进行数据收集,包括但不限于网页、书籍、研究论文、代码等,各类别数据分布如下所示。

PS:我们可以看出法律类数据和健康类(应该包括医疗)数据分别占比2.5%和6.5%(肉眼估计,可能不准确)。数据占比是比较多的,因此猜测“医疗和法律”两个垂域效果好,是因为数据的原因。

并且对数据进行清洗,如下图所示,主要关注数据的频率和质量:

  • 数据频率:借助LSH-like和Embedding特征对数据进行聚类和去重,主要是对每个聚类的簇给文档、段落、句子进行去重和打分,分值用于用于最终的数据采样。
  • 数据质量:句子级别质量过滤,但未说明明确过滤规则。不过从下面模型安全部分可以得知,对数据进行了暴力、色情、种族歧视、仇恨言论等有害内容过滤,但应该还包含其他内容。

PS:报告中没有给出过滤后数据采样比例&数据分布情况,比较遗憾。但从垂域效果来看,医疗和法律数据应该不会少,并且从数据本身质量来看,书籍&论文数据的采样率应该也会比较高。

分词器-Tokenizer

Tokenizer的构建一般考虑两个因素:压缩率和词表大小。

  • 压缩率:主要影响模型的推理效率;
  • 词表大小:主要影响模型大小和Embedding训练的充分程度。

Baichuan2利用SentencePiece中BPE方法构建Tokenizer,从64000扩张到了125696;在构建过程中有以下细节:

  • 原始数据未经过规范化处理;
  • 为了更好地编码数字内容,将数字序列分成单独的数字;
  • 为处理代码中的空格,在词表中额外添加空Token;
  • 字符覆盖率为0.9999,稀有字符利用UTF-8编码;
  • 最长Token的长度为32。

模型结构&训练优化

Baichuan2的模型以Transformer架构为基础,但做了一些小改动。

  • 位置编码:7B的位置编码采用RoPE,13B位置编码采用ALiBi。主要是因为两种位置编码对模型效果基本没影响,所以继承了Baichuan1的7B和13B的位置编码。
  • 激活函数:采用SwiGLU激活函数,不同于传统FFN的2个矩阵,SwiGLU有三个矩阵,因此缩小了隐藏层维度,由原来的4倍变成8/3倍,再调整为128的整数。
  • 归一化:对Transformer的输入进行采用层归一化,提高warm-up的鲁棒性,并用RMSNorm实现。
  • NormHead:为了提高模型训练的稳定性,对输出的embedding进行归一化,主要解决:(1)稀有标记的embedding在训练过程中变小,干扰了训练的动态;(2)分析发现输出表示语义关系受余弦相似度计算明显,对L2距离不明显,归一化可以减少线性分类器通过点积计算logits时,L2距离的影响。
  • Max-z loss:预训练时,logits可能会变的非常大,会导致推理过程中对惩罚因子不敏感,受NormSoftmax启发,对logits进行归约。主要有助于稳定训练并使推理对超参数更具鲁棒性。

缩放定律

通过10M到3B参数模型的训练,利用缩放定律准确地预测了7B和13B模型的最终损失。

并且13B模型的loss与7B模型的loss趋势也符合预期。

Infrastructure

硬扯几句。

主要采用张量并行的方式,对模型参数进行切割,训练过程中每台机器上采用张量并行方式,每台机器间采用Zero数据并行方式。并采用混合精度进行训练,forward和backward采用bf16计算,优化器更新采用float32计算。

为了避免多卡时通信效率的降低,采用Topology-aware distributed training和Topology-aware distributed training。

PS:具有Infra经验的人才是真正的稀缺人才,我们一般几块卡、十几块卡的玩家,根本接触不到这些,经验几乎为零。

人类偏好对齐

SFT

严格对SFT数据进行把关,最终收集100k数据进行模型有监督微调。

PS:100k数据个人感觉太少了,仅对Pretrain模型进行100k的指令微调真的够吗?其实可以构造更多为什么没有使用?个人分析,此处SFT的数据是真的巨高质量的数据,其他很多SFT数据,可以利用MIP的方式,在Pretrain阶段就使用了。

RM

设计了一个三层分类系统全面覆盖所有类型的用户需求,包括6个主要类别、30个二级类别、200多个三级类别。在奖励模型训练时,需要保证每个类别内的数据应该有足够的多样性,以确保奖励模型能够有更好地泛化性。并且奖励数据中结果需要由Baichuan2模型生成,以确保数据分布的统一。

奖励模型的损失与InstructGPT模型一致,并且结果发现,差距越大的结果之间判断的越准确,也符合人类直觉。

PPO

PPO阶段共包含四各模型:actor模型、reference模型、reward模型和critic模型。训练过程中,先对critic模型训练20步预热;再用标准PPO算法对actor模型和critic模型进行更新,其中学习率为5e-6、梯度裁剪为0.5、PPO裁剪阈值为0.1、KL散度惩罚系数为0.2逐步减少到0.005,迭代350次结束模型训练。

PS:并没有明确说明PPO阶段采用了多少prompt,不过有200K attack prompts,但也不清楚采样多少

模型安全性

模型安全性不仅需要模型对齐阶段解决,预训练阶段要需要考虑。

  • 预训练阶段:对数据进行清洗,过滤消除暴力、色情、种族歧视、仇恨言论等有害内容,并且构造了中英安全数据预料包含各种积极价值数据,在数据采样过程中,提高这些数据的采样率。
  • 对齐阶段:10个有传统互联网安全经验的专家构建6种攻击类型和100+细粒度安全价值类别,由50人标注团队生成200k攻击性提示,进行模型安全性对齐训练。

效果评估

先把“绝群”打在屏幕上。通用榜单评测如下:

垂域榜单评测如下:

数学&代码榜单评测如下:

并对预训练中间过程中的checkpoint进行评估,符合预期,预训练步数越多,效果越好。

PS:有一点不明白的是,为什么Baichuan报告中上述评测均只对Base模型进行评测,不对Chat模型进行评测。跟群友讨论后,得出几点想法:

  • 榜单中的评测绝大数衡量学科知识以及推理能力,这些能力一般是pretrain阶段获得的能力;
  • Baichuan的Chat模型进行了安全性对齐,会导致模型效果下降;
  • Base模型评测往往输出ABCD概率,Chat模型的输出不好控制(但明明也可以按照ABCD概率输出呀);
  • 发现很多Chat模型比Base模型好的,均没有做对齐步骤,仅为SFT;
  • Baichuan1做过实验,Base模型要比Chat模型好,所以这里才没放Chat模型效果。

安全性榜单评测如下:

虽说毒性内容相对变少,但还是无法避免。

总结

个人感觉Baichuan2的效果提高主要还是来自于预训练数据增多,但很多数据上的细节还是没有交代很清楚,毕竟这才是大模型的最核心。

请多多关注知乎「刘聪NLP」,有问题的朋友也欢迎加我微信「logCong」私聊,交个朋友吧,一起学习,一起进步。我们的口号是“生命不止,学习不停”。

PS:新书已出《ChatGPT原理与实战》,欢迎购买~~。

往期推荐:


继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存