1.Adapter Tuning:嵌入在transformer中
新增了一个名为adapter的结构,其核心思想是保持模型其他原始参数不变,只改变adapter的参数,其结构如下图所示:
1.在每一个transformer模块最后都加入一层adapter。
2.adapter首先使用一个feedforward将高维特征映射到了低维特征。
3.低维特征经过一层非线性层之后将低维特征映射回高维特征。
2.Prefix Tuning:构造虚拟token
1.在输入token之前构造一段任务相关的虚拟token作为Prefix。
2.在训练时可以只更新Prefix部分的参数,而transformer预训练的参数固定。
【注】该方法与构造Prompt类型,但是构造人为构造的显示提示并且构造参数不可更新,而Prefix是隐式构造。
3.Prompt Tuning
与Prefix Tuning相比之下,prompt tuning使用单个提示表示,该表示前置于嵌入式输入。除了需要更少的参数外,所提出方法允许transformer更新中间层任务表示,通过输入示例进行上下文化。
Prompt tuning只需要为每个任务存储一个小的特定于任务的提示,并使用原始的预训练模型支持混合任务推理。
P-Tuning V1只在输入层加入了Prompt,而P-Tuning V2则在每一层都加入了Prompt,解决了深度提示优化的问题。另外P-Tuning V2还提出了Multi-task learning解决不同规模和任务的适配性问题。
4.LoRA
LoRA的核心思想是用一种低秩的方式来调整这些参数矩阵,在数学上低秩意味着一个矩阵可以用两个极小的矩阵来近似。它提出用两个小矩阵近似一个大矩阵,先降维(减小计算量)后升维(维持维度不变)。具体来说是固定原始模型的参数,只训练降维矩阵A与升维矩阵B。最后用原始模型参数与B矩阵相加。
A矩阵一般用随机高斯分布初始化,维度上是降维;B矩阵用0矩阵初始化,维度上是升维。
参数更新 :W = W + A*B。
梯度更新 :在微调过程中,计算关于矩阵A和矩阵B的损失,在优化过程中对A和B进行更新,原始矩阵W保持不变。
代码具体操作:①将原始矩阵W参数冻结。②新引入两个线性层对应图中两个矩阵,先降维后升维。③LoRA主要实现了两分支通路,一条分支为已被冻结weight参数的原始结构,另一条分支为新引入的降维再升维线性层。
5.QLoRA:相比于LoRA进一步降低显存消耗
而QLoRa更进一步,引入了4位量化、双量化和利用nVidia统一内存进行分页。
分页优化器、双量化、增加Adapter。