微信扫码
与创始人交个朋友
我要投稿
论文:GPT Understands, Too
GPT 也能理解
摘要:用自然语言模式提示预训练的语言模型已被证明对自然语言理解(NLU)是有效的。然而,我们的初步研究发现,手动的离散提示往往会导致不稳定的性能——例如,改变提示中的一个单词可能会导致显著的性能下降。我们提出了一种新的方法 P-Tuning,它采用可训练的连续提示嵌入与离散提示连接使用。实证结果表明,P-Tuning 不仅通过最小化不同离散提示之间的差距来稳定训练,而且在包括 LAMA 和 SuperGLUE 在内的一系列 NLU 任务上显著提高了性能。P-Tuning 通常对冻结和调整过的语言模型都有效,无论是在完全监督还是少次学习设置下。
(注释:P-Tuning 是一种让计算机程序更好地理解和回答问题的方法。想象一下,你有一个智能助手,它可以通过阅读文本来回答问题。但是,有时候这个助手可能不太明白你的问题,因为它需要一些额外的线索来理解你想要什么。
在 P-Tuning 中,我们给这个智能助手一些特殊的提示,这些提示就像是小秘密,帮助它更好地理解你的问题。这些提示分为两种:
1. **离散提示**:就像是你给智能助手的直接指令,比如“告诉我关于...的信息”。这些指令是固定的,不会改变。
2. **连续提示嵌入**:这就像是你给智能助手的额外信息,它不是直接的指令,而是一些可以帮助它更好地理解问题的背景信息。这些信息是可以学习的,智能助手会根据它学到的东西来调整自己的理解。
现在,让我们用一个实际的例子来说明 P-Tuning:
假设你想知道关于某个电影的信息。你可能会问智能助手:“这部电影的导演是谁?”在 P-Tuning 中,你不仅给出这个问题,还会给它一些额外的提示,比如“这部电影是在2020年上映的”。这些额外的信息(连续提示嵌入)可以帮助智能助手更准确地找到你想要的答案。
在训练过程中,智能助手会学习如何利用这些连续的提示嵌入来更好地理解问题。这样,即使问题稍微有些变化,比如你问的是“这部电影的主演是谁?”,智能助手也能够利用它学到的连续提示嵌入来给出正确的答案。这就是 P-Tuning 的魅力所在:它让智能助手在面对不同的问题时更加稳定和可靠。)
1 引言
预训练语言模型(PLMs;Brown 等人,2020)显著提高了自然语言理解(NLU)的性能。PLMs 通过不同的预训练目标进行训练,例如遮蔽语言建模(Devlin 等人,2018)、自回归语言建模(Radford 等人,2019)、序列到序列(seq2seq)(Raffel 等人,2019)和排列语言建模(Yang 等人,2019)。
PLMs 可以通过提示(prompting)(Brown 等人,2020;Schick 和 Schütze,2020)进一步增强,提示使用手动编写的提示模式作为语言模型的额外输入。在 PLMs 在小规模标记数据集上进行微调或冻结以直接在下游任务上进行推理时使用提示。提示显著提高了许多 NLU 任务的性能(Brown 等人,2020;Schick 和 Schütze,2020)。
然而,我们观察到手动离散提示存在很大的不稳定性。如表 1 所示,对于一个冻结的语言模型,改变提示中的一个单词可能会导致显著的性能下降。正如我们将在第 3 节展示的,当语言模型被调整时,不稳定性问题得到了缓解,但不同提示之间的性能差异仍然相当大,特别是在少次学习设置中。这种离散提示的不稳定性问题在实践中构成了一个关键挑战。最近自动提示的方法试图为给定任务搜索一个表现更好的提示(Shin 等人,2020;Gao 等人,2020;Jiang 等人,2020b),但这些方法并没有改变离散提示的不稳定性本质。
为了减少离散提示的不稳定性,我们提出了一种新的方法 P-Tuning,它采用可训练的连续提示嵌入与离散提示连接使用。具体来说,给定一个离散提示作为输入,P-Tuning 将连续提示嵌入与离散提示标记连接起来,并将其作为输入喂给语言模型。连续提示通过反向传播更新,以优化任务目标。直觉是连续提示在输入中引入了一定程度的可学习性,这可能学会抵消离散提示中微小变化的影响,以提高训练稳定性。为了进一步提高性能,我们采用使用 LSTM 或 MLP 的提示编码器来建模连续提示嵌入之间的依赖关系。
我们在两个 NLU 基准测试上进行了实验:LAMA(Petroni 等人,2019)知识探测和 SuperGLUE(Wang 等人,2019a)。在 LAMA 上,当语言模型冻结时,P-Tuning 在相同的预训练模型下,分别比手动离散提示和搜索提示提高了 20 多分和 9 分。在 SuperGLUE 上,当语言模型微调后,P-Tuning 在完全监督和少次学习设置下,都超过了 PET(Schick 和 Schütze,2020)和最佳离散提示。除了提高性能外,我们的结果还表明,在广泛的任务和设置中,P-Tuning 大幅减少了不同离散提示之间的性能差距,从而提高了语言模型适应的稳定性。
2 方法
2.1 离散提示的问题
提示通过使用自然语言模式作为额外输入,帮助预训练的语言模型适应下游任务(Brown 等人,2020;Schick 和 Schütze,2020)。先前的工作(Zheng 等人,2021)指出,提示在许多自然语言处理(NLP)任务上取得了一致且显著的性能提升。然而,如何编写高性能的离散提示仍然是一个挑战性问题。
我们在 LAMA 知识探测任务(Petroni 等人,2019)上进行了初步实验,该任务旨在通过预测尾部实体从语言模型中提取三元组知识。表 1 的结果显示,手动离散提示导致性能不稳定。例如,如果我们比较表中的最后两个提示,改变提示中的一个单词会导致性能急剧下降 20 分。
鉴于这一挑战,最近的研究提出了通过挖掘训练语料库(Jiang 等人,2020b)、基于梯度的搜索(Shin 等人,2020)以及使用预训练的生成模型(Gao 等人,2020)来自动化离散提示的搜索过程。然而,这些工作旨在寻找性能更好的提示,但并未改变离散提示的不稳定性本质。除了不稳定性问题之外,在离散空间中搜索可能无法充分利用反向传播的梯度,这可能导致次优解决方案。为此,我们探索了训练连续提示的可能性,以稳定并提高语言模型适应的性能。
图 1:使用 P-Tuning 在 SuperGLUE 的 7 个开发数据集上的平均得分。
表 1:离散提示存在不稳定性(高方差),而 P-Tuning 稳定并提高了性能。结果是在 LAMA-TREx P17 上使用 BERT-base-cased 模型的精确度@1。"PT" 指的是 P-Tuning,它在离散提示的基础上训练额外的连续提示。
2.2 P-Tuning
正式地,设 M 是一个预训练的语言模型,其隐藏层大小为 h,词汇表大小为 |V|。设 {(xi, yi)}i 是一个 NLU 任务的标记数据集,其中 x0:n = {x0, x1, ..., xn} 是由一系列离散标记组成的输入,y ∈ Y 是一个标签。我们的目标是估计分类条件概率 fM(x) = pˆ(y|x),其中 M 的参数可以是微调的或冻结的。
提示最初是以离散标记的形式提出的(Schick 和 Schütze,2020)。设 [Di] 是一个离散提示标记。每个提示可以描述为一个模板 T = {[D0:i], x, [D(i+1):j ], y, [D(j+1):k]},它可以将标记数据(包括输入 x 和标签 y)组织成一系列文本标记,以便将任务重新定义为填充输入文本中的空白。例如,对于预测国家首都的任务(LAMA-TREx P36),一个提示可能是“[INPUT]的首都是[LABEL]。”。给定一个标记数据“(Britain, London)”,重新定义的文本将是“Britain的首都是[MASK]。”,其中“[MASK]”应该预测给定的标签“London”。离散提示和离散数据一起通过预训练的嵌入层映射到输入嵌入:
{e(D0)...e(Di), e(x0), ..., e(xn), ..., e(Dk)}
其中 e ∈ R |V|×d。
(注释:假设我们有一个任务,要让计算机猜出一个国家的首都。我们给计算机一个提示,比如“[INPUT]的首都是[LABEL]。” 这个提示中的“[INPUT]”和“[LABEL]”就是空白,计算机需要填上正确的信息。
现在,我们给计算机一个具体的任务实例,比如“Britain, London”。根据我们之前给的提示,计算机会把它转换成“Britain的首都是[MASK]。” 在这里,“[MASK]”就是计算机需要预测的部分,它应该填上“London”。
在计算机的内部,这些提示和数据会被转换成一系列的数字(嵌入),这样计算机就可以处理它们了。这些数字是通过一个特殊的转换层(预训练的嵌入层)得到的,它可以把文字转换成计算机能理解的形式。
最后,这些数字(嵌入)会被用来帮助计算机完成它的任务,比如预测出正确的首都。这个过程就像是给计算机一个填空题,然后它通过学习和理解来填上正确的答案。)
然而,正如第 2.1 节所讨论的,这样的离散提示往往极其不稳定,并且可能不适合反向传播。因此,我们提出了 P-Tuning,它使用连续提示嵌入来改进和稳定提示。设 [Pi] 是第 i 个连续提示嵌入。P-Tuning 的提示模板如下:
T = {[P0:i], x, [P(i+1):j ], y, [P(j+1):k]}
P-Tuning 利用一个额外的嵌入函数 f : [Pi] → hi
将模板映射到
{h0, ..., hi, e(x), hi+1, ..., hj , e(y), hj+1, ..., hk}
最后,我们更新嵌入 {Pi}ki=1 以优化任务损失函数。
(注释:想象一下,你正在教一个机器人如何回答问题。你给它一些提示,就像填空题的提示一样,告诉它在哪些地方填入正确的信息。这些提示就像是你告诉机器人:“在这个空白处填上国家的名字,在那个空白处填上首都的名字。” 但是,你发现这些提示(我们称之为“离散提示”)有时候效果不太好,因为它们很不稳定。也就是说,如果你稍微改变一点提示,机器人的回答可能会变得很差。
为了解决这个问题,我们提出了一个新的方法,叫做 P-Tuning。这个方法不是给机器人一些固定的提示,而是给它一些可以学习和调整的提示(我们称之为“连续提示嵌入”)。这些连续提示嵌入就像是机器人的一套可调整的工具,它可以根据需要来改变这些工具,以便更好地回答问题。
在 P-Tuning 中,我们有一个模板,它包含了一系列的连续提示嵌入,以及实际的问题和答案。这个模板就像是一张地图,告诉机器人如何将这些连续提示嵌入和实际的问题和答案结合起来。然后,我们有一个特殊的函数(我们称之为“嵌入函数 f”),它帮助机器人理解这个模板,并将其转换成它能理解的形式。
最后,我们会根据机器人回答问题的表现来调整这些连续提示嵌入,这样它就能更好地完成任务。这个过程就像是在不断地调整机器人的工具箱,让它更好地适应不同的任务。
具体:
1. **离散提示的不稳定性**:
- 在第 2.1 节中提到,离散提示(即固定的文本片段)在训练过程中可能会导致模型性能的不稳定。这是因为离散提示的微小变化可能会导致模型输出的巨大差异,这在机器学习中是不希望看到的。
2. **P-Tuning 的引入**:
- 为了解决这个问题,研究者们提出了 P-Tuning。这种方法使用连续的提示嵌入,这些嵌入是可以在训练过程中学习的向量,而不是固定的文本片段。这样,模型可以更好地适应不同的输入和任务,提高稳定性。
3. **连续提示嵌入**:
- 设 [Pi] 表示第 i 个连续提示嵌入。这些嵌入是模型可以调整的参数,它们可以帮助模型更好地理解和处理输入数据。
4. **P-Tuning 的提示模板**:
- 提示模板 T 包含了一系列的连续提示嵌入,以及实际的输入 x 和标签 y。这个模板定义了如何将这些元素组合起来,以便模型可以学习如何填充空白(即预测标签 y)。
5. **嵌入函数 f**:
- P-Tuning 使用一个额外的嵌入函数 f,它将连续提示嵌入 [Pi] 映射到模型的隐藏层表示 hi。这个映射过程允许模型将连续提示嵌入与输入数据 x 和标签 y 的嵌入相结合。
6. **映射到隐藏层表示**:
- 映射后的表示形式为 {h0, ..., hi, e(x), hi+1, ..., hj, e(y), hj+1, ..., hk},这里 e(x) 和 e(y) 分别表示输入 x 和标签 y 的嵌入,而 hi 表示连续提示嵌入的隐藏层表示。
7. **优化任务损失函数**:
- 在训练过程中,模型会不断更新这些连续提示嵌入 {Pi},以最小化任务损失函数。这意味着模型会学习如何调整这些嵌入,以便更好地完成特定任务。
P-Tuning 通过引入可学习的连续提示嵌入,提供了一种更灵活、更稳定的方法来指导语言模型处理各种自然语言任务。这种方法允许模型在训练过程中适应不同的输入,从而提高了模型的泛化能力和鲁棒性。)
值得注意的是,我们也可以将离散提示与连续提示连接起来,这种方法表现更好,并且在我们所有的实验中都被采用。P-Tuning 适用于冻结和微调的语言模型。
图 2:一个关于“英国的首都是 [MASK]” 的提示搜索示例。给定上下文(蓝色区域,“英国”)和目标(红色区域,“[MASK]”),橙色区域指的是提示。在 (a) 中,提示生成器只接收离散的奖励;相反,在 (b) 中,连续提示嵌入和提示编码器可以以可微分的方式进行优化。
(注释:图片分为两个部分,分别标记为 (a) 和 (b),展示了离散提示搜索和 P-Tuning 的过程:
(a) **离散提示搜索(Discrete Prompt Search)**:
- 在这个部分,我们看到一个提示生成器(Prompt Generator)接收到一个上下文(蓝色区域,“Britain”)和一个目标(红色区域,“[MASK]”)。
- 提示生成器的任务是生成一个合适的提示(橙色区域),这里的例子是“[INPUT]的首都是[LABEL]”。
- 输入文本(例如,“英国的首都是[MASK]”)被转换成一系列的嵌入(e(The), e(capital), e(of), e(Britain), e(is)),这些嵌入通过预训练的语言模型(如 GPT 或 BERT)进行处理。
- 在离散提示搜索中,提示生成器只能接收离散的奖励(即固定的反馈),这意味着它不能通过梯度下降等连续优化方法来改进提示。
(b) **P-Tuning**:
- 在这个部分,我们看到了 P-Tuning 的过程,它使用连续的提示嵌入([Pi])和提示编码器(Prompt Encoder)。
- 连续提示嵌入([P0:i], [P(i+1):j], [P(j+1):k])被用来构建提示模板,这些嵌入可以在训练过程中通过梯度下降进行优化。
- 输入文本和连续提示嵌入一起被送入预训练的语言模型,模型的输出(hi, e(capital), e(Britain), e([MASK]))包含了连续提示嵌入的隐藏层表示和输入文本的嵌入。
- P-Tuning 允许通过反向传播来优化连续提示嵌入,这使得模型能够更灵活地适应不同的任务和输入。)
2.3 提示编码器
在上述框架中,我们使用一个映射函数 f 将可训练的嵌入 {Pi} 映射到模型输入 {hi}。直觉上,通过使用映射函数,相比于使用独立的可学习嵌入,更容易建模不同提示嵌入之间的依赖关系。在我们的实现中,我们使用一个轻量级的神经网络来构建函数 f。具体来说,在第 3 节中,我们尝试使用长短期记忆(LSTM)网络、多层感知器(MLPs)和恒等映射函数。
试验部分:略
我们通过一个具体的例子来说明 P-Tuning 的工作原理:
假设我们的任务是让一个语言模型(比如 GPT-3)预测一个国家的首都。我们有一个句子:“英国的首都是[MASK]。” 我们的目标是让模型在 [MASK] 的位置填入正确的首都名称,即“伦敦”。
在 P-Tuning 中,我们不会直接给模型一个固定的提示,而是会使用一系列可学习的连续提示嵌入。这些嵌入是模型在训练过程中可以调整的向量,它们帮助模型更好地理解和预测任务。
**步骤 1:定义连续提示嵌入**
我们定义一系列的连续提示嵌入 [P0, P1, ..., Pn]。这些嵌入在模型的输入层之前被添加到输入序列中。
**步骤 2:构建提示模板**
我们构建一个提示模板,它可能看起来像这样:
```
[P0] [P1] ... [Pn] "英国的首都是" [MASK] [Pn+1] ... [Pm]
```
这里的 [P0, P1, ..., Pn] 和 [Pn+1, ..., Pm] 是我们的连续提示嵌入,它们在模型的输入层之前被添加到句子中。
**步骤 3:模型训练**
在训练过程中,模型会接收到这个带有连续提示嵌入的输入序列。模型的目标是预测 [MASK] 的位置应该填入什么词。同时,模型会通过反向传播来调整这些连续提示嵌入,以便更好地完成预测任务。
**步骤 4:优化和预测**
随着训练的进行,连续提示嵌入会不断优化,模型会学会如何根据上下文(在这个例子中是“英国的首都是”)来预测正确的首都名称。最终,当模型遇到类似的输入时,它能够准确地预测出 [MASK] 的位置应该是“伦敦”。
通过这个例子,我们可以看到 P-Tuning 如何通过引入可学习的连续提示嵌入来提高模型在特定任务上的性能。这种方法使得模型能够更灵活地适应不同的输入和任务,提高了模型的泛化能力。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-05-28
2024-04-12
2024-04-25
2024-05-14
2024-07-18
2024-08-13
2024-04-26