前言
本文讨论用peft库进行大模型微调,采取LoRA和P-Tuning(v2)两种方式。
一、LoRA
基于LoRA的原理,将权重矩阵分解为两个更低维的矩阵,以减少训练的参数量,即ΔW = AB。ΔW = (m,n),A=(m,r),B=(r,n)。所以最主要的一个参数为r,即矩阵的秩。
另LoRA中规定一个缩放系数alpha,本质上是LoRA应用于预训练权重的影响大小。scaling = alpha / r ,weight += (lora_B @ lora_A) * scaling。通常r和alpha设置为1:2。
Lora中同时提供dropout参数来防止过拟合。
用peft库可直接使用LoraConfig方法设置各参数。
Config = LoraConfig(r=8,
lora_alpha=16,
target_modules=lora_module_name,
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM",
inference_mode=False,
)
其中target_modules可以设置LoRA应用于模型的哪些层,通常应用于每个Transformer层中的Key和Value权重矩阵。此外,我们还可以将LoRA应用于Query权重矩阵、投影层Projection、多头注意力模块之间的其他线性层Head以及线性输出层MLP。
二、P-Tuning(v2)
根据P-Tuning的原理,原始方法中的离散Prompt模板影响模型效果的稳定性,故在P-Tuning中,引入可微的virtual token,该方法将Prompt转换为可以学习的Embedding层,并用MLP+LSTM的方式来对Prompt Embedding进行一层处理。但P-Tuning只在输入层加入了virtual token,且virtual token的位置是可变的,不一定是前缀。
而P-Tuning v2的变化为,该方法在每一层都加入了virtual tokens作为输入,而不是仅仅在输入层。
Config = PrefixTuningConfig(num_virtual_tokens=30,
task_type="CAUSAL_LM",
prefix_projection = False,
inference_mode=False
)
其中num_virtual_tokens是virtual tokens的数量,即prompt的长度。
prefix_projection表示是否投影前缀嵌入(token),默认值为false,表示使用P-Tuning v2, 如果为true,则表示使用 Prefix Tuning。