本文主要分享一下大模型微调相关的基本概念,包括大模型(GPT)训练流程、微调(SFT)方法&分类&框架&最佳实践、强化学习(RLHF),最后则是分享了如何训练垂直领域大模型。
本文是参考网上博客、文章后进行总结而成,旨在让刚接触大模型的同学阅读后能对大模型训练的各个阶段有一个大致的概念。大佬可以直接跳过,或者也可以帮忙看下写错没有哈哈~
如果你在阅读过程中发现文中存在错误,请一定留言指正,感谢~
1. 大模型训练流程 ChatGPT 是如何炼成的 ChatGPT 是如何炼成的,或者说如何训练出一个大模型?
GPT 训练流程图如下:
图源:medium.com [1]
图中的 Reward Modeling 和 Reinforcement Learning 可以看做一步,即 RLHF,因此训练一个大模型一般可以分为三步:
1)预训练(Pre Training,PT) :这一阶段是模型训练的基础,利用海量数据、大量算力通过无监督训练得到基座模型 。 海量数据 :一般按 T 计算,最少也是几百 G,数据通常包括从互联网上收集的大规模文本语料库,模型通过学习如何预测下一个词或 tokenLlama 2 是在 2 万亿个 token 上训练的,Llama 2 70B 需要 1720320 GPU 小时 Llama 3 在 24K GPU 集群上训练,使用了 15T 的数据 预训练后的模型具备强大的语言生成能力,但由于它主要是无监督训练的结果,可能不会直接适应具体的任务(如问答、对话),需要进一步的微调。 2)监督微调(Supervised Fine-Tuning, SFT) :这一阶段则是对基座模型进行微调,让模型能够适用特定任务,最终得到一个 SFT 模型 。 微调的目的是让模型更好地理解特定任务的需求。例如,通过使用对话数据集对模型进行微调,可以让模型在遇到问题时生成更相关的答案,而不是简单地生成与问题相似的文本。 这些问答对话由人类准备的,通常是有标签的,包含了问题和答案对,或者其他特定任务的数据。 3)强化学习(Reinforcement Learning from Human Feedback, RLHF) :这一阶段通过引入人类反馈(或者基于人类反馈训练的奖励模型)进一步优化模型的生成质量,使其生成的回答更符合用户的期望和人类的价值观。 Helpful:判断模型遵循用户指令以及推断指令的能力。 Honest:判断模型产生幻觉( 编造事实)的倾向。 Harmless:判断模型的输出是否适当、是否诋毁或包含贬义内容。 由于直接从人类获取反馈的成本较高,通常会先训练一个奖励模型(Reward Model,RM)来代替人类打分,这样可以在 RL 的框架下进行大规模的自动优化。 预训练由于对算力和数据需求都比较大,因此一般玩家不会涉及到预训练,更多的是基于开源的基础模型(LLama、Baichuan、Qwen、ChatGLM...)做微调、强化学习以满足自身需求。
模型名称各部分的含义 以 Qwen1.5-14B-Chat-GQPT-Int4
为例,可以分为 5 个部分,具体含义如下图:
5 个参数含义如下:
模型系列 :一般一个公司、组织的模型都会归属于同一个系列比如阿里的 Qwen 系列、Meta 的 Llama 系列,智普的 Chatglm 系列 模型版本 :一个系列的模型也会有多个版本,一般是有大更新时才会更新比如 Qwen 系列就存在 Qwen、Qwen1.5、Qwen2 三个系列 参数量 :一般为 xx B,B 为单位,表示 10 亿参数比如 7B 则是有 70 亿参数,72B 则是 720 亿参数 这个只是一个大致范围,比如 68 亿、72 亿参数的模型一般也叫做 7B 微调 :开源模型为了能够直接使用,一般会提供经过问答任务微调的版本,即 Chat 模型量化 :为了降低内存占用有的也会提供量化版本,比如大模型一般使用 FP32/FP16 精度,即一个参数占 4 或者 2 字节,而量化则是将权重参数使用更低精度的格式来存放,比如量化为 FP8 则是只需要 1 字节,Int4 则只需要 4 位。我们需要注意的就是是否经过微调、量化:
基座模型:不带任意后缀,或者 -Base 后缀,就是预训练后未经过微调的原始模型 SFT 模型:带特定领域任务后缀,比如 xxx-chat,就是对基座模型做了问答任务微调。 比如 Qwen1.5-Chat、Baichuan2-Chat 量化模型:它通过将模型中的高精度浮点数参数转换为低精度的整数参数来减少模型的存储和计算需求。这样做可以显著降低模型的内存占用,加快推理速度,并减少能耗。量化可以带来显著的效率提升,但也可能引入一些精度损失 GGUF:GGUF(以前称为 GGML)是一种量化方法,允许用户使用 CPU 来运行 LLM,但也可以将其某些层加载到 GPU 以提高速度。 GQPT:GPTQ 是一种 4 位量化的训练后量化(PTQ)方法,主要关注 GPU 推理和性能。 AWQ:是一种新格式(激活感知权重量化),它是一种类似于 GPTQ 的 量化方法。AWQ 和 GPTQ 作为方法有几个不同之处,但最重要的是 AWQ 假设并非所有权重对 LLM 的性能都同等重要。也就是说在量化过程中会跳过一小部分权重,这有助于减轻量化损失。所以他们的论文提到了与 GPTQ 相比的可以有显著加速,同时保持了相似的,有时甚至更好的性能。 如何选择合适的模型?
如果是直接部署推理,建议选择 Chat 模型,如果资源不够则选择量化版本。 如果要做增量预训练、微调等操作则建议使用基座模型。 2. 微调(SFT) 什么是大模型微调 大模型微调,通常指有监督微调(Supervised Fine-Tuning, SFT) ,是在预训练模型(一般称为“基座模型”)的基础上进行的训练过程。
预训练模型通常已经掌握了广泛的语言知识和语义表示,但为了让模型在特定任务或领域上表现得更好,我们会在特定任务的数据集上对其进行微调。
为什么需要微调 微调是优化大模型在特定任务或领域表现的关键步骤。通过微调,模型不仅能在通用任务上表现出色,还能在特定应用场景中更好地满足用户的需求。它在任务性能、领域适应性、数据利用效率和计算成本等方面具有显著的优势。
具体为:
任务特定性能提升 :预训练模型虽然有广泛的语言理解能力,但在特定任务上(如情感分析、问答系统、机器翻译等)的表现可能不尽如人意。微调通过在任务特定的数据上进一步训练,使模型能够更好地理解和执行该任务。领域适应性 :预训练模型可能在一些通用领域表现良好,但在特定领域(如医学、法律、金融等)中可能难以准确理解专业术语和内容结构。通过微调,可以让模型更好地适应这些领域的语言特点,提高在这些领域中的应用效果。数据稀缺性 :对于一些数据稀缺的任务或领域,获取大量标签数据可能比较困难。微调允许在有限的数据集上进行有效训练,从而在数据稀缺的情况下也能取得较好的性能。防止过拟合 :预训练过程中模型可能会过度拟合于无监督学习的任务(如下一个词预测),而在特定任务中表现不佳。通过微调,可以让模型专注于特定任务的数据,这有助于减少过拟合的风险,提高模型在该任务上的泛化能力。成本效益 :与使用 prompt 来引导模型行为相比,微调通常可以更高效地优化模型的表现。微调后的模型通常可以更直接地执行任务,减少了对复杂提示的依赖。同时,微调可以在更小的模型上实现类似于大型模型的性能,从而降低推理的计算成本和延迟,比如与使用通用的 GPT-3.5 模型相比,经过微调的小型模型(如 LLaMA 7B)在成本效益上可能更具优势,尤其是在特定任务的执行上。微调方法分类 微调根据更新参数量不同可以分为以下两种:
全量参数更新 Full Fine-tuning(FFT) :即对预训练模型的所有参数进行更新,训练速度较慢,消耗机器资源较多。参数高效微调 Parameter-Efficient Fine-Tuning(PEFT) :只对部分参数做调整,训练速度快,消耗机器资源少。理论上,预训练和微调都可以做全量参数更新和部分参数更新,但是一般实际训练时都是 预训练 + 全量,微调 + 部分参数更新 这样组合的 。
FFT 的原理,就是用特定的数据,对大模型进行训练,将 W 变成W ′,_W_′相比 W,最大的优点就是上述特定数据领域的表现会好很多。
但 FFT 也会带来一些问题,影响比较大的问题,主要有以下两个:
一个是训练的成本会比较高 ,因为全量微调的参数量跟预训练的是一样多的; 一个是叫**灾难性遗忘(Catastrophic Forgetting)**,用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差。 可以理解为:修复一个 bug 的同时又在别的地方引入了一个新的 bug。 另外,随着模型规模变得越来越大,这使得在消费级硬件上进行全量微调变得不可行 ,这也给参数高效微调技术研究提供了空间。
PEFT 主要想解决的问题,就是 FFT 存在的上述两个问题,PEFT 也是目前比较主流的微调方案。
Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning [2] 论文里系统地概述和比较了参数高效微调方法,涵盖了 2019 年 2 月至 2023 年 2 月之间发表的 40 多篇论文,作者在文中将 PEFT 分为三类:
添加额外参数的 Addition-based(A) 类似适配器的方法(Adapter-like methods) 选取部分参数更新 Selection-based(S) 引入重参数化 Reparametrization-based(R)
常见的 PEFT 方法:BitFit、Prompt Tuning、Prefix Tuning、P-Tuning、P-Tuning V2、Adapter Tuning、LoRA、QLoRA、MAM Adapter、UniPELT、 Freeze tuning 等等。
大致介绍:
1)《BitFit: BitFit: Simple Parameter-efficient Fine-tuning or Transformer-based Masked Language-models》 训练时只更新 bias 的参数或者部分 bias 参数 2)《Prefix Tuning: Prefix-Tuning: Optimizing Continuous Prompts for Generation》 在输入 token 之前构造一段任务相关的 virtual tokens 作为 Prefix,然后训练的时候只更新 Prefix 部分的参数,而 PLM 中的其他部分参数固定。 3)《Prompt Tuning: The Power of Scale for Parameter-Efficient Prompt Tuning》 该方法可以看作是 Prefix Tuning 的简化版本,它给每个任务定义了自己的 Prompt,然后拼接到数据上作为输入,但只在输入层加入 prompt tokens,并且不需要加入 MLP 进行调整来解决难训练的问题。 4)《P-Tuning: GPT Understands, Too 》 该方法将 Prompt 转换为可以学习的 Embedding 层,并用 MLP+LSTM 的方式来对 Prompt Embedding 进行一层处理。相比 Prefix Tuning,P-Tuning 加入的可微的 virtual token,但仅限于输入层,没有在每一层都加;另外,virtual token 的位置也不一定是前缀,插入的位置是可选的。这里的出发点实际是把传统人工设计模版中的真实 token 替换成可微的 virtual token 5)《P-Tuning v2: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》 该方法在每一层都加入了 Prompts tokens 作为输入,而不是仅仅加在输入层 6)《Adapter Tuning :Parameter-Efficient Transfer Learning fo NLP》 ,该方法设计了 Adapter 结构,并将其嵌入 Transformer 的结构里面,针对每一个 Transformer 层,增加了两个 Adapter 结构(分别是多头注意力的投影之后和第二个 feed-forward 层之后),在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构和 Layer Norm 层进行微调,从而保证了训练的高效性。 7)《LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》 ,该方法的核心思想就是通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练. 各自的特点:
BitFit : 只更新模型中的 bias 参数或部分 bias 参数。Prefix Tuning : 在模型输入前添加可训练的前缀向量。Prompt Tuning : 在输入层加入提示词(prompt tokens)进行微调。P-Tuning : 在模型的每层都加入可学习的提示词。Adapter Tuning : 在 Transformer 的每一层插入小型的适配器网络。LoRA (Low-Rank Adaptation) : 通过在模型的权重矩阵中引入低秩结构来进行微调。QLoRA(Quantized LoRA** )**:提出了 NormalFloat 数据类型,通过量化降低基座模型的显存占用,使得 65B 模型在单 GPU 上可以完成训练。这部分微调技术也可以按照 PEFT 进行分类:
1)增加额外参数的 A,如:Prefix Tuning、Prompt Tuning、Adapter Tuning 及其变体。 3)引入重参数化的 R,如:LoRA、AdaLoRA、QLoRA。 4)混合高效微调(混合多种微调方法),如:MAM Adapter、UniPELT 现在比较主流的几种 PEFT:Prompt Tuning、Prefix Tuning、LoRA、QLoRA。
训练框架选择 比较主流的几个微调工具:
huggingface/transformers [3] :最基础的一个库,提供了丰富的预训练模型和微调工具,支持大多数主流的 NLP 任务(如文本分类、序列标注、生成任务等)。适合进行快速实验和生产部署,有着广泛的社区支持。huggingface/peft [4] :Parameter-Efficient Fine-Tuning,huggingface 开源的微调基础工具modelscope/ms-swift [5] :modelscope 开源的轻量级微调框架可以通过执行脚本进行微调,也可以在代码环境中一键微调 自带微调数据集和验证数据集,可以一键微调 + 模型验证 hiyouga/LLaMA-Factory [6] :全栈微调工具NVIDIA/Megatron-LM [7] :NVIDIA 开发的大模型训练框架,支持大规模的预训练和微调。适用于需要极高性能和规模的大模型训练和微调。快速实验选择 Transformers 即可,超大规模的选择 NVIDIA/Megatron-LM,普通规模就选择使用较为简单的 hiyouga/LLaMA-Factory。
3. SFT 最佳实践 数据集的质量对模型微调至关重要,毫不夸张的说,微调后的模型效果 80%取决于 SFT 训练数据 ,少量高质的数据要比大量低质或者普通的数据要好很多。 Learning Rate:根据不同微调方法 LR 也需要调整 Global BatchSize:调整 bs 可以加快训练速度,但是也会增加显存占用,需要根据 GPU 资源调整。 数据集准备 数据集的质量对模型微调至关重要,毫不夸张的说,微调后的模型效果 80%取决于 SFT 训练数据 ,少量高质的数据要比大量低质或者普通的数据要好很多。
数据集格式:SFT 数据一般以问答形式呈现,参考开源数据集:BAAI/COIG [8] Prompt 优化,适当构建 few-shot 及 COT(思维链,Chain-of-Thought)数据加入训练,可以有助于模型的指令理解以及多轮对话能力。 数据规模、多样性:通常 1 万条左右的精标数据即可发挥良好的效果,在扩充数据规模时需要注意数据多样性,多样性的数据可以提高模型性能 数据质量:挑选质量较高的数据,可以有效提高模型的性能。 1)数据集格式
问答格式可以处理成多种文件格式, 例如 JSONL, Excel File, CSV; 核心是要保持两个独立的字段, 即问题和答案 。
例如:
[ { "question" : "特种珊瑚是一种海洋动物吗?" , "answer" : "特种珊瑚虽然生活在海洋中,但它属于珊瑚软体类的石珊瑚目,是一种动物。而海洋动物是海洋中所有异养型生物的总称,包括鱼类、鲸类、浮游动物和游泳动物等,特种珊瑚只是其中的一种。" } ]
2)Prompt 优化
prompt 优化主要在训练阶段,用于增强指令的多样性,让模型更好的理解指令 预测阶段的 prompt 优化主要用于无法进行 finetune 的场景,例如 chatgpt/yiyan.baidu.com 等。 对于特定下游任务,预测阶段建议与训练阶段保持一致或者接近的 prompt,可以暂时忽略预测阶段的 prompt 优化。 适当构建 few shot 及 COT(Chain of Thought) 数据加入训练,可以有助于模型的指令理解以及多轮对话能力。 3)数据规模、数据多样性
在 SFT 上数据规模的重要性低于数据质量, 通常 1 万条左右的精标数据即可发挥良好的效果 。
在扩充数据规模时需要注意数据多样性,多样性的数据可以提高模型性能 。
在不扩大提示多样性的情况下扩大数据量时,收益会大大减少,而在优化数据质量时,收益会显著增加。
4)数据质量
挑选质量较高的数据,可以有效提高模型的性能。
数据质量用户需尽量自己把控,避免出现一些错误,或者无意义的内容。虽然平台也可以提供数据质量筛选的能力,但不可避免出现错筛的情况。
数据质量可以通过 ppl、reward model,文本质量分类模型等方式进行初步评估。经过人工进行后续筛选。
SFT 超参数调整 比如 10 万个样本 2-3 个 epoch 内为佳,2 ~ 5 万个样本 一般是 4-5 个 epoch 并且领域增强的 SFT 数据不需要太多,质量一定要把握好,一般的领域总结回复的任务几百条数据即可( 个人经验 ),视情况而定;小数据量可以适当增大 epoch,让模型充分收敛。
例如:EPOCH:100 条数据时, Epoch 为 15,1000 条数据时, Epoch 为 10,10000 条数据时, Epoch 为 2。 一般只需要关注以下 三个超参数的调整
Epochs:需要根据数据集多少动态调整,比如 100 条数据时, Epoch 设置为 15,1000 条数据时, Epoch 为 10,10000 条数据时, Epoch 为 2。 Learning Rate:根据不同微调方法 LR 也需要调整,对于 LoRA 的 peft 训练方式,同时可以适当增大 LR Global batch_size:调整 bs 可以加快训练速度,但是也会增加显存占用,需要根据 GPU 资源调整。如增加 accumulate step 32 64,当分布式节点增多时可以进一步增加 batch_size,提高吞吐。 4. 什么是强化学习(RLHF) RLHF 是一种训练方式,并不是类似 Lora 这种的训练方法,RLHF 可以分为三阶段:
1)Language Model,LM:一个预训练语言模型 LM ,对基础模型微调得到一个微调后的模型使用人工标注的数据对预训练模型进行监督微调,以获得初始版本的生成模型。 2)Reward Model,RM :训练一个奖励模型 RM:训练一个奖励模型(Reward Model),用于评估生成模型的输出质量。 收集生成模型输出及其对应的人类反馈。这些反馈可以是评分、选择最佳输出、直接修改等形式。 使用这些反馈数据训练奖励模型,使其能够对生成的输出进行评分。 奖励模型通常是一个监督学习模型,通过最小化预测评分与人类反馈评分之间的差距进行训练。 3)Reinforcement Learning,RL :用强化学习 RL 方式微调 LM :使用强化学习算法(如 PPO(Proximal Policy Optimization) )进一步优化第一步中生成的模型,使其输出更符合人类反馈的期望。 PPO 是一种强化学习算法,旨在平衡探索和利用,通过限制每次更新的幅度,确保稳定性和效率。 算法优化生成模型的策略,使其输出在奖励模型的评分下不断提升。 使用初始生成模型产生输出,并通过奖励模型评估这些输出的质量 使用 PPO 算法,根据奖励模型的评分更新生成模型的参数。 反复进行生成、评估、优化的循环,逐步提高生成模型的性能。 相比于 RLHF 现在好像 DPO 比较火
5. 如何训练垂直领域大模型? 1)选择 Base 模型还是 Chat 模型?
对模型进行微调,都有可能触发灾难性遗忘。
在进行领域任务的 SFT 时,模型会重新调整对话任务相关的参数,而这些调整可能会干扰或破坏模型原先在通用对话任务上所学到的知识。这种现象就是灾难性遗忘。
即:灾难性遗忘 会导致模型通用能力降低。
因为 Chat 模型就是在 Base 模型基础上做了微调以适应对话任务,掌握了生成对话内容的能力的 SFT 模型,因此再对 Chat 模型做 SFT 触发 灾难性遗忘 风险就比较高,相比之下 Base 因为没经过微调,因为触发 灾难性遗忘 的风险会比较低。
因此选择哪种模型取决于我们的场景:
选 Base 模型:当您希望领域任务效果提升,同时不希望牺牲通用能力时,选择 Base 模型作为基座模型更为合适。 选 Chat 模型:如果您的领域任务与通用任务相关性不大,并且只追求领域任务的效果,可以选择 Chat 模型。 2)是否需要继续预训练(Continue PreTraining)?
必要性 :如果领域任务的数据集与预训练时的数据集差异较大,例如您的数据源自公司内部,而预训练数据无法覆盖这些领域,建议进行继续预训练。这样可以让模型更好地适应领域特定任务。数据量考虑 :当领域任务的数据量较大(例如 1B 以上的 token),增量预训练是必要的。因此,一般有两种选择 :
2)完整版:Base 模型 + 增量预训练(Continue PreTraining) + SFT 在此基础上,还可以通过强化学习进一步提升模型效果。
那么,最终一个完整的训练垂直领域大模型可以分为以下三步 :
1)Continue PreTraining(增量预训练): 一般垂直大模型是基于通用基座大模型进行二次的训练,为了给模型注入领域知识,就需要用领域内的语料进行继续预训练。 2)SFT( Supervised Finetuning,有监督微调) : 通过 SFT 可以激发大模型理解领域内的各种问题并进行回答的能力(在有召回知识的基础上) RLHF(奖励建模、强化学习训练) : 通过 RLHF 可以让大模型的回答对齐人们的偏好,比如行文的风格。6. 小结 1)大模型训练流程
2)监督微调(Supervised Fine-Tuning, SFT ) 3)强化学习(Reinforcement Learning from Human Feedback, RLHF ) 2)微调
全量参数更新 Full Fine-tuning(FFT) :,即对预训练模型的所有参数进行更新,训练速度较慢,消耗机器资源较多。参数高效微调 Parameter-Efficient Fine-Tuning(PEFT) :只对部分参数做调整,一般指的就是 PEFT。主流的微调方法:Prompt Tuning、Prefix Tuning、LoRA、QLoRA。 微调框架:peft、ms-swift、LLaMAFactory 3)SFT 最佳实践
4)强化学习 RLHF
Reward Model,RM:训练一个奖励模型 RM :训练一个奖励模型(Reward Model),用于评估生成模型的输出质量。Reinforcement Learning,RL :用强化学习 RL 方式微调 LM :使用强化学习算法(如 PPO(Proximal Policy Optimization) )进一步优化第一步中生成的模型,使其输出更符合人类反馈的期望。5)如何训练垂直领域大模型
1)Continue PreTraining(增量预训练): 一般垂直大模型是基于通用基座大模型进行二次的训练,为了给模型注入领域知识,就需要用领域内的语料进行继续预训练。 2)SFT( Supervised Finetuning,有监督微调) : 通过 SFT 可以激发大模型理解领域内的各种问题并进行回答的能力(在有召回知识的基础上) RLHF(奖励建模、强化学习训练) : 通过 RLHF 可以让大模型的回答对齐人们的偏好,比如行文的风格。