【第四章:大模型(LLM)】10.微调方法与实战-(3)P-tuning v2
第四章:大模型(LLM)
第十部分:微调方法与实战
第三节:P-tuning v2
1️⃣ 背景与动机
P-tuning(v1) 通过可学习的提示编码器(如 BiLSTM/MLP)生成连续的提示向量,已经比 Prompt Tuning 更强大。
但在更大规模模型(如 GPT-2, GPT-3, BERT-large)上,P-tuning 仍存在:
任务泛化能力不足。
实现复杂(需要设计提示编码器)。
对生成类任务支持有限。
P-tuning v2 被提出,目标是:
统一 NLP 各类任务(分类、生成、抽取等)。
等效替代全参数微调,在效果上接近甚至持平。
同时保持 参数高效(只需微调少量参数)。
2️⃣ 核心思想
P-tuning v2 的核心是 Prefix Tuning + 可学习虚拟 token 的结合:
在 每一层 Transformer 的注意力层(Self-Attention),为 Key/Value 添加一组可学习的前缀向量。
与 Prompt Tuning 不同:
Prompt Tuning 只在输入 embedding 层添加提示。
P-tuning v2 在所有层注入提示信息,增强模型表达能力。
相比 P-tuning v1,去掉了复杂的 BiLSTM/MLP 编码器,采用更简洁的实现。
3️⃣ 方法原理
(1) 前缀化注意力机制
在第 l 层注意力中:
:可学习的前缀向量(prefix embedding)。
将它们拼接到原始 Key/Value 前,使模型在计算注意力时“预先关注”这些前缀信息。
(2) 多层注入
在每一层的 Self-Attention 都加入前缀向量。
前缀向量在不同层共享或独立可学习,灵活可调。
4️⃣ 与其他方法的比较
方法 | 注入位置 | 是否逐层 | 参数开销 | 效果 |
---|---|---|---|---|
Prompt Tuning | 输入 embedding | 仅输入层 | 极小 | 效果有限 |
P-tuning v1 | 输入 embedding(编码器生成) | 仅输入层 | 小 | 效果较好 |
Prefix Tuning | KV Cache | 每层 | 中等 | 效果好 |
P-tuning v2 | KV Cache | 每层 | 中等 | 接近全参数微调 |
5️⃣ 特点与优势
统一性:可处理分类、生成、抽取等各种任务。
高效性:仅需训练前缀向量(通常占模型参数的 0.1%~1%)。
效果强大:在 GLUE、SuperGLUE 等基准测试中,性能接近甚至超越全参数微调。
简洁实现:无需额外提示编码器,直接在 Transformer 内部注入参数。
6️⃣ PyTorch 伪代码
import torch
import torch.nn as nnclass PrefixLayer(nn.Module):def __init__(self, num_heads, prefix_len, dim):super().__init__()self.prefix_len = prefix_lenself.num_heads = num_headsself.dim = dim# 可学习的前缀 Key/Valueself.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/VK = torch.cat([self.prefix_key, K], dim=0)V = torch.cat([self.prefix_value, V], dim=0)return K, V
在实际实现中,需要在 Transformer 的每一层 Attention 前调用该模块。
7️⃣ 总结
P-tuning v1:提示编码器生成输入前缀 → 提升了表达能力,但实现复杂。
P-tuning v2:直接在每层 Attention 引入可学习前缀 → 简洁高效,效果媲美全参数微调。
地位:P-tuning v2 被认为是 Prompt Tuning/Prefix Tuning 的统一框架,奠定了后续 LoRA、Adapter 等方法的基础。