神经网络微调技术全解(04)-- Prompt Tuning-可训练提示(Learnable Prompts)
“可训练提示”(Learnable Prompts)是Prompt Tuning中的一个关键概念。与手动设计的固定文本提示不同,可训练提示指的是一种自动化的、基于学习的提示优化方法。这种提示不再是简单的静态文本,而是通过训练模型来学习的一组向量表示,用以引导模型在特定任务上的输出。
可训练提示的核心思想
- 向量表示:
- 在可训练提示中,提示不再是直接的文本,而是一组向量(通常与模型的输入嵌入有相同的维度)。这些向量可以被视为提示的连续表示。
- 这些向量会与输入文本的嵌入表示结合在一起,以引导模型的行为。
- 学习过程:
- 可训练提示是通过训练来获得的。它们的初始化可能是随机的,也可以基于某些策略进行初始化。
- 通过反向传播算法,提示向量会在训练过程中根据任务的需求进行优化,从而使得这些提示更适合特定的任务。
- 作用方式:
- 可训练提示通常被附加到输入文本的前面(或者根据需求也可以放在后面或中间)。这些提示向量与输入文本一起传递给模型。
- 由于提示向量是模型的一部分,它们在训练过程中会随着损失函数的优化而被调整,以最大化模型在特定任务上的表现。
可训练提示的示例
假设我们要在GPT模型上进行情感分类任务,我们可以通过可训练提示来引导模型更好地完成任务:
python
复制代码
import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel# 加载预训练模型
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')# 初始化可训练提示向量
prompt_length = 5
learnable_prompt = torch.randn(prompt_length, model.config.n_embd, requires_grad=True)# 输入文本
input_text = "The movie was"# 将输入文本转换为token ids
input_ids = tokenizer(input_text, return_tensors="pt").input_ids# 获取输入的嵌入表示
input_embeds = model.transformer.wte(input_ids)# 将可训练提示向量与输入嵌入结合
inputs_with_prompt = torch.cat([learnable_prompt.unsqueeze(0), input_embeds], dim=1)# 传入模型进行预测
outputs = model(inputs_embeds=inputs_with_prompt)# 计算损失并优化可训练提示
loss = some_loss_function(outputs, target_labels)
loss.backward()# 使用优化器更新可训练提示
optimizer = torch.optim.Adam([learnable_prompt], lr=1e-4)
optimizer.step()
优势
- 无需人工设计:
- 不同于手动设计固定的文本提示,可训练提示通过自动化学习过程得以优化,无需大量的人工干预。这使得模型能够自动找到最适合任务的提示方式。
- 更高的适应性:
- 由于提示是通过训练获得的,它能够比静态提示更好地适应不同任务的需求。可训练提示能捕捉到特定任务中的隐含信息,从而更有效地引导模型的输出。
- 参数效率:
- 相较于传统的全模型微调,只有提示向量是可训练的,这意味着需要调整的参数数量大大减少,从而降低了计算成本。
潜在的挑战
- 初始化问题:
- 提示向量的初始值可能对最终的训练结果有较大影响,不同的初始化方式可能导致不同的性能表现。
- 依赖预训练模型的能力:
- 可训练提示的效果依赖于预训练模型本身的能力。如果预训练模型在任务上表现不佳,提示的引导作用可能有限。
- 复杂度:
- 对于某些高度复杂的任务,可训练提示可能无法捕捉所有必要的信息,这时可能需要结合其他微调技术来补充。
总结
可训练提示是Prompt Tuning中的一种关键技术,通过将提示作为可训练的向量而非静态文本,来引导预训练模型更好地完成任务。它的自动化学习过程减少了对人工设计提示的依赖,并且在参数效率和适应性方面表现优异。然而,提示向量的初始化和任务复杂度可能对其效果产生一定影响。