亚马逊AWS官方博客
炼石成丹:大语言模型微调实战系列(一)数据准备篇
背景
随着大型语言模型(LLM)的迅猛发展,如何有效利用这些强大的预训练模型解决特定领域问题已成为生成式 AI 领域的热门话题。微调(Fine-tuning)作为一种关键技术,使我们能够在保留模型通用能力的同时,针对性地提升其在特定任务上的表现。本文将深入探讨大模型微调的常见场景,并详细阐述从数据准备到模型微调的流程。
微调适合的场景
微调常常被应用于增强模型在以下方向的能力:
- 垂直增强:将增强通用大模型专业知识,如医疗、法律、金融等。
- 任务特化:针对场景任务进行优化,如问答系统、文本分类、命名实体识别等。
- 语言本地化:将主要以英语或者汉语为训练语料的模型适应到其他语言。
- 语气风格 :调整模型的输出风格,使其更符合特定的表达方式或语气。
- 安全性增强:通过微调来减少模型产生有害或不当内容的可能性。
随着这些能力的增强, 我们可以看到模型微调被应用在情感陪伴、心理咨询、虚拟教师、心理占卜和游戏 NPC 这些场景下。
微调数据准备
高质量的数据集是微调成功的基础,如何取得高质量数据?
通过数据获取、数据扩增、数据清洗、质量评估以及标准化和格式化,这些步骤将有助于我们获得高质量数据。下面我们将逐一介绍关键的流程:
1. 数据的获取
在数据获取的过程中,我们有以下主要的方案:
(1)互联网抓+人工改写
这种方法可以快速获取大量数据,但需要注意以下几点:从社交网站抓取数据时,虽然可能遇到反抓取机制,但数据通常较为标准化,清洗工作相对简单。而从小说网站抓取数据时,需要进行更复杂的处理,如段落分割、对话提取等。这种方式获取数据较容易,但后续清洗工作较为繁琐。在实际操作中,我们可以使用各种编程语言和库来实现数据抓取,如 Python 的 requests 和 BeautifulSoup 库。抓取完成后,通常需要进行人工审核和改写,以确保数据质量和适用性。
(2)生产数据+人工改写
使用现有的线上数据可以快速构建数据集,但往往需要进行人工改写:
- 线上数据可能来自闭源 LLM 的回答,可能缺乏真实人类对话的特征。
- 人工改写时,需要注意:
- 重写过长或过短的内容,使其更接近自然对话。
- 重写模型拒绝回答的内容(约占 30%)。
- 增加情感表达,避免官腔,使语气更贴近真人。
- 确保内容符合预定的角色背景和定位。
样例:人工改写过程
(3)现有社交平台数据迁移
利用社交平台的真实对话数据可以大大提高微调效果, 我们可以从常见的聊天工具或者社交平台上导出数据,作为训练数据,比如使用开源工具(如 WeChatMsg)将聊天记录导出。不过导出社交平台要注意处理涉及隐私信息(PII)的问题,如姓名、身份证号、电话号码等。
(4)公开数据集
公开数据集也是我们找到数据的重要来源,目前已有多个权威的数据集平台可供使用:
- Kaggle(https://www.kaggle.com/datasets)是最受欢迎的数据集平台之一,该平台托管超过 50,000 个公共数据集,涵盖从医疗保健、经济到体育和娱乐等各种主题。每个数据集都有专属社区。
- 亚马逊开放数据平台(https://registry.opendata.aws/)提供公共交通、航天、生态资源等多个领域的数据集。
- UCI(https://archive.ics.uci.edu/ml/datasets.html)加州大学信息与计算机科学院的一个数据库,包含 100 多个按机器学习问题类型分类的标准数据集。
在角色扮演这个场景下,CAMEL 数据集(https://huggingface.co/datasets/camel-ai/ai_society)是一个大规模的对话数据集,包含约 22.9 万条结构化的多轮对话数据。
通过合理利用这些公开数据集,可以为模型提供丰富的角色扮演训练素材,提升模型的对话能力和角色表现力。
2. 数据清洗
数据清洗是确保数据质量的关键步骤, 通常来说我们需要解决以下问题:
- 移除或匿名化个人识别信息(PII)。
- 纠正拼写和语法错误。
- 去除 HTML 标签、特殊字符和无关内容。
- 过滤掉广告、垃圾信息等干扰内容。
- 删除无关或重复的内容。
- 确保对话的连贯性和逻辑性。
样例:数据集合处理
3. 数据集质量控制
控制数据集质量是一个必要的过程。
数据选择的方式
- 随机抽样检查:人工审核部分数据,确保质量。
- 统计分析:检查数据分布、长度分布、词频等指标。
- 小规模测试:使用部分数据进行初步微调,评估效果。
- 交叉验证:使用不同子集进行多次微调,比较结果一致性。
控制的维度
- 移除重复和近似重复的内容。
- 过滤低质量、无意义的对话。
- 确保内容符合法律法规和伦理要求。
样例:数据集基本统计分析
4. 数据格式化和标准化
统一的数据格式对于微调至关重要:
不同模型可能有自己特定的微调格式,可以使用 Llama_factory 等工具进行统一处理。不同的格式适用的场景也不同,比如 Alpaca 结构简单,适合基础指令微调,ShareGPT 则支持更多的角色种类。
样例:将数据转换为标准格式
5. 数据扩增
数据扩增是准备微调时是一个有可能发生的步骤,但不是必须的。在处理特定领域或任务时,我们往往面临着高质量数据不足的问题。数据扩增技术可以帮助我们在保持数据质量的同时,增加数据的数量和多样性,从而提高模型的泛化能力和性能。
以下是几种常用的数据扩增方法:
- 同义词替换:使用同义词词典或预训练的词嵌入模型,替换句子中的某些词语。这种方法可以增加语言的多样性,同时保持原有的语义。
- 回译:将原文翻译成另一种语言,然后再翻译回来。这种方法可以产生表达相同意思的不同句子结构。
- 文本生成:利用已有的大语言模型生成新的、相似的文本。这种方法可以产生大量的新数据,但需要注意控制生成内容的质量和相关性。
- 上下文扩展:为现有的对话添加更多的上下文信息,使对话更加丰富和自然。
- 句子重组:将长句拆分成短句,或将多个短句组合成长句,增加句子结构的多样性。
在数据扩增的过程中,使用大语言模型(LLM)进行扩增已经成为一种非常有效且创新的方法。这种方法不仅能够生成大量高质量的数据,还能保持数据的语义一致性和多样性。
以下是几种利用 LLM 进行数据扩增的方式,特别适用于角色扮演(roleplay)模型的训练:
基于 Prompt 的数据生成:我们可以使用 LLM 来生成符合特定角色和场景的对话。
LLM 会基于这个提示生成相应的对话,这样我们就可以快速获得大量符合特定角色设定的对话数据。
对话扩展:对于已有的简短对话,我们可以使用 LLM 来扩展它们。
场景变换:我们可以使用 LLM 来将已有的对话转换到不同的场景中。例如:
风格转换:LLM 可以帮助我们将同一段对话转换成不同的语言风格,以增加数据的多样性。
更多内容可以参考 https://github.com/tsaol/finetuning-on-aws/tree/main/data-preparation, 通过结合传统的数据扩增方法和基于 LLM 的扩增技术,我们可以创建一个更加丰富、多样化的训练数据集。这不仅可以提高模型的性能和泛化能力,还可以帮助模型更好地处理各种复杂的对话场景。在角色扮演模型的训练中,这种方法尤其有效,因为它可以帮助模型学习更自然、更符合角色特征的对话方式。
我们也可以通过 Dify workflow 这类 LLM 编排工具,来更加便捷地构建整个流程。
Dify 的 workflow 可以参考链接:https://github.com/tsaol/finetuning-on-aws/blob/main/data-preparation/data-preparation-workflow.yml。
结论
在数据准备过程中,我们需要在数据量和质量之间找到平衡。高质量的数据集虽然可能规模较小,但往往能带来更好的微调效果。同时,我们也要注意数据的多样性,确保覆盖各种可能的场景和表达方式,以提高模型的泛化能力。通过精心准备的数据集,我们可以显著提高微调的效果,使模型更好地适应特定的任务或领域。在接下来的微调过程中,这些高质量的数据将成为模型学习的基石。值得注意的是,数据准备是一个迭代的过程。在初次微调后,我们可能需要根据模型的表现来调整数据集,可能包括添加更多特定类型的样本,或者修改现有样本以纠正模型的错误倾向。持续的数据改进和模型评估循环是达到最佳微调效果的关键。
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。
参考链接
https://github.com/tsaol/finetuning-on-aws
https://www.solwey.com/posts/fine-tuning-large-language-models-a-comprehensive-guide
https://www.kaggle.com/datasets
https://huggingface.co/docs/hub/en/datasets