【第四章:大模型(LLM)】10.微调方法与实战-(4)Prefix-Tuning
Prefix-Tuning是一种高效的大模型微调方法,通过在各层注意力机制中嵌入可学习的前缀向量(PK/PV),实现仅训练少量参数(1%)即可引导模型输出。相比全参数微调,它显著降低计算开销;相较于PromptTuning,其在生成任务中表现更优。核心原理是将前缀拼接至Key/Value矩阵,使模型隐含记忆特定信息。实验表明,Prefix-Tuning在GPT-2/3等生成任务中接近全参数微调效果
第四章:大模型(LLM)
第十部分:微调方法与实战
第四节:Prefix-Tuning
1️⃣ 背景与动机
在大规模语言模型微调中:
-
全参数微调:需更新模型全部参数,计算与存储开销极大。
-
Prompt Tuning / P-tuning:只在输入层添加提示,参数开销小,但对复杂任务(尤其是生成任务)表现不足。
Prefix-Tuning 被提出,作为 介于全参数微调与 Prompt Tuning 之间的折中方案:
-
在 Transformer 每一层的注意力机制中添加前缀向量。
-
保持模型主体参数冻结,只训练少量前缀参数。
-
既能保持高效性,又能保证在文本生成等任务中的表现。
2️⃣ 核心思想
Prefix-Tuning 的关键是:
-
在 每一层的 Self-Attention 和 Cross-Attention 模块中,预先注入一组可学习的前缀向量(prefix embeddings)。
-
这些前缀向量会被拼接到 Key 和 Value 中,使模型在计算注意力时,强制“关注”这些额外信息。
这样:
-
模型就好像在“潜意识”里多了额外的记忆片段。
-
不需要改动输入句子本身,也不需要改动模型权重。
3️⃣ 方法原理
在 Transformer 的注意力机制中:
在 Prefix-Tuning 中:
-
PK,PV:可学习的前缀向量,长度为 mm。
-
:表示在原始 Key 前拼接上前缀 Key。
-
:表示在原始 Value 前拼接上前缀 Value。
于是注意力变为:
4️⃣ 与其他方法的比较
方法 | 注入位置 | 是否逐层 | 参数开销 | 效果 |
---|---|---|---|---|
Prompt Tuning | 输入层 embedding | 仅输入层 | 极小 | 效果有限 |
P-tuning v1 | 输入层(带编码器) | 仅输入层 | 小 | 较好 |
Prefix-Tuning | KV Cache | 每层 | 中等 | 好,特别适合生成任务 |
P-tuning v2 | KV Cache | 每层 | 中等 | 更强大,统一各种任务 |
LoRA | 线性层低秩分解 | 每层 | 中等 | 更灵活,高效 |
5️⃣ 特点与优势
参数高效:通常仅需训练百万级别参数(占比 <1%)。
强大生成能力:在 GPT-2/3 上的生成任务表现接近全参数微调。
通用性:不仅适用于分类任务,更适合生成与条件文本任务。
低侵入性:无需修改原始模型架构,易于集成。
6️⃣ PyTorch 伪代码
import torch
import torch.nn as nn
class PrefixAttention(nn.Module):
def __init__(self, num_heads, prefix_len, dim):
super().__init__()
self.prefix_len = prefix_len
self.num_heads = num_heads
self.dim = dim
# 可学习前缀 (Key/Value)
self.prefix_key = nn.Parameter(torch.randn(prefix_len, num_heads, dim))
self.prefix_value = nn.Parameter(torch.randn(prefix_len, num_heads, dim))
def forward(self, K, V):
# 拼接前缀到原始 K/V
K = torch.cat([self.prefix_key, K], dim=0)
V = torch.cat([self.prefix_value, V], dim=0)
return K, V
7️⃣ 总结
-
Prefix-Tuning 是一种 参数高效微调方法,通过在 每层 Attention 注入前缀向量 来引导模型生成。
-
它在 文本生成任务 上表现优异,比 Prompt Tuning/P-tuning 更强。
-
它为后续的 P-tuning v2、LoRA 等方法提供了重要灵感。
更多推荐
所有评论(0)