文章目录
微调大模型方法最全综述
各种各样的微调模型在最近两三年很火爆,想要去讲明白这些方法并不容易~但是我还是想尝试一下,尽可能将这些微调模型以一个清晰的架构呈现出来
1 微调背景
首先我们从基础概念出发—— fine-tuning(微调),微调在AI界扮演着非常重要的角色,因为很多大模型往往采用预训练+微调范式
预训练大模型可以让模型广泛学习到一些知识~相当于广撒网,一个劲地学,也不管会碰撞怎样的思想火花,好比读书破万卷,所以可见预训练大模型需要很多的硬件资源,耗费很长时间,因而是很多大公司才能玩的动的。
那么预训练模型就很强了吗?不一定,就好比我们可能读了很多书,但想要对某些领域深入了解,需要再精读细读
某些领域的书籍,这就是模型微调,针对自然语言不同的下游任务(比如问答电影相关的知识)需要通过微调让模型获得更精细的知识,所以微调可以解决预训练模型在特定任务上表现差的情况。
微调可以分为两大类
1.1 Full fine-tuning 全参数微调(FFT)
很好理解,就是整体参数都参与到微调过程中,不对网络结构,Prompt进行更改,这种微调的效果往往结果会比较好,但是可想而知,耗费的资源和时间也长
因而人们想在保证结果优秀的前提下,想尽可能少的调整原本大模型的参数,来减小成本,也就是接下来的一大类
1.2 parameter-Efficient-fine-tuning 部分参数微调(PEFT)
-
其中有些维持原本网络结构和大部分参数不变,只动个别层的参数,这是传统微调方式,在传统AI任务如分类用的很多,比如我们只调整输出层的参数,我把他叫做部分参数训练法 在大语言模型用的其实不多
-
其中有些不动原本的网络结构和参数,对输入Prompt进行调整,我把他叫做提示词Prompt调整训练法 如P-tuning
-
对原本网络结构进行更改,增加某些层,或者增加某些结构,我把他叫做结构调整训练法
有些方法可能是上面三种基本方法的组合~
以下五个优点:
-
能够降低计算成本(需要更少的GPU和GPU运行时间);
-
拥有更快的训练时间(更快地完成训练);
-
具备更低的硬件要求(适用于较小显存的GPU和较小的内存);
-
具有更好的模型性能(降低过拟合);
-
需要更少的存储空间(大部分weights可以在不同任务(tasks)之间共享)。
我们重点介绍提示词Prompt调整训练法和结构调整训练法
2 提示词调整训练法
2.1 P-Tuning
在2021年论文《GPT Understands,Too》提出Prompt tuning(即我们可以常看到的P-Tuning)(讲到用到NLU自然语言理解任务)
他的思路动机来源于,观察到在很多情况下,我们调整提示词可以获得更好的结果,可以做这样一个类比
原本提示词输入是,Input=1,2,3,4,5
(这里以数字举例,每个数字对应代表一个字符)假设模型输出能够打60分
我们在实验中发现,输入调整为Input= 2,2,3,4,5
会更好,模型输出最后能够打75分
但是如上我们的调整都是离散的调整,费时费力,我看到一个专门的称呼,叫这种调整方式是离散的,硬的(hard Prompt tuning)
而很有可能这两个都不是最佳的,最佳的可能是Input=1.4,2,3,4,5
所以我们给Input加一些可学习的部分,让他自己学习到最佳的提示词状态,这便是提示词调整训练法的一大精髓和核心(Soft Prompt tuning)
如下图,将原本的离散的The captial of is 这些变为h0,h1,h2等等一系列连续的量
通俗可以这么理解,就是针对某些任务,在提示词上做更改是可以提高模型的表现的,但是我们不知道该做怎样的更改,人工调整费时费力,简单,让模型自适应地去学习怎么样调整提示词!
P-tuning:自动构建模版,释放语言模型潜能 - 科学空间|Scientific Spaces (kexue.fm)
2.2 Prefix
Prefix-Tuning: Optimizing Continuous Prompts for Generation
Prefix其实和 P-Tuning挺像的
Prefix支持进入前缀,P-tuning不局限于前缀
Prefix注重自然语言生成任务,P-tuning 注重自然语言理解任务
《The Power of Scale for Parameter-Efficient Prompt Tuning》是Prefix的简化~
好好研究一下这个
然后研究一下开源库huggingface
大模型微调实践——Prefix tuning与P-tuning v2的原理、区别与代码解析最终章 - 知乎 (zhihu.com)
2.3 P-Tuning v2
2021年,清华大学提出《P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》
v2 在v1的基础上进行了改进,显著的改进源于对预训练模型的每一层应用连续Prompt
3 结构调整训练法
3.1 Adapter tuning
2019年论文《Parameter-Efficient Transfer Learning for NLP》提出
如图,在自我注意模块(和前馈神经网络层模块)和后续剩余连接之间插入适配器层Adapter
在训练过程中,只训练Adapter结构的参数,原本模型参数不动
3.2 LoRA
论文《LoRA: Low-Rank Adaptation of Large Language Models》
具体做法
- 在原模型旁边增加一个旁路,通过低秩分解(先降维再升维)来模拟参数的更新量;
- 训练时,原模型固定,只训练降维矩阵A和升维矩阵B;
- 推理时,可将BA加到原参数上,不引入额外的推理延迟;
- 初始化,A采用高斯分布初始化,B初始化为全0,保证训练开始时旁路为0矩阵;
- 可插拔式的切换任务,当前任务W0+B1A1,将lora部分减掉,换成B2A2,即可实现任务切换;
- 秩的选取:对于一般的任务,rank=1,2,4,8足矣,而对于一些领域差距比较大的任务可能需要更大的rank。