LLM训练阶段
训练大模型的三个阶段
- Pre-training stage,也就是预训练阶段,其主要目的是「提高对下一个Token的预测能力」。预训练也就是从零开始创建训练大模型的意思,是基于海量文本、几万亿Token进行的,需要上万张GPU。如果你不理解什么是Token,你就把它理解成每个token就是一个英文单词,了解英语词根的你可以理解为每Token是一个词根,或者汉语中的一个汉字,Token优化技术主要是研究「词向量空间」如何压缩和降维,以节省算力;
- Fine-tuning stage,也就是微调阶段,其主要目的是「提高模型对指令(instruction)的遵循能力」。主要包括Instruction SFT(指令监督微调)、DPO、KTO等技术,本文重点讲解这三类微调技术;
- Prompting stage,也就是使用模型推理阶段,其主要目的是「让模型按照你的期望输出结果」。这个阶段所使用的模型学习技术主要是ICL(In-Context Learning),也就是常说的Prompt Engineering/Template(提示词工程/模版),在调用大模型推理接口的时候把「相关上下文文档」和「你期望的输出结果」一起交给大模型,甚至你可以提示大模型应该怎么执行这个推理过程的步骤;
这里有个问题是,已经有了基于Prompt的In-Context Learning技术,为何还要Fine-Tuning技术呢?
因为大模型推理接口,每次接受的上下文长度是受限制的,比如LLaMa3的上下文长度是8000个Token。那么如何让大模型感知你的比较大的私域数据集、以及你的个人数据偏好,就是Fine-Tuning技术所要解决的问题
模型训练模式
了解了模型训练阶段后,现在有个问题,我们应该在哪个阶段进行微调训练呢?
通常会有以下训练模式进行选择,根据领域任务、领域样本情况、业务的需求我们可以选择合适的训练模式。
模式一:基于base模型+领域任务的SFT;
模式二:基于base模型+领域数据 continue pre-train +领域任务SFT;
模式三:基于base模型+领域数据 continue pre-train +通用任务SFT+领域任务SFT;
模式四:基于base模型+领域数据 continue pre-train +通用任务与领域任务混合SFT;
模式五:基于base模型+领域数据 continue pre-train(混入SFT数据+通用任务与领域任务混合SFT;
模式六:基于chat模型+领域任务SFT;
模式七:基于chat模型+领域数据 continue pre-train +领域任务SFT
是否需要continue pre-train?
大模型的知识来自于pre-train阶段,如果你的领域任务数据集与pre-train的数据集差异较大,比如你的领域任务数据来自公司内部,pre-train训练样本基本不可能覆盖到,那一定要进行continue pre-train。
如果你的领域任务数据量较大(token在1B以上),并只追求领域任务的效果,不考虑通用能力,建议进行continue pre-train。
是选择chat模型,还是base模型?
如果你有一个好的base模型,在base模型基础进行领域数据的SFT与在chat模型上进行SFT,效果上差异不大。
基于chat模型进行领域SFT,会很容导致灾难性遗忘,在进行领域任务SFT之后,模型通用能力会降低,如只追求领域任务的效果,则不用考虑。
如果你的领域任务与通用任务有很大的相关性,那这种二阶段SFT会提升你的领域任务的效果。
如果你既追求领域任务的效果,并且希望通用能力不下降,建议选择base模型作为基座模型。在base模型上进行多任务混合训练,混合训练的时候需要关注各任务间的数据配比。
其他经验
在资源允许的情况下,如只考虑领域任务效果,我会选择模式二;
在资源允许的情况下,如考虑模型综合能力,我会选择模式五;
在资源不允许的情况下,我会考虑模式六;
一般情况下,我们不用进行RLHF微调;
模型量化
量化技术专注于用较少的信息表示数据,同时尽量不损失太多准确性。
Transformers支持三种量化方法:AWQ、GPTQ、 BNB。底层细节我们不必研究
GPTQ是专为GPT模型设计的,AWQ适用于多种模型和任务,包括多模态语言模型。
BNB是将模型量化为8位和4位的最简单选择,4位量化可以与QLoRA一起用于微调量化LLM。
PEFT库
PEFT是Hugging Face提供的库,是一个为大型预训练模型提供多种高效微调方法的python库。
PEFT文档地址:https://hf-mirror.com/docs/peft/index
PEFT可以轻松与Transformers库集成,一起完成模型微调的工作。
微调方式包括LoRA、AdaLoRA、P-tuning等。
补充说明:QLoRA是量化LoRA的缩写,需要把模型量化再进行训练,细节暂不研究。
Fine-Tuning技术
本文主要讲解以Llama Factory Alpaca 训练数据格式为主的微调技术
官网直达:https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README_zh.md
Instruction Supervised Fine-Tuning
在指令监督微调时,instruction 列对应的内容会与 input 列对应的内容拼接后作为人类指令,即人类指令为 instruction\ninput。而 output 列对应的内容为模型回答。
如果指定,system 列对应的内容将被作为系统提示词。
history 列是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。注意在指令监督微调时,历史消息中的回答内容也会被用于模型学习。
点击查看代码
[
{
"instruction": "人类指令(必填)",
"input": "人类输入(选填)",
"output": "模型回答(必填)",
"system": "系统提示词(选填)",
"history": [
["第一轮指令(选填)", "第一轮回答(选填)"],
["第二轮指令(选填)", "第二轮回答(选填)"]
]
}
]
Pre-Training
在预训练时,只有 text 列中的内容会用于模型学习。
点击查看代码
[
{"text": "document"},
{"text": "document"}
]
DPO
偏好数据集用于奖励模型训练、DPO 训练和 ORPO 训练。
它需要在 chosen 列中提供更优的回答,并在 rejected 列中提供更差的回答。
点击查看代码
[
{
"instruction": "人类指令(必填)",
"input": "人类输入(选填)",
"chosen": "优质回答(必填)",
"rejected": "劣质回答(必填)"
}
]
KTO
KTO训练方法是基于人类反馈的强化学习RLHF的一种,数据集需要额外添加一个 kto_tag 列,包含 bool 类型的人类反馈。
点击查看代码
[
{
"instruction": "人类指令(必填)",
"input": "人类输入(选填)",
"output": "模型回答(必填)",
"kto_tag": "人类反馈 [true/false](必填)"
}
]
LLaMa Factory数据集简介
官网直达:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md#数据集
标签:pre,Tuning,SFT,领域,任务,train,LLM,Fine,模型 From: https://www.cnblogs.com/ray1997/p/18225649