BaiChuan2技术报告细节分享&个人想法
写在前面
大家好,我是刘聪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攻击性提示,进行模型安全性对齐训练。
效果评估
先把“绝群”打在屏幕上。通用榜单评测如下:
垂域榜单评测如下:
数学&代码榜单评测如下:
PS:有一点不明白的是,为什么Baichuan报告中上述评测均只对Base模型进行评测,不对Chat模型进行评测。跟群友讨论后,得出几点想法:
榜单中的评测绝大数衡量学科知识以及推理能力,这些能力一般是pretrain阶段获得的能力; Baichuan的Chat模型进行了安全性对齐,会导致模型效果下降; Base模型评测往往输出ABCD概率,Chat模型的输出不好控制(但明明也可以按照ABCD概率输出呀); 发现很多Chat模型比Base模型好的,均没有做对齐步骤,仅为SFT; Baichuan1做过实验,Base模型要比Chat模型好,所以这里才没放Chat模型效果。
安全性榜单评测如下:
虽说毒性内容相对变少,但还是无法避免。
总结
个人感觉Baichuan2的效果提高主要还是来自于预训练数据增多,但很多数据上的细节还是没有交代很清楚,毕竟这才是大模型的最核心。
请多多关注知乎「刘聪NLP」,有问题的朋友也欢迎加我微信「logCong」私聊,交个朋友吧,一起学习,一起进步。我们的口号是“生命不止,学习不停”。
PS:新书已出《ChatGPT原理与实战》,欢迎购买~~。
往期推荐: