微调有两种办法,
一是模型全部参数的微调,二是少量参数高效的微调。前者由于参数多,需要的GPU多,并且全参数微调可能把模型带偏,后者只需要微调少量参数,需要的GPU少,还可能达到不错的效果,成为大家研究的重点,取了个专有名词Parameter-Efficient Fine-Tuning,简称PEFT,即高效参数微调。
PEFT主要分为:
1、Additive类:在预训练模型的基础上增加额外的参数或网络层,微调时只训练这些新增的部分,这包括Adapter(在Transformer子层后加入小的全连接层,微调只学习新加的全连接层参数)
、Soft Prompts(在输入的embedding中加入向量作为soft prompts),并对这些向量的参数进行微调,避免构造Prompts模板。
2、Selective类:选择模型中的部分层,如最后几层或偏置项进行微调,而不是调整整个模型、
3、Reparametrization-based类:使用低秩表征来最小化可训练的参数,认为大量参数只有一部分起到关键作用,并在这关键子空间中寻找参数进行微调。
4、Hybrid类:混合了以上多种方法,结合了它们的优点
以下细讲
Additive类
Adapter Tuning
结构简洁明了,在Transformer的前馈层后加入上图中右边所示的Adapter层,Adapter是一个bottleneck结构,先把d维特征映射为m维,然后通过一个非线性层,最后映射回d维特征,m<<d,即m远小于d,Adapter包括偏置项的参数量为2md+m+d,由于m很小,起到了限制参数量的作用。模型微调的时候,学习的参数包含上图绿色部分,除了Adapter,还有Transformer本身的Layer Norm层。
Adapters微调训练的参数量、全模型微调参数量和准确率关系如下图。总体上,在BERT Large模型上用0.5-5%的参数微调,基本达到全参数微调性能,差距仅1%以内。在GLUE上,用3.6%的参数微调和全参数微调性能差距仅0.4%
Soft Prompts
Prefix-Tuning
Prefix-Tuning是一种针对自然语言生成任务的轻量级微调方法,它在传统的全参数微调(Fine-tuning)和不修改任何模型参数的上下文学习之间提供了一种平衡。这种方法的核心思想是冻结预训练模型(PLM)的参数,并只优化一小部分连续的任务特定向量,即所谓的"prefix"。Prefix-Tuning的灵感来源于针对语言模型的提示(prompting)技术,它允许模型的后续token将这个prefix视为一系列“虚拟token”,从而对特定任务进行调整。
在具体实现上,Prefix-Tuning通过在输入token之前构造一段任务相关的virtual tokens作为Prefix,然后再训练时只更新这部分参数,而保持PLM中的其他参数不变,对于自回归模型架构,如GPT-2,Perfix-Tuning在句子钱买你添加前缀,形成[PREFIX; x; y]
的结构;而对于编码器-解码器架构模型,如BART,则在编码器和解码器的输入前都添加前缀,形成[PREFIX; x; PREFIX'; y]
的结构
为什么?
因为自回归模型的特点是它们在生成序列时依赖于之前生成的token(即前文)。这种模型一次生成一个token,依赖于之前所有的token的历史信息。
在Prefix-Tuning中,通过在输入序列的开始添加一个连续的任务特定向量(即PREFIX),可以位模型提供一个任务相关的上下文。这个PREFIX相当于给模型一个初始的提示,帮助它理解接下来需要执行的任务。
形成【PREFIX;x;y】的结构,其中x是实际的输入(如线性化的数据表),y是期望的输出序列(如文本描述)。这样,PREFIX作为起始点,x
提供详细信息,y
是生成任务的输出。
编码器-解码器模型(如BART):
编码器-解码器模型由两部分组成:编码器(Encoder)负责读取和理解输入数据,解码器(Decoder)负责生成输出序列。这种模型通常用于需要同时理解输入并生成相关输出的任务,如机器翻译或文本摘要。
在Prefix-Tuning中,由于编码器和解码器都需要对任务有共同的理解,所以在编码器的输入前添加一个PREFIX来引导输入的编码,同时编码器和解码器都需要对任务有共同的理解,所以在编码器的输入前添加另一个PREFIX(通常与编码器前的PREFIX不同,表示为PREFIX')来引导输出序列的生成。
形成[PREFIX; x; PREFIX'; y]
的结构,其中第一个PREFIX帮助编码器理解任务上下文,x是输入数据,第二个PREFIX'帮助解码器生成与任务相关的输出,y
是解码器生成的序列。