在使用大模型过程中,有两种方式可以实现大模型的快速落地。
1.上下文学习
上下文学习(In context learning)是在 GPT-3 中首次提出的,它表明随着模型尺寸的增大,ICL 的能力变得更加明显,那么什么是上下文学习呢?
在LMM领域,上下文学习(In context learning)即提示学习,也叫语境学习、任务相关的类比样本中学习等,它可以看做模型语义理解能力的一种,即对于一个大规模预训练模型,对于不同的下游任务,不需要调整模型参数,它可以根据我们的演示示例输出我们想要的结果,本质上,它相当于使用训练完好的语言模型估计给定示例条件下的条件概率分布模型。
根据给定示例的数量分为zero-shot、one-shot、few-shot
例如,对于情感分类任务,将给定示例与待分类文本一起输入到模型中,暗示模型根据示例生成输出
如果我们不能直接访问模型(例如如果我们通过API使用模型),上下文学习的用处就非常大。但是如果在微调模型阶段选择上下文学习,由于模型都有输入长度的限制,而上下文学习需要在样本原有基础上添加较多内容,所以还是有一些局限性。
2.微调
首先,我们来回顾一下模型微调的发展史。模型微调分为全量微调(Full-Fine-Tuning)和部分参数微调
2.1 全量微调
引用:全量微调是指对整个预训练模型进行微调,包括所有的模型参数。在这种方法中,预训练模型的所有层和参数都会被更新和优化,以适应目标任务的需求。这种微调方法通常适用于任务和预训练模型之间存在较大差异的情况,或者任务需要模型具有高度灵活性和自适应能力的情况。
这种微调方法也通常会取得更好的效果,但是随着模型参数量的增加,例如GPT3等模型,其参数量达到千亿甚至万亿级别,全量微调参数将会耗费大量资源。
2.1 高效参数微调(PEFT)
在面对特定的下游任务时,如果进行 Full-fintuning(即预训练模型中的所有参数都进行微调),太过低效。而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果。
所以谷歌的研究人员于2019年在论文《Parameter-Efficient Transfer Learning for NLP》提出针对 BERT 的 PEFT 微调方式,于是他们设计了Adapter。
2.1.1 Adapter Tuning
Google之Adapter Tuning:嵌入在transformer里 原有参数不变 只微调新增的Adapter。模型结构图如下
上图左为Adapter在transformer模型中的位置,在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构进行微调。
上图右为Adapter的结构,通过对特征向量进行维度压缩和还原来训练更新参数,Adapter结构中也包括了残差链接部分。
除此之外还有提示学习相关的微调系列、LoRA系列
的微调方法
2.1.2 提示学习相关的微调
提示学习即对模型进行提示,通过利用外部的信息来引导模型,帮助模型学习,通过给模型不同的提示或情境,可以影响模型的输出,使其更适合特定的用途或遵循特定的交流原则。
这些提示可以是来自于人类专家的知识、先前的经验、规则或其他形式的先验知识。适用于低资源场景,对于提升模型表现具有较大作用。
经过调研,大模型微调过程中的提示学习大致可以分为三类
- prompt-tuning
在输入数据中添加离散提示模板,拼接到数据上作为输入,同时freeze预训练模型进行训练,该向量一般是模型最终输出的结果,也可以是映射前的结果。
mask位置对应【喜欢/不喜欢】,即【积极/消极】
- prefix-tuning
斯坦福的研究人员于2021年通过此论文《Prefix-Tuning:Optimizing Continuous Prompts for Generation》提出Prefix Tuning方法
在输入数据中加入上下文信息等外部信息作为前缀来引导模型,帮助模型理解输入信息进而提高模型生成内容的质量。
该方法是在输入token之前构造一段任务相关的virtual tokens
。即下图中PREFIX
部分,这些伪token不必是词表中真实的词,而只是若干个可调的自由参数,训练过程中只更新PREFIX部分的参数。
下图上半部分是encoder结构,下半部分是encoder-decoder结构
调优过程通过初始化一个维数|Pidx|×dim(hi)的可训练矩阵Pθ(由θ参数化)来存储前缀参数。
prefix-prompt的效果优于adapter tuning 和 finetune最上面的两层,最终和全参数finetune差不多,且在低资源情况下,效果优于finetune
- p-tuning V1
清华大学的研究者于2021年通过此篇论文《GPT Understands, Too》提出P-Tuning
如下图(a)中橘色区域, [“the” “capital” “of” “is” ] 等提示信息是离散且固定的,而这些离散的提示往往会导致模型的性能不稳定,例如,改变提示中的某个词可能就会造成性能的大幅下降,所以p-tuning应运而生。
如下图(b)所示,p-tuning使用通过Prompt Encoder提示编码器(LSTM+MLP)不断迭代优化产生的提示代替固定的离散提示,以保证提示在模型训练过程中不断优化,形成比较优秀的提示模板。
换言之,P-tuning做法是用一些伪prompt代替这些显式的prompt。具体做法是,在样本输入之前添加预训练词表中未使用过的token[unused1][unused2]…,然后通过训练去更新这些token的参数。
相比于prefix tuning,p-tuning这些token插入的位置不一定是前缀,可以是随机的。并且P-Tuning 引入的virtual token是可微的。
P-tuning并不是随机初始化几个新token然后直接训练的,首先引入了LSTM+MLP编码模块去编码这些virtual token,把Embedding算出来,并且将这个LSTM模型设为可学习的 允许模型在训练过程中动态地“学习”什么是有效的 prompt。
*论文:https://arxiv.org/pdf/2103.10385.pdf
代码:THUDM/P-tuning: A novel method to tune language models. Codes and datasets for paper ``GPT understands, too’'.*
- p-tuning V2
v1到v2的可视化:蓝色部分为参数冻结,橙色部分为可训练部分,可以看到右侧的p-tuning v2中,将continuous prompt加在序列前端,并且每一层都加入可训练的prompts。在左图v1模型中,只将prompt插入input embedding中,会导致可训练的参数被句子的长度所限制。
- LoRA系列
LoRA(Low-Rank Adaptation of Large Language Models),直译为大语言模型的低阶自适应。LoRA 的基本原理是冻结预训练好的模型权重参数,在冻结原模型参数的情况下,通过往模型中加入额外的网络层,并只训练这些新增的网络层参数。由于这些新增参数数量较少,这样不仅 finetune 的成本显著下降,还能获得和全模型参数参与微调类似的效果。
【提示学习与指示学习对比】
提示学习是通过添加提示词激发模型的补全能力,引导模型生成符合逻辑的内容
指示学习是通过构造示例模板,激发模型的理解能力,教会模型如何按照示例模板思考和行动
ps:以上都是个人通过阅读资料的总结,如有理解错误的地方欢迎大家指正
参考:
https://cloud.tencent.com/developer/article/2303328
https://blog.csdn.net/qq_41739364/article/details/135639929
https://blog.csdn.net/qq_35357274/article/details/122288060
https://zhuanlan.zhihu.com/p/660721012
https://zhuanlan.zhihu.com/p/636326003
https://zhuanlan.zhihu.com/p/673789772