AI 文摘

一文探秘LLM应用开发(6)-微调(方案理论)





作者: AINLP  来源: [AINLP](https://mp.weixin.qq.com/s/-4dMnaCQMT7NheNTfMP9aQ)

本文旨在让无大模型开发背景的工程师或者技术爱好者无痛理解大语言模型应用开发的理论和主流工具,因此会先从与LLM应用开发相关的基础概念谈起,并不刻意追求极致的严谨和完备,而是从直觉和本质入手,结合笔者调研整理及消化理解,帮助大家能够更容易的理解LLM技术全貌,大家可以基于本文衍生展开,结合自己感兴趣的领域深入研究。若有不准确或者错误的地方也希望大家能够留言指正。

本文体系完整,内容丰富,由于内容比较多,分多次连载

第一部分 基础概念

1.机器学习场景类别

2.机器学习类型(LLM相关)

3.深度学习的兴起

4.基础模型

第二部分 应用挑战****

1.问题定义与基本思路

2.基本流程与相关技术

1)Tokenization与Embbeding

2)向量数据库

3)finetune(微调)

  1. 背景挑战

  2. 方案理论

  3. 工具实践

4)模型部署与推理

5)prompt

6)编排与集成

7)预训练

第三部分 场景案例

常用参考

第二部分 应用挑战

2.基本流程与相关技术

2)finetune(微调)-方案理论

参数高效微调(PEFT)

那么,finetune怎们克服之前的问题做到参数高效微调(PEFT)呢?

参数高效(Parameter-efficient) 微调,希望使用少量的参数以逼近全量参数微调的效果

数据高效(Data-efficient )微调,希望使用少量的标记数据(few-shot)以逼近大量数据微调效果

其思路也比较简单直接,那就是区别于原来全量微调,固定原有模型参数,只微调变化的部分,减少计算成本和时间 ,另一方面,只存储微调部分的参数,而不保存全部模型,减少存储空间 。基于这两方面的改进,就能克服前面提到的问题(需要大量标签数据问题,采用prompt learning fewshot方案)。因而,采用只改变少量的参数(delta parameters),达到微调的目的的方法,叫做参数高效微调(Parameter-efficient finetuning,PEFT),也叫做Delta Tuning。

Delta Tuning有三个方向,增量式(Addition-based)、指定式(Specification-based)和重参数化(Reparameterization)。

https://arxiv.org/pdf/2203.06904.pdf

1)增量式(Addition-based)

增加一些原始模型中不存在的额外可训练神经模块或参数。从加的内容和位置不同,又可细分为 Adapter-Tuning, Prefix Tuning,Prompt Tuning等等。

  • Adapter-Tuning

https://arxiv.org/pdf/1902.00751.pdf

2019年,该方法由Houlsby N等人引入,Adapter-Tuning本质上就是在原有模型结构上增加了一些适配器,而这个adapter的维度比原有维度低得多,这样就使得计算量得到很大减少,从而提升微调效率。由于前面是直接加在原有网络结构上,不利于维护,因此在原有adapter做了一些优化,将它移到了外面,变成一个外挂,和主模型分离,这样在计算上和维护上都有了进一步提升。

https://arxiv.org/pdf/2206.06522.pdf

  • Prefix Tuning

https://arxiv.org/pdf/2101.00190.pdf

由Li和Liang在论文“Prefix-Tuning: Optimizing Continuous Prompts for Generation”(2021)中提出。

@Hung-yi Lee

它不修改原有模型结构和参数,只通过给模型每一层增加前缀,然后固定模型参数,仅仅训练prefix,从而减少训练成本,实现高效精调。

NLP有2个核心的任务:分别是【自然语言理解—NLU】和【自然语言生成—NLG】。

NLU(自然语言理解)是所有支持机器理解文本内容的方法模型或任务的总称,即能够进行常见的文本分类、序列标注、信息抽取等任务。希望机器人能够像人一样,具备正常的语言理解能力。意图识别和实体提取的关键技能。

NLG (自然语言生成)是NLP的另一项核心任务,主要目的是降低人类和机器之间的沟通鸿沟,将非语言格式的数据转换成人类可以理解的语言格式。通常典型的应用主要有:自动写新闻(AI编辑新闻);聊天机器人(Siri或智能音箱);自动生成报告。

把它用来完成NLG任务,仅仅使用了 0.1% 的参数在全数据集上的效果与少量数据集全参数微调相当,并且在未知数据集也有比较好的泛化性。

https://arxiv.org/pdf/2101.00190.pdf

  • Prompt Tuning & P-tuning v2

https://arxiv.org/pdf/2104.08691.pdf

hard prompt 又称为 Discrete Prompt,人类可读的文本存在

soft prompt 又称为 Continuous Prompts,pembedding形式存在,连续可微

prompt构造的目的是找到一种方法,使LM能够有效地执行任务,而不是供人类使用,因此没有必要将prompt限制为人类可解释的自然语言。因此,还有一些方法叫连续prompt(也称为软提示),这些提示可以直接在模型的嵌入空间中执行提示。具体来说,连续提示消除了两个约束:

1)模板词不再是自然语言。

2)消除了模板是由预训练LM的参数化的限制。相反,prompt有自己的参数,这些参数可以根据下游任务的训练数据进行调优。

Prompt Tuning方法(和Prompt Learning注意区别,两者不同)仅在输入层增加soft prompt,相较于的基于每个任务的全参数微调,如图每个任务需要11B参数,而prompt tuning只需要20k参数,小了5个数量级,随着模型参数的增加(达到10B级),Prompt Tuning能与Fine-Tuning效果打平,但其在小模型上性能不佳。另外,Prompt Tuning只是在一些NLU任务上表现良好,别的方面并未得到验证,任务缺乏通用性。

为了解决这些问题,提升其在小参数上的性能及任务通用性,P-tuning V2(p-tuning改进得来)借鉴prefix-tuning思想,并将其应用扩展到NLU领域,在每一层都增加soft prompt,增加了可训练的参数量。

https://arxiv.org/pdf/2110.07602.pdf

在不同规模大小的大模型及不同类型任务上,P-tuning v2能与精调(Fine-tuning)方法的表现比肩,有时甚至更好,值得一提,该方法是清华团队提出的。

2)指定式(Specification-based)

指定原始模型中的特定的某些参数变得可训练,而其他参数则被冻结。最典型的为bitfit,仅仅更新bias,其效果如下:

https://arxiv.org/pdf/2106.10199.pdf

3)重参数化(Reparameterization)

重参数化式方法用低维子空间参数来重参数化原来存在的参数,这样就能在保证效果的情况下,减少计算量。重参数化方法往往基于一类相似的假设:即预训练模型的适配过程本质上是低秩或者低维的。大白话讲,就是对它先进行精简计算然后再适配回原有结构并不会对模型影响很大。

  • lora(Low-Rank Adaptation of Large Language Models)

https://arxiv.org/pdf/2106.09685.pdf

@Hung-yi Lee

在大型语言模型上对指定参数(权重矩阵)并行增加额外的低秩矩阵,并在模型训练过程中,仅训练额外增加的并行低秩矩阵的参数。当“秩值”远小于原始参数维度时,新增的低秩矩阵参数量也就很小。在下游任务tuning时,仅须训练很小的参数,但能获取较好的表现结果。如图,原始 (冻结的) 预训练权重 (左) 的输出激活由一个由权重矩阵 A 和 B 组成的低秩适配器 (右) 增强。可以类别adapter tunging,一个是低维串联,一个是并联低秩,最终目的都是为了减少微调参数量,从而提升速度。通过它训练出的lora权重和原始权重merge后,即可获得完整参数。 并且作者证明,低阶适配器的微调取得了与微调完整预训练模型相当的结果,速度更快,使用的内存更少,可以在消费级硬件上运行。

  • QLORA: Efficient Finetuning of Quantized LLMs

https://arxiv.org/pdf/2305.14314.pdf

在lora基础上,qlora做了进一步改进,可以在保持完整的16位微调任务性能的情况下,将内存使用降低到足以「在单个48GB GPU上微调650亿参数模型」。QLORA通过冻结的4位量化预训练语言模型向低秩适配器(LoRA)反向传播梯度。它采用了两种技术——4位NormalFloat (NF4)量化和Double Quantization。同时,引入了Paged Optimizers,它可以避免梯度检查点操作时内存爆满导致的内存错误。

量化是指用于执行计算并以低于浮点精度的位宽存储张量的技术

单个参数占用的 GPU 内存量取决于其“精度”(或更具体地说是 dtype)。最常见的 dtype 是 float32 (32 位) 、 float16 和 bfloat16 (16 位)。 要在 GPU 设备上加载一个模型,每十亿个参数在 float32 精度上需要 4GB,在 float16 上需要 2GB,在 int8 上需要 1GB。为了保证较高的精度,大部分的科学运算都是采用浮点型进行计算,常见的是32位浮点型和64位浮点型,即float32和double64,显而易见,适当的降低计算精度,能够减少内存开销,提升计算速度,是大模型微调优化的一个很好思路。

QLORA包含一种低精度存储数据类型(通常为4-bit)和一种计算数据类型(通常为BFloat16)。在实践中,QLORA权重张量使用时,需要将将张量去量化为BFloat16,然后在16位计算精度下进行矩阵乘法运算。与16-bit完全微调基线相比,QLORA 将微调65B参数模型的平均内存需求从 >780GB降低到 <48GB,并且不会降低模型预测性能。

小结

下面是常见的参数高效微调方法的比较(注意实际训练参数量占全部参数量比重估计):

@Hung-yi Lee

值得一提的是,全量微调在大部分情况下还是效果最好的。因此,参数高效优化更多是一种折衷。

https://arxiv.org/pdf/2203.06904.pdf

在下一篇中,将会介绍参数高效微调相关的工具和案例,敬请关注。

**进技术交流群请添加AINLP小助手微信(id: ainlp2)**   


**请备注具体方向+所用到的相关技术点** 

![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSJADkmZ2IX6Z23znAibuEevotDMq9iaMxiapK7jfMibiauGFkycicAJEs6x5U9SGyDJZ0S1tRed9TPNUUDQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)



**关于AINLP** 

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。

  


  


![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSKABHCqVVQkVYPrM4XY1vsd0iaeuXzyJnoFc8cibd5mYb4wdA3WMQtiaPVmr0XLZHMuVibqWncibpnTSnQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)

**阅读至此了,分享、点赞、在看三选一吧🙏** 
可关注我们的公众号:每天AI新工具