©PaperWeekly 原创 · 作者 | 李国趸
单位 | 浙江大学硕士生
研究方向 | 少样本学习
前言
从 prompt learning 的发展来看,一开始关注的是将任务建模成和预训练相近的形式能够提高在少样本微调全部模型参数的表现,然后就是关注怎么去更好地设计 prompt,可以是离散,也可以是连续,或者是混合的 template。
连续型 prompt 的出现,让人们开始思考能否只微调 prompt 相关的参数,固定预训练模型的参数,从而避免传统 fine-tuning 的问题,即每一个下游任务,都要存储一份特定于该任务的微调后的模型拷贝,这种方式被叫做 Parameter-Efficient Prompt Tuning。
这样的设想,最大的挑战在于,仅微调 prompt 相关的参数,能否媲美甚至超过 fine-tuning 的表现。
于是提出下面几种疑问:
在全量数据情况下,仅微调 prompt 相关的参数,能否媲美甚至超过 fine-tuning 的表现?
在少量数据情况下,仅微调 prompt 相关的参数,能否媲美甚至超过 fine-tuning 的表现?
如果能做到上述表现,预训练模型的尺寸是否有影响?是否一定需要超大预训练模型?
本文通过详细解读三篇文章给大家展示了 Parameter-Efficient Prompt Tuning 的发展是如何解决上述疑问的。
从Parameter-Efficient Prompt Tuning说起
论文标题:
The Power of Scale for Parameter-Efficient Prompt Tuning
收录会议:
EMNLP 2021
论文链接:
https://arxiv.org/abs/2104.08691
代码链接:
https://github.com/kipgparker/soft-prompt-tuning
2.1 动机
尽管之前出现了一些全自动设计模板的技术,但是 prompt-based 的范式在下游任务上的表现和传统 fine-tuning 的范式仍然有较大的差距。但是传统 fine-tuning 范式也存在一些问题,比如针对每一个下游任务,都要存储一份特定于该任务的微调后的模型拷贝。
由此,作者提出一种 Parameter-Efficient 的 Prompt Tuning 方式,即固定预训练模型,每个下游任务仅添加若干个 tunable 的 token 作为前缀。后续实验证明了这种方式在大规模预训练模型的助力下,能够媲美传统的 fine-tuning 表现。
2.2 方法
作者以 T5 模型为 backbone,将所有任务重定义为 text-to-text 的生成任务,给定输入,生成的文本代表输出的标签。“prompt”部分则由若干 tunable 的 token 组成,作为输入文本的前缀。在 prompt tuning 过程中,只有 tunable 的 token embeddings 被训练,其他所有参数都被固定住。尽管方法听起来很简单,但是还有一些细节需要被考虑。
prompt 设计的相关问题。首先是 prompt tokens 的初始化。一种简单的方式是直接从零训练,另一种方法则是采用词表中的一些预训练的 token embeddings 去初始化。对于分类任务,还有一种则是用输出类别相关的词去初始化,作为一种 constraint 让模型的输出尽量是这些合法的类别。另外一个问题就是 prompt 的长度,直觉上看,prompt 越长,则可微调的参数越多,作者希望能够在引入最少的可微调参数下达到理想的表现。
Pre-trained 模型的相关问题。一个理想的 prompt 设计应该尽量接近预训练的任务,缩小预训练和下游之间的 gap。T5 模型的预训练任务是 Span Corruption,模型被要求去重构被打乱的句子。例如:Thank you for inviting me to your party last week。模型的输入被打乱为“Thank youme to your partyweek”,模型的输出则是“for invitinglast”。
可以看到输入和输出都被加上了一些特殊 token,也就是说在 Span Corruption 任务中,模型输入和输出的都是不自然的句子。尽管这种预训练和实际使用时候的差异能够通过全量参数的 fine-tuning 来克服,但是对于只微调 encoder 端的前缀参数的 prompt tuning 来说则很难解决,毕竟 decoder 是被固定的,导致生成的第一个 token 很可能是这种特殊 token。
由此,作者针对 T5 实验了这些设定:
Span Corruption