大模型(LLMs)训练集面试
整理自:AiGC面试宝典 作者:宁静致远 日期:2023年12月24日
1. SFT(有监督微调)的数据集格式?
一问一答
📝通俗解释:SFT就像教学生做题,先给一道题(问题),再给一个标准答案。学生通过学习问题和答案的对应关系,学会回答类似的问题。
2. RM(奖励模型)的数据格式?
一个问题 + 一条好回答样例 + 一条差回答样例
📝通俗解释:RM训练就像让老师同时给学生展示一份"优秀作文"和一份"不及格作文",通过对比学习,让模型知道什么样的回答是好的,什么样的是不好的。
3. PPO(强化学习)的数据格式?
理论上来说,不需要新增数据。需要提供一些 prompt,可以直接用 SFT 阶段的问。另外,需要限制模型不要偏离原模型太远(PPO loss),也可以直接用 SFT 的数据。
📝通俗解释:PPO阶段就像让模型自己练习做题,只需要给它一些题目(prompt),让它自己生成答案。然后通过奖励机制告诉它哪些答得好、哪些答得不好。同时要防止它"学歪了",所以会加上一些约束。
4. 找数据集哪里找?
推荐 Alpaca-CoT,数据集整理的非常全,眼花缭乱。
📝通俗解释:Alpaca-CoT 是一个开源的数据集仓库,里面收集了各种用于训练大模型的数据,就像一个大型的"题库",什么类型的题目都有。
5. 微调需要多少条数据?
取决于预训练数据和微调任务的数据分布是否一致,分布一致,100条就够,分布差异大就需要多些数据,千条或者万条以上为佳。
自己的任务复杂或者下游任务行业比较冷门,如药品名称识别任务,则需要较多监督数据。还有微调大模型时,一遍是记不住的。100条的微调数据,epochs=20 才能稳定拟合任务要求。
📝通俗解释:这就像学习一门新技能。如果新技能和原来会的技能比较像,学起来就快,100条数据就够了;如果完全不一样,比如让一个通用模型去识别专业药品名称,那就需要更多数据。另外,大模型"忘性大",通常需要多学几遍(多个epochs)才能记住。
6. 有哪些大模型的训练集?
预训练数据集
TogetherComputer/RedPajama-Data-1T("红睡衣"开源计划)
开源计划总共包括三部分:
- 高质量、大规模、高覆盖度的预训练数据集
- 在预训练数据集上训练出的基础模型
- 指令调优数据集和模型,比基本模型更安全、可靠
预训练数据集 RedPajama-Data-1T 已开源,包括七个子集,经过预处理后得到的 token 数量大致可以匹配 Meta 在原始 LLaMA 论文中报告的数量,并且数据预处理相关脚本也已开源。
完整的 RedPajama-Data-1T 数据集需要的存储容量为压缩后 3TB,解压后 5TB。
📝通俗解释:RedPajama 就像一个超大的"百科全书",包含了各种书籍、论文、网页内容,是训练大模型的基础"食材"。3TB压缩后相当于约300部高清电影的大小。
CoT 微调数据集
- Alpaca-CoT:里面包括常用的 Alpaca、CoT 等数据集,有中文的。
📝通俗解释:CoT(Chain of Thought)是一种让模型"展示思考过程"的数据集,就像教学生不仅给出答案,还要写出解题步骤。
7. 进行领域大模型预训练用哪些数据集比较好?
通过分析发现现有的开源大模型进行预训练的过程中会加入论文、行业数据等。主要是因为这些数据的数据质量较高,领域相关性比较强,知识覆盖率(密度)较大,可以让模型更适应考试。
给自己进行大模型预训练的时候提供了一个参考:领域相关的网站内容、新闻内容也是比较重要的数据。
📝通俗解释:训练领域大模型就像培养一个专业医生,需要给他看大量的医学论文和案例,而不是普通的百科全书。这样他才能成为某个领域的专家。
8. 如何选取和构建大模型微调数据?
问题一:什么样的数据才是最优的大模型微调数据?
- 数据的多样性
一般情况下我们数据的分布都是符合一个长尾分布的。主要的几个类别数据占据了90%的数据量,剩下的90%的类别只有10%的数据量。
📝通俗解释:这就跟小红书上的内容一样,美食、穿搭、旅游攻略类的帖子特别多,但关于"大模型微调技巧"的帖子就很少。如果直接用这种不平衡的数据训练,模型会对常见话题很熟练,但对冷门话题一窍不通。
举例: 如果我们直接采样一批线上的图文文本,直接送给标注的话,会存在一个严重的问题:他们标注的数据大部分都是攻略类,技术类比较少,标了3个月才攒了几千条大模型技术文本,但是攻略类已经几万了。这样搞肯定是不行的,人力成本方面的消耗太大了,并且模型因为数据平衡的问题也没有特别好。
- 数据的标注质量
- 数据的不确定性
📝通俗解释:数据质量就像考试题目的准确性,如果题目本身有歧义或者答案错误,那学生(模型)肯定会学偏。另外,有些数据对模型来说"不确定",就是模型看完不太确定自己理解对了没有,这类数据特别值得让模型多学习。
问题二:如何构建大模型微调数据?
方法一:Self-Instruct 框架
通过自我生成来提升指令跟随能力。流程是从语言模型中生成指令、输入和输出样本,然后在使用这些数据微调原始模型之前进行清洗。
📝通俗解释:Self-Instruct 就像让一个学生自己出题自己答,然后老师帮忙筛选和改错。这样可以快速生成大量训练数据,成本低但需要过滤掉质量差的内容。
方法二:主动学习
主动学习有两个基本原则,在监督训练的时候,注意主动发现数据的两个方面:
- 一个是数据多样性
- 一个是数据的不确定性
第一,数据的多样性
多样性即为数据的去重。去重这件事的核心是相似度度量,现在的相似度度量方法大家用的比较多的是基于对比学习构造的语义向量这套思路,当然简单的基于词袋或者 TF-IDF 的方案也是可以的。
📝通俗解释:去重就像从一堆照片里删除重复的。我们可以用"语义相似度"来判断两张图片讲的是不是同一件事,也可以用传统的TF-IDF方法。
有了核心的相似度度量方法后,我们可以使用简单的 one-pass 聚类方法进行过滤,考虑复杂一点的话,我们可以使用带优化目标的聚类:比如 K-Center-Greedy 算法,其约束条件是在最大化多样性的情况下,使指令数据集最小。
📝通俗解释:K-Center-Greedy 就像选代表,从一群人中选出最"不同"的代表,确保每个群体都有代表,但选的总数最少。
进阶技巧:如何找与已有数据"不一样"的数据?
如果我们已经有了一批已经去重的人工处理过的高质量数据,那么我们如何寻找与这批数据不一样的数据呢?
这里有一个非常简单实用的方案:
- 把已有的数据全部当成正样本打上1
- 待筛选的数据全部当成负样本打上0
- 使用 DeBERTa 等构建二分类模型,并进行 K-fold 的交叉验证
- 在交叉验证过程中,选出每一个 fold 过程中的测试集合里概率接近于0的样本
📝通俗解释:这个方法就像建立一个"火眼金睛":先把确定要的数据标记为"对的",待筛选的标记为"待定",然后训练一个分类器找出那些"长得不一样"的数据。类似方法也可以用于数据质量筛选。
第二,数据的不确定性
数据的不确定性主要体现数据的质量筛选上,选取模型学的不太好的数据,模型没有把握的数据。
最简单的,我们可以选出模型对应 PPL(困惑度)值比较差的那批数据。
如果是指令数据的话,比如大模型做题和对应的答案。我们可以把所有选项对应的概率之和计算出来,然后过滤出概率和比较低的那一批数据,这批数据就是模型"不太肯定"的样本,我们需要加强针对性的训练。
📝通俗解释:PPL就像模型的"困惑指数",PPL越高,模型越迷茫。如果模型做题时对所有选项都没把握,说明这道题它没学会,需要重点训练。
当然这样可能有一个副作用,就是这批数据是质量比较差而不是模型学的不太好的。
为此,我们还要借助 Reward Model,这个 Reward Model 是广义的,它是一个质量的二分类模型。可以祭出我们的 DeBERTa,继续用标注数据进行做二分类,进行数据质量的判断。
📝通俗解释:Reward Model 就像一个"质量把关员",专门判断数据的好坏。我们用它来区分"模型不会的题"和"题目本身有问题的题"。
有了质量打分模型后,我们就可以判断一些指令数据的质量高低,并且据此选出模型真正不确定的数据。
这个过程类似于手动的拒绝采样,核心是选择"模型不确定"+"数据质量达标"的那部分数据。
📝通俗解释:这就相当于既要找到学生不会的题,又要确保这些题本身是对的。不能让学生做错题,那样会越学越偏。
总结
监督学习中主动学习的两个基本原则是:
- 寻找多样性的数据
- 寻找模型不确定性的数据
在寻找的过程中,我们使用了一些小技巧:
- 聚类去重
- 对抗半监督过滤
- 自建 Reward 二分类
这几个小技巧学术上没有什么高深莫测的东西,都是实践中总结出来的好用的方法。
📝通俗解释:训练大模型就像培养一个学生,既要让他见多识广(多样性),又要有针对性地补弱项(不确定性)。上面的方法都是实践中摸索出来的"笨办法",但特别实用。