2 大模型高效参数微调;prompt tunning
近年来,以GPT为代表的大型预训练模型(Pre-trained Language Models, PLMs)在自然语言生成任务中表现出色。为了更好的适配下游任务,传统的全参数微调(Fine-tuning)需要为每个下游任务存储和更新数十亿参数,这对计算资源和存储成本提出了巨大挑战。针对这个问题,GPT3中提出了prompt工程,然而大模型对用户设计的prompt比较敏感,因而也难以保证效果。在此背景下,Prompt Tuning作为一种轻量高效的微调方法备受关注,仅需对每一个任务训练一个提示向量,就可以大大提高大模型在这项任务的表现。
一、什么是Prompt Tuning?
传统的Fine-tuning通过在预训练模型的基础上添加任务相关层(如分类器)并更新所有参数来适应具体任务。然而,这种方法有两个主要缺陷:
- 参数低效:每个下游任务需独立保存完整模型副本。
- 灾难性遗忘:微调可能覆盖预训练模型中的通用知识。
相比之下,Prompt Tuning的核心思想是通过在输入中插入可学习提示(Prompt),以极小的参数调整来适配下游任务。这种方法仅需优化提示相关的参数(通常占总参数的0.1%~1%),而冻结原始模型参数。如Figure1所示,Prompt Tuning所需要训练的参数最小。prompt Design就是Prompt工程,是不可训练的。
Figure1、不同微调方法所更新的参数
二、Prompt Tuning训练过程
2.1、设计提示模板
在原始输入前添加 k 个可学习的提示嵌入(例如 [P1][P2][P3][P4]
),并拼接模板引导输出。例如:
Input: [P1][P2][P3][P4] 这部电影很有趣。总体评价是 [MASK] 的
。
其中,
-
[P1]-[P4]
:可训练的提示,相当于4个待学习的token。每个P的嵌入维度与文本嵌入的维度一致,比如768。[MASK]
:模型需预测的位置,映射到标签(如“好”→“正面”,“差”→“负面”)。- 对于k的选择,论文中做了实验,20个性价比最高,如Figure3所示。本文中仅以4个作为例子。
Figure3
2.2、输入编码
-
- 输入文本被转换为嵌入向量。
- 提示嵌入与原始输入的嵌入向量拼接后输入冻结的预训练模型(如 GPT3)。
2.3、计算损失
-
- 模型预测
[MASK]
位置的 token 概率(如“好”的概率为 0.8,“差”为 0.2)。 - 根据真实标签(假设是“正面”),计算交叉熵损失:
Loss = -log(P("好"))
。
- 模型预测
2.4、反向传播
-
- 仅更新提示嵌入的参数(
[P1]-[P4]
嵌入向量)。 - 预训练模型的参数保持冻结。
- 仅更新提示嵌入的参数(
3、预测过程
Prompt Tuning训练完毕后,可学习提示嵌入的向量就保持不变,对该任务下的所有问题都使用这个提示嵌入。换言之,不管用户输入的问题是什么,只要是同一个任务下的问题,所插入的提示嵌入[P1]-[P4]都是一样的。要适配多任务,就需要为每一个任务训练一个可学习的提示嵌入。
3.1、添加训练后的提示
新输入 特效很棒,但剧情糟糕。
与前缀提示拼接:
[P1][P2][P3][P4] 特效很棒,但剧情糟糕。总体评价是 [MASK] 的。
其中,“总体评价是 [MASK] 的”是人工针对这项任务所设计的模板。要注意的是,训练后得到的是P1-P4四个嵌入向量,而不是4个token。需要对输入文本进行embedding后再与学习到的提示嵌入进行拼接。
3.2、模型推理
冻结的预训练模型处理整个输入序列,预测 [MASK]
位置的 token 概率(例如“差”的概率为 0.7)。
3.3、映射到标签
根据 [MASK]
预测结果(“差”),输出类别为“负面”。
4、参考文献
【1】 The Power of Scale for Parameter-Efficient Prompt Tuning