大模型Fine-Tuning技术简介

最近这些年大模型比较火,最早17年的BERT以及最近出现的GPT-3 CHATGPT以及GPT-4,这些模型算法的特点是效果比较好,但是参数量也比较大,训练的时候需要N多的gpu计算资源,一般的个人甚至单位都负担不起.例如,LLaMA论文中提到, 整个项目模型使用了 2048 A100-80G大约5个月去做项目, 这个成本不是一般公司能够承受的。

但另一个好消息是现在很多的模型权重目前是公开的这些都是,我们可以利用的资源,就像我在另一篇文章中提到的,其实我们利用这些权重是在褥facebook的羊毛,参见《基于Alpaca 7B,两天搭建mac单机不用联网纯语音交互机器人》

但很多时候,我们又希望用它来解决我们特殊的定制化业务问题,这个时候如何基于这些已有的大模型权重针对我们的具体问题进行fine-tuning,就显得很重要.

今天要介绍的技术是PEFT(Parameter-Efficient Fine-Tuning),研究的是我们如何利用最少的参数,比较小的计算资源来对已有的预训练大模型进行Fine-Tuning,以解决我们的具体业务任问题和任务.

我举个例子,假设我是一个玩具制造商,我想做很多不同类型的机器人,例如一方面我想做一个机器猫机器人给80后,同时又想做一个小猪佩奇给我们家娃,底层我用到的模型都是LLaMA,但这个时候我不可能为每一个娃娃都去重新Fine-Tuning 完整的一个LLaMA,那这个时候PEFT就显得很重要,因为他只Fine-Tuning很少的一部分权重就能达到实现不同的玩偶娃娃有不同思想,不一样的对话模式,不同特色娃娃的效果

几种PEFT方法

Adapter Tuning

最早提到PEFT方法的论文是《Parameter-Efficient Transfer Learning for NLP》

在论文中提到,如果每次预训练都要去调整所有的权重,进行完整的Fine-Tuning的话,效率太低,但如果每次都采用固定预训练模型的某些层只微调接近下游任务的基层参数时,又很难达到比较好的效果。

所以,文章引入了Adapter的概念在Transformer的结构当中引入了Adapter,在训练的时候,原有的transformer的权重是不会做调整的,只对Adapter去进行参数的调整,而且Adapter的参数相对来说比较少,这样就可以使用比较少的代价来达到不同的任务Fine-Tuning的效果

图:在Transformer中加入Adapter对BERT进行Fine-Tuning的示意图

图:在实验中使用Adapter的方法只额外增加了3.6%的参数规模,但是取得了和Full-Tuning相类似的结果

论文参见:《Parameter-Efficient Transfer Learning for NLP》

Prefix Tuning

Prefix Turning的方式和Full-Tuning以及Adapter的方式都有所区别,该方式在输入Token之前构造一段任务,相关Virtual Token作为Prefix,然后再进行Fine-Tuning的时候只对Prefix部分的参数进行更新,而Transformer中其他部分的参数则是固定的,这样的方式相当于在所有的用户输入的Prompt的过程当中都加入了Virtual Token作为隐性的Prompt.

这样不同的任务Task只要使用不同的Prefix Virtual Token 子网络就可以.具体的transformer的结构不用进行调整.

以下为具体网络的示意图该方式。和当前人工Prompt的方式相对来说比较类似,都相当于是说在输入Prompt前给定对应的隐性限定条件,类似于我们使用ChatGPT,给定对应的鉴定条件prompt效果会更好,其实是一样的道理,只是文章的方式更加隐性,以及soft

图:Prefix Tuning方法

论文参见:《Prefix-Tuning Optimizing Continuous Prompts for Generation》

LoRA

这是今天介绍的主角方法,大家会发现Civitai上很多LoRA模型的分享,会经常听到这个名字

LoRA是现在非常常见,不管是在AIGC图像模型的Fine-Tuning,还是在文本的Fine-Tuning中.

该方法的出发点是因为现有的方式会存在以下两个缺点:

现有的Fine-Tuning的方式会增加模型的深度,这样一方面会增加对应的参数,同时会增加推理的延时,这个很容易理解,当推理的时候,模型层数越多,就会越慢,这里速度太慢,就会影响应用的场景.

因为部分的模型方式可能会降低用户有效的输入序列长度,比如Prefix Turning,它相当于是默认加入了隐性的Virtual Token子网络,用户可输入的网络序列自然就会变短.

文章的出发点就回归到我们大一所有理科同学都学过的线性代数的一个基本概念:因式分解.

文章认为:真正起到关键作用的其实是少数低秩,重要的内在维度(Instrisic Dimensions),所以文章就提出了Low Rank Adapter的概念,简单来说,中心思想:就是使用两个低秩矩阵的乘法来模拟完整的矩阵参数fine-tuning的过程

大家都学过因式分解,无论在推荐系统还是图像压缩中都用的非常多,其原理就是一个大矩阵,可以分解成两个维度较低的矩阵相乘来作为它的近似,两个分解出来的矩阵,因为它的维度较低,所以它的存储以及在计算的时候所涉及到的总体权重都会非常少,而且很多时候都能很好的还原原己矩阵.

以下为LoRA模型结构的示意图

具体到上图中,就是将Fine-Tuning过程当中所产生的原矩阵权重的变化进行因式分解,该方式能够解决以下三方面的问题

第一,相比于原有的Adapter的方式,该方法在进行推理的过程当中没有增加网络额外的深度,所以在进行推理时,只要将原有的预训练模型的权重和变化部分进行相加,即可进行完成推导计算性能不会有(太多)损失.

第二,因为该方式不像Prefix Prompt一样占用用户输入序列的长度,所以用户输入序列长度能够得到保证.

第三,因为该方式是用因式分解的方式去模拟了Fine-Tuning的模式,所以它的效果不会打折,效果和Full Fine-Tuning相同.同时,只要替换AB两个矩阵即可实现Fine-Tuning部分的插拔和替换,可以很灵活的在各个任务之间进行切换,还不会影响到原有的预训练模型的权重.

以下为具体的公式。

图:LoRA对优化问题的定义

图:LoRA的方法, 思路就是将Delta W转化为因式分解的两个低秩矩阵的乘法作为Fine-Tuning的插件,不改变原有pre-training模型权重的情况下, 可以灵活替换fine-tuning的部分

P.S. 公众号完全不支持Markdown,所以截了两个看论文的笔记的图, 凑合看。

具体的代码github上参考有很多, 例如可以参考:https://github.com/Facico/Chinese-Vicuna

参考文献:

《Parameter-Efficient Transfer Learning for NLP》:Adapter方式介绍

《Prefix-Tuning Optimizing Continuous Prompts for Generation》:Prefix方法介绍

《LoRA: Low_Rank Adaptation of LLM》:LoRA模型介绍

https://github.com/Facico/Chinese-Vicuna

《基于Alpaca 7B,两天搭建mac单机不用联网纯语音交互机器人》:简单语音对话机器人pipe line

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注