1. 场景识别
用户进行SFT前需要对应用场景进行识别和分析,一般进行模型微调的诉求是希望提升对应业务场景的能力,用户需要明确哪些能力是需要进行重点提升的。
- 场景划分上来讲,以垂类场景进行划分可分为教育、医疗、金融、法律、电商、旅游、娱乐、人力资源、物流与运输等场景。
- 以语言能力进行划分,可分为信息抽取、阅读理解、创意生成、角色扮演、推理等能力维度。
场景识别和分析的目的在于可以帮助用户更好地去界定需要通过模型微调去提升什么能力,从而更有针对性地进行数据准备、微调配置和评测构建。
2. 数据准备
SFT数据需要根据对应场景能力要求进行准备,比如公文写作场景就需要准备不同公文写作主题的问答数据,数学作业助手场景就需要准备不同类型的数学考题问答数据。准备数据时候需要特别关注数据质量和多样性两个方面,需要确保数据质量相对较好,否则基于质量差的数据进行SFT会拿到反向效果,同时需要注意保持数据中问题和回答的多样性,数据过于雷同会导致模型过拟合以致效果不及预期。
用户经常问到的一个问题是进行有效SFT需要多大数据量,严谨来说目前没有一个广泛认可的答案,通用能力对齐方向,LIMA和AlpaGasus等相关工作表示几千条高质量SFT数据就可以拿到较好的对齐效果,但另一方面在开源大模型实践上,前沿大模型正用到越来越多的数据进行SFT,比如Llama 3模型用到了百万级别的SFT数据。
经验性来讲,普通场景上进行有效SFT一般至少需要上千条精标数据,不同场景和要求下所需的数据量会有差别。需要特别注意的是训练效果好坏并不是说只取决于数据量,也尤其需要考虑数据的多样性和质量,大量内容非常雷同的数据可能不如少量内容较为多样的数据,大量质量差的数据可能不如少量质量好的数据。
以小学数学作业助手应用场景为例,我们需要准备对应的问答数据,数据格式要求上目前百炼平台上SFT模块采用的是ChatML格式,两个简单的SFT数据例子如下所示。
{"messages": [{"role": "user", "content": "Brennan was researching his school project and had to download files from the internet to his computer to use for reference. After downloading 1200 files, he deleted 60% of them because they were not helpful. He downloaded 300 more files but again realized that 4/5 of them were irrelevant. How many valuable files was he left with after deleting the unrelated files he downloaded in the second round?"}, {"role": "assistant", "content": "To find out how many valuable files Brennan was left with, we need to calculate the number of files he kept after each deletion.\n\n1. **First Round:**\n - Brennan initially downloaded 1200 files.\n - He deleted 60% of them because they were not helpful.\n - The number of files deleted = 60% of 1200 = 0.60 * 1200 = 720 files.\n - The number of files he kept = 1200 - 720 = 480 files.\n\n2. **Second Round:**\n - Brennan downloaded an additional 300 files.\n - 4/5 of these files were irrelevant, so he kept 1/5 of them.\n - The number of files he kept from the second round = 1/5 * 300 = 60 files.\n\n3. **Total Valuable Files:**\n - The total number of valuable files Brennan was left with = the number of files he kept from the first round + the number of files he kept from the second round.\n - Total valuable files = 480 + 60 = 540 files.\n\nTherefore, Brennan was left with 540 valuable files after deleting the unrelated files he downloaded in the second round."}]} {"messages": [{"role": "user", "content": "考虑一场由蓝队和熊队进行的冰球比赛。整场比赛共射门40次。如果熊队比蓝队少射门12次,那么两队各射门多少次?"}, {"role": "assistant", "content": "我们用 $B$ 表示蓝队投篮的次数,$T$ 表示熊队投篮的次数。根据题目,我们有以下两个方程:\n\n1. $B + T = 40$ (两队共投了 40 次篮)\n2. $B = T + 12$ (蓝队比熊队多投了 12 次篮)\n\n我们可以通过解这个方程组来找到 $B$ 和 $T$ 的值。\n\n将第二个方程代入第一个方程,我们得到:\n\n\\[T + 12 + T = 40\\]\n\n合并同类项:\n\n\\[2T + 12 = 40\\]\n\n两边同时减去 12:\n\n\\[2T = 28\\]\n\n两边同时除以 2:\n\n\\[T = 14\\]\n\n现在我们知道了 $T = 14$,可以通过将 $T$ 代入一个原方程来找到 $B$ 的值。使用 $B = T + 12$:\n\n\\[B = 14 + 12\\]\n\n\\[B = 26\\]\n\n因此,蓝队投了 26 次篮,而熊队投了 14 次篮。"}]}
准备数据过程中一个常有的问题是数据量不足的问题,从保证数据质量的角度考虑,数据量不足情况下 最好基于专业人员进行数据构造和标注;百炼上目前也有提供基于self-instruct方法的SFT数据增强功能, 在有高质量样例数据且判断模型生成数据可用情况下,可以使用该功能进行数据扩增,用户需要上传一份 精标数据样例文件,在数据增强窗口提交任务进行数据生成。
3. 模型微调
模型微调用户一般比较关注如下几个问题:选择什么模型?用哪种训练方式?超参怎么配置?
3.1 模型选择
以Qwen系列模型的选择为例,模型版本角度,尽量选最新的模型版本,其效果会好一些,比如同等参数量模型Qwen 2系列表现好于Qwen 1.5系列;参数量角度,效果优先考虑情况下,优先选择大参数量模型比如Qwen-Max,而成本和推理速度优先情况下则选择满足用户效果需求的最小参数模型。
3.2 训练方式
训练方式的选择上,目前百炼上提供了全参训练和高效训练(即LoRA训练)两种方式,高效训练通过训练一些额外的低秩矩阵参数达成微调,相对于直接进行全参微调的方式,高效训练对模型通用能力的影响更小。因此,在用户数据量较少或者希望通用能力保留较好的情况下建议优先选择高效训练。
3.3 超参配置
超参配置上,严谨来说,不同场景、不同数据、不同目标需求下需要的超参不一样,因此只能给一些比较宽泛的、经验性的建议,需要结合场景做进一步实验和调整。经验性来讲,用户数据量如果是几千条级别,建议初始尝试epoch可以设置为3~5,如果是万条以上级别,建议epoch可以设置为1~2,具体需要结合实验效果进行判断;高效训练建议学习率取1e-4到1e-5量级,全参训练对应学习率可以稍低一些,学习率调整策略除非用户有比较强先验,否则建议取linear或cosine一类经典配置。LoRA秩值越大,理论上越接近于全参微调,调整alpha值大致等同于调整learning rate,目标模块为Auto相比于ALL,对应调整参数量一般更少,目前配置上百炼默认给了一个版本,无先验情况下可以先按该配置进行训练。
3.4 实践案例
以小学数学作业助手应用场景为例,用户构造了约1万条数据,出于效率考虑选择Qwen Turbo模型,基于该模型进行SFT,对应参数配置如下,在百炼上提交训练任务等待训练完成即可。
4. 能力评测
模型微调完成后,一般会根据具体场景和要求进行能力评测。一般用户进行SFT的诉求是想基于自有行业数据提升对应领域的能力,若用户有标准评测流程,可通过模型部署拿到api接口,接入到自有评价体系进行评测;若用户评测主要靠人工或模型标注,可通过百炼提供的人工评测或自动评测完成。此外,百炼评测模块也提供了如C-Eval、MMLU、GSM8K、BBH等多项评测基准,可直接选择模型提交job进行评测。
以本文使用的小学数学作业助手应用场景为例,考虑GSM8K评测数据集可用于衡量模型简单数学问答能力的强弱,因此可直接在百炼上选中模型和GSM8K评测数据集进行评测。
如下表所示,对比SFT前后模型表现,SFT后模型数学能力有一定提升。
用户使用的基模 | 基于3k条数据进行微调 | 基于10k条数据进行微调 | |
GSM8K评测分数 | 75.74 | 76.35 | 76.8 |
5. 模型部署
用户微调并评测选择好模型后,可直接在百炼平台上进行部署,部署完毕即可通过API调用该模型应用于业务场景上,如下所示,在百炼体验界面上可选中对应模型自动生成API调用示例代码。
6. 常见问题
6.1 效果问题
LLM的SFT与传统机器学习场景类似,同样会面对下面几种失败情况:
- 过拟合:由于训练样本较少、缺乏多样性、以及训练轮数过多的情况,导致模型在新样本上泛化能力较差,一般建议通过提升数据集的多样性来缓解该问题。
- 欠拟合:由于LLM一般具有较大的参数规模,欠拟合的现象,一般是较少的训练轮数和较低的learning rate导致,而不是模型能力导致。
- 灾难性遗忘:很多用户在使用LLM SFT场景下,会担心模型丢失通用能力,现阶段的方法一般是混合通用SFT数据的方式进行缓解,百炼平台提供数据混合的方案,用户可以混入通用数据集缓解通用能力丢失问题。
6.2 模型微调 vs. 知识库检索
当考虑采用模型微调还是知识库检索方案,可以考虑以下几个要素:
- 任务场景:特定领域的任务场景,如任务分类、情感分析、文本排序等NLU任务,以及结构化数据提取、文章总结等NLG任务,一般采用模型微调是较好的选择,模型微调前可以先尝试in-context learning的方案,随着基础模型的能力提升,很多任务场景借助in-context learning可以取得较好的结果。
- 知识更新:相比于采用模型微调更新领域知识,借助知识库检索的方案,能够较低成本支持外部知识的动态更新,以及缓解模型输出的幻觉问题;
- 资源约束:相比于模型微调和部署的成本,知识库检索一般具有更低的使用成本。
- 数据标注:模型微调往往依赖标签数据,在数据标注难以获取的情况下,一种方案是借助数据生成方式进行扩展,备选方式是采用in-context learning和知识库检索的方案。
当然模型微调和知识库检索,也并不是二选一的关系,很多复杂的业务场景,可以综合采用模型微调和知识库检索的技术方案,以客服场景为例,可以借助模型微调可以解决客服回答的语气、表达习惯、自我认知等问题,场景涉及的专业知识可以结合知识库,动态引入到模型上下文中。