输入“/”快速插入内容

模型微调

2024年7月25日修改
2023年11月7日创建
本文讨论了ChatGLM3模型微调相关内容,包括为何微调、适用场景、与知识库对比、参数、数据集格式、注意事项、示例代码及非官方方案等。关键要点包括:
1.
微调适用场景:行业场景如客服助手、智慧医生等;通用场景如NL2SQL、支持工具调用能力。
2.
微调与知识库关系:微调让模型学习新数据,知识库为模型提供外挂数据,二者相辅相成。
3.
微调参数:参数统一放在finetune_demo/configs下,不同配置文件参数有别,涉及数据集位置、模型输入输出长度等。
4.
数据集格式:分仅微调对话能力和微调对话与工具能力两种格式,有对应数据整理要求。
5.
注意事项:工具描述system prompt自动插入,tool角色预处理有转化,暂未实现Code interpreter微调等。
6.
示例代码:含使用广告数据集微调、多卡微调、从保存点微调及调用微调模型代码。
7.
非官方方案:可使用LLaMA - Factory等主流开源训练框架微调,推荐合并Lora模型方便读入。
请配合以下代码库中微调部分代码进行上手练习
为什么需要微调
微调适用的场景
通常来说,适合微调的场景主要分为行业场景和通用场景
对于行业场景:
1.
例如客服助手,智能写作辅导等需要专门的回答范式和预期的场景
2.
例如智慧医生,智慧律师等需要更专业的行业知识和思考能力的场景
对于通用场景:
1.
NL2SQL等输出为指定范式的
2.
支持可调整参数的工具调用等原生模型不具备的能力的
微调 VS 知识库
微调是一种让预先训练好的模型适应特定任务或数据集的低成本方案。这种情况下,模型会学习开发者提供的微调数据。
知识库是使用向量数据库(或者其他数据库)存储数据,可以外挂,作为LLM的行业信息提供方。
简单理解, 微调相当于让大模型去学习了新的一门学科,在回答的时候完成闭卷考试。
知识库相当于为大模型提供了新学科的课本,回答的时候为开卷考试。
知识库和微调并不是冲突的,它们是两种相辅相成的行业解决方案。开发者可以同时使用两种方案来优化模型。例如:
使用微调的技术微调ChatGLM3-6B大模型模拟客服的回答的语气和基础的客服思维。
接着,外挂知识库将最新的问答数据外挂给ChatGLM3-6B,不断更新客服回答的内容信息。
微调参数
配置文件
我们将微调的参数统一放置在finetune_demo/configs下,将会有四个文件
.
├── deepspeed.json
├── lora.yaml
├── ptuning_v2.yaml
└── sft.yaml
分别为 deepspeed运行参数,lora配置文件,ptuningv2 配置文件和全参微调的配置文件。
参数解释
每一份配置文件除了在细节上有一定区别,其他配置大同小异,我们针对每个参数做了简单的解释。
data_config 这些参数是关于数据集的位置
train_file 训练集地址
val_file 验证集地址
test_file 测试集地址
max_input_length微调模型输入的最大长度,默认为128
max_output_length 微调模型输出的最大长度,默认为256
peft_config Huggingface PEFT 框架的相关参数,peft_type 选择高效微调的方式,可以为LORA 或者 PREFIX_TUNING,并需要搭配对应的参数。
如果你选择使用 LORA,则这些参数是必须的
LORA_RANK:这个参数决定了模型参数修改的复杂度和灵活性。较低的秩意味着更少的参数和更快的训练速度,但可能减少模型的灵活性。较高的秩可以提高模型的灵活性,但会增加参数数量和计算负担。我们默认设置为8
lora_alpha是控制LoRA调整幅度的参数。它决定了对原始模型参数的修改程度。较高的lora_alpha值意味着对原始模型参数的更大调整,这可能有助于模型更好地适应新的任务或数据,但也可能导致过拟合。较低的值则意味着较小的调整,可能保持模型的泛化能力,但可能不足以充分适应新任务。我们默认设置为32
lora_dropout指的是在LoRA层应用的dropout比率。这意味着在训练过程中,网络的一部分连接会随机断开,以防止模型过度依赖于训练数据中的特定模式。较高的dropout比率可以增加模型的泛化能力,但也可能导致学习效率降低。我们设置为0.1
target_modules(不可修改的参数): 调整ChatGLM3系列模型必须使用query_key_value,这里没有在配置文件写出。
如果你选择使用PREFIX_TUNING,则这些参数是必须的
num_virtual_tokens指定了在前缀调优中使用的虚拟令牌的数量。这里设置为 100,意味着在每个层前添加 100 个可训练的虚拟令牌。这些虚拟令牌对于引导模型学习特定任务是重要的,因为它们为模型提供了额外的、可调整的上下文信息。
如果你使用 sft 全量微调,则不应该有任何peft_config参数。
training_args这些参数是关于训练中通用的参数
output_dir: 训练过程中输出文件的目录,默认是 ./output
max_steps: 训练的最大步数,这里设置为 10000