大模型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

基于Alpaca 7B,两天搭建mac单机不用联网纯语音交互机器人

最近各种大模型比较火,既让人兴奋,又让人让人焦虑,所以最近一方面也在跟各种模型的论文,也看了比较多,团队也在尝试用各种大模型解决业务问题,同时,自己也在动手试一试这些技术,包括从GPU上的finetuning,以及最终终端的应用。

端午节这周在家没有出游,花了两天时间,利用开源的LLaMa 7B 权重,搭建了一个语音交互机器人。最大的特点是:可以不用联网,可独立在自己mac笔记本上运行,可流畅的实现英文语音对话。中文的等五一有时间再调。

具体的效果可以看以下视频:
NOTE: 视频号链接放不上来, 可以到公众号中查看

视频:mac 单机不用联网的语音交互机器人,其中我的语音输入问题为: 'What is the purpose working hard in China?' ^_*

以下内容不涉及中间的算法,算法后续会单独开topic,不过从代码级别撸了一遍模型结构和推理过程也是一种收获。

另外以下内容和公司业务无关, 会写的细一些,代码级别。

先抛开其中的算法,以下为搭建过程中需要的开源组件,大家要自己搭解决方案的可以参考:

  1. 耳麦语音信号接收和发送,pyaudio,语音信号采集, wav文件播放都很方便。

  2. Speech Recognition,使用OpenAI Whisper, 原则上model size=large 1550M 支持中文,我的code 中使用 model size=small 244M

  3. Alpaca 7B 作为chat 模型,使用Alpaca 7B(基于LLaMA 7B) 进行finetuning 实现文本理解与对话,model 载入内存后占用6065M左右

  4. Coqui TTS 进行TTS处理,原则上支持中文,但Alpaca中文支持较差,所以TTS也先搞了一版英文。

  5. copilot 进行辅助开发,copilot不仅能帮你写代码, 还能帮你写注释, 还能预测你将要写的注释!!!结伴编程效率高, 感觉这个不是面相对象编程, 倒有种跟着对象编程的意思。

这些组件都是开源的,github上都可以下载到,链接和一些示意代码我都贴到最后,大家感兴趣的可以复现。

总共耗时两天左右。

以下为具体用到的库以及使用示例,具体的这些库怎么安装API怎么用我这个地方就不列出来了,想复现或者修改的同学,根据文末最后的链接自己编写pipeline以及修改Alpaca 代码就可以搞定。

耳麦语音接收和播放

图:使用pyaudio进行声音处理和播放

OpenAI Whisper 进行Speech Recognition

图:使用whisper进行speech recognition,model size='small'

Alpaca 7B 进行chat

图:Alpaca 7B client,使用开源Alpaca.cpp修改适配接口, 该client使用cpp能够在多种设备上运行,其中使用gglm.c 库进行模型加载和推理,想具体了解LLaMA模型结构, 以及如何跨平台使用各size LLaMA权重的同学都值得仔细看看,毕竟论文主要看思路, 代码才是全部

Coqui TTS 进行TTS处理

图:coqui tts 进行text2sound,支持中文, 支持voice clone,想象空间比较大

播放TTS结果的线程逻辑

TTS线程逻辑

以上就是Sound->text->chat result->sound整个pipeline用到的组件,pipeline使用python编写,多线程生产和消费语音输入,speech recognition, chat结果和tts结果, pipeline需要自己写,Alpaca的推理程序需要自己改造, 其他的组件github上都有。

感受

写代码的过程当中,将LLaMA的模型结构,推理过程的源代码都读了一遍,还是有比较大的收获,比光看那种概念型的论文还需要具体很多,以下就是几个心得跟大家分享一下:

  1. 大模型已经能够很好的将世界的本质和知识压缩到网络结构的权重中,在推理的过程中能够结合这些知识进行推理和泛化,finetuning只是教模型说我们想要的人话。这个话题比较open,感觉大模型理解世界的空间更大,而人类的语言只是低维空间的一种表现,一个典型的例子就是LLaMA没有经过中文语料的训练,但是能理解一部分的中文问题。现在的finetuning,更多是在教模型如何以我们能够理解和希望的方式交互,而不是教模型更多知识(否则alpaca 这种50K的样本根本不够用)
    就类似于一个智商极高,知识量足够丰富的外星人来到地球,虚心地向人类学习人类语言一样,他学到的是表达,而不是智商和知识。

  2. 算法正在被统一,原来纯算法工种的需求量会急剧下降。一个佐证就是上边提到的LLaMA,Whisper,Coqui TTS,底层的算法结构都是极为近似的,都是基于transformer的大语料五监督训练,文本语音都是如此,之后再进行极其有限的finetuning。在算法领域,白领会逐渐消失,只留下大量的蓝领和金领

  3. 开源组件的有机组合和拼装能够快速满足业务需求,能够带来巨大的商机。开源的组件很多,已经非常成熟,可以开箱即用,或者经过微调就能够很好的满足业务需求,如何将这些组件进行有机的组合和拼接,满足业务场景将存在巨大的商机。例如,定制一个善解人意,某个女明星版本的真人大小的娃娃是不是一个商机呢?虽然说出来并上不了台面。

像ChatGPT或者GPT4这样的大模型效果的确非常好,好到难于置信(相对于单机mac 上的Alpaca)但是创业者或者其他公司在应用的时候会存在以下几个风险:

  1. 平台税造成使用方的成本上升,ChatGPT或者是GPT4的提供方,OpenAI/微软,作为平台,最终可能会收取巨额的平台税,这就会增加应用方的成本,甚至导致应用方公司无法负担这个成本。记得以前央视曝光百度竞价排名有骗子卖假药,说骗子获利的70%都用于百度推广,尴尬的是但是我就在百度做广告算法........

  2. 私域数据的泄露,毕竟如果到最后算法逐渐的被统一之后,数据才是最核心的资产,如何保证私域数据不被泄露?这是一个需要重点考虑的问题

  3. 大模型的提供方会不会因为某些政治或者经济考量? 直接就把某个特定的应用方给停了呢?

在这样的情况下,像LLaMA,ChatGLM这些开源的模型&权重,虽然从效果上不是最优的选择,但是风险可控,进行对私域数据的反有可能是比较好的选择。

同时,因为这些模型权重已经被训练出来了,训练所产生的花费,已经被facebook 承担,所以,从某种意义上也相当于是我们在褥facebook的羊毛了。

当然,现在大模型有点火的过头了,这个技术既让人兴奋,又让人焦虑,发展太快,我们现在也在业务场景里边去试用,而且发现的确效果很好,大家有什么新的idea或者想法,欢迎随时交流。

公众号:颠覆式创新

语音对话用到的组件

  1. coqui tts:https://github.com/coqui-ai/TTS

  2. OpenAI Whisper speech recognition:https://github.com/openai/whisper

  3. Alpaca 算法和跨平台推理代码
    https://github.com/antimatter15/alpaca.cpp
    https://github.com/tatsu-lab/stanford_alpaca

  4. pyaudio语音输入&播放:https://pypi.org/project/PyAudio/