到底有哪些微调⽅法呢?
- 第⼀类⽅法:借助OpenAI提供的在线微调⼯具进⾏微调;
- 第⼆类⽅法:借助开源微调框架进⾏微调;
1. OpenAI在线微调⼯具
网址:https://platform.openai.com/docs/guides/fine-tuning/common-use-cases
- OpenAI提供了GPT在线⼤模型的微调API:Fine-tuning,⽤于在线微调在线⼤模型;
- ⽬前⽀持A、B、C、D四⼤模型在线微调;根据格式要求在线提交数据集并⽀付算⼒费⽤,即可在线进⾏模型微调;
- 微调后会⽣成单独模型的API供使⽤;
- ⼀个模型可以多次微调;OpenAI在线微调是⿊箱算法;
OpenAI提供的“傻⽠式”微调流程:
- 按照格式要求,准备并上传数据集;
- 排队、⽀付费⽤并等待微调模型训练完成;
- 赋予微调模型API单独编号,调⽤API即可使⽤;
from openai import OpenAI
client = OpenAI()
client.fine_tuning.jobs.create(
training_file="file-abc123",
model="gpt-3.5-turbo"
)
关于OPENAI的在线微调需要重点考虑以下几点
- 成本:在线微调可能会产生较高的成本,因为需要大量的计算资源来训练和调整模型,所以如果数据量大的话会支付比较高的成本。
- 数据隐私和安全性:用户需要将数据上传到OpenAI的服务器进行微调,这可能引发数据隐私和安全的担忧,这一般是企业最担心的问题。
- 当然还需要注意的是,想要使用OpenAI是需要科学上网的。
2. 开源微调框架
深度学习微调⽅法⾮常多,主流⽅法包括LoRA、Prefix Tuning、P- Tuning、Promt Tuning、AdaLoRA等;
⽬前这些⽅法的实现均已集成⾄Hugging Face项⽬的库中,我们可以通过安装和调⽤Hugging Face的PEFT(⾼效微调)库,来快速使⽤这些⽅法;
- Hugging Face 是⼀家专注于⾃然语⾔处理(NLP)技术的公司,同时也开发并维护了多个⼴受欢迎的⾃然语⾔处理的开源库和⼯具,如Transformers 库、ChatGLM-6B库等;
- ⾼效微调,State-of-the-art Parameter-Efficient Fine-Tuning (SOTA PEFT),与之对应的更早期的简单的全量参数训练微调的⽅法(Fine- Tuning),⾼效微调则是⼀类算⼒功耗⽐更⾼的⽅法
2.1 ⾼效微调⽅法⼀:LoRA
LoRA:LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS(2021)
基于低阶⾃适应的⼤语⾔模型微调⽅法
Github地址: https://github.com/microsoft/LoRA
论⽂地址: https://arxiv.org/abs/2106.09685
- 原理简述:基于⼤模型的内在低秩特性,增加旁路矩阵来模拟全参数微调;
- LoRA最早由微软研究院发布的⼀项微调技术;
- 简⽽⾔之,是通过修改模型结构进⾏微调,是⼀种四两拨千⽄的微调⽅法,是⽬前最通⽤、同时也是效果最好的微调⽅法之⼀;
- 后面实战将详细介绍LoRA微调实践⽅法;
概念辨析:⼤模型微调LoRA与通信技术LoRa,⼆者相差⼀个字⺟的⼤⼩写,是完全两种不同的技术;
LoRA除了可以⽤于微调⼤语⾔模型(LLM)外,⽬前还有⼀个⾮常⽕爆的应⽤场景:围绕diffusion models(扩散模型)进⾏微调,并在图⽚⽣成任务中表现惊艳
2.2 ⾼效微调⽅法⼆:Prefix Tuning
Prefix-Tuning: Optimizing Continuous Prompts for Generation(2021)
基于提示词前缀优化的微调⽅法
论⽂地址: https://aclanthology.org/2021.acl-long.353/
- 来源于斯坦福⼤学的⼀种⾼效微调⽅法;
- 原理简述:在原始模型基础上,增加⼀个可被训练的Embedding层,⽤于给提示词增加前缀,从⽽让模型更好的理解提示词意图,并在训练过程中不断优化这些参数;
- Prefix Tuning既能够在模型结构上增加⼀些新的灵活性,⼜能够在模型使⽤上提供⼀种⾃动的、能够改进模型表现的提示机制;
2.3 ⾼效微调⽅法三:Prompt Tuning
The Power of Scale for Parameter-Efficient Prompt Tuning (2021)
论⽂地址: https://arxiv.org/abs/2104.08691
- 由⾕歌提出的⼀种轻量级的优化⽅法;
- 原理简述:该⽅法相当于是Prefix Tuning的简化版本,即⽆需调整模型参数,⽽是在已有的参数中,选择⼀部分参数作为可学习参数,⽤于创建每个Prompt的前缀,从⽽帮助模型更好地理解和处理特定的任务;
- 不同于Prefix⽅法,Prompt Tuning训练得到的前缀是具备可解释性的,我们可以通过查看这些前缀,来查看模型是如何帮我们优化prompt的;
- 该⽅法在参数规模⾮常⼤的模型微调时效果很好,当参数规模达到100亿时和全量微调效果⼀致;
2.4 ⾼效微调⽅法四:P-Tuning v2
P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks(2022)
GitHub地址:https://github.com/THUDM/P-tuning-v2
论⽂地址: https://aclanthology.org/2021.acl-long.353/
ChatGLM-6B+P-Tuning微调项⽬地址: https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/README.md
- 来源于清华⼤学团队提出的⾼效微调⽅法;
- 原理简述:可以理解为Prefix tuning的改进版本,即P-Tuning v2不仅在输⼊层添加了连续的prompts(可被训练的Embedding层),⽽且还在预训练模型的每⼀层都添加了连续的prompts;
- 这种深度的prompt tuning增加了连续prompts的容量,出于某些原因,PTuning v2会⾮常适合GLM这种双向预训练⼤模型微调;
2.5 基于强化学习的进阶微调⽅法
RLHF:Reinforcement Learning from Human Feedback
基于⼈⼯反馈机制的强化学习⽅法
- 最早由OpenAI研究团队提出,并⽤于训练OpenAI的InstructGPT模型;
- 效果惊艳:根据OpenAI相关论⽂说明,基于RLHF训练的InstructGPT模型,在仅拥有1.3B参数量的情况下,输出效果已经开源和GPT-3 175B模型媲美。这充分说明了RLHF⽅法的实践效果;
- ⽬前Hugging Face、PyTorch和微软研究院都有提供RLHF实现⽅法,其中微软研究院的DeepSpeed Chat是⽬前最⾼效稳定的端到端RFHL训练系统;
项⽬地址: https://github.com/microsoft/DeepSpeed/
- 步骤1:监督微调(SFT) —— 使⽤精选的⼈类回答来微调预训练的语⾔模型以应对各种查询;
- 步骤2:奖励模型微调 —— 使⽤⼀个包含⼈类对同⼀查询的多个答案打分的数据集来训练⼀个独⽴的(通常⽐ SFT ⼩的)奖励模型(RW);
- 步骤3:RLHF 训练 —— 利⽤ Proximal Policy Optimization(PPO)算法,根据 RW 模型的奖励反馈进⼀步微调 SFT 模型。