1. 介绍
在某些情况下,GPT-3可以在没有任何特定任务调整的情况下部署。用户只需预先准备一个自然语言任务指令(例如摘要任务的指示为:TL;DR)和一些例子拼接到输入,然后就可以从LM生成输出。这种方法被称为情境学习(in-context learning)或提示(prompting)。
受到提示的启发,这篇论文提出了Prefix-tuning——一个自然语言生成 (NLG) 任务微调的轻量级替代方案。如下图所示,Fine-tuning更新transformer的所有参数(红色部分表示参数更新),因此对于不同的任务,都要保存微调后整个模型的参数;而Prefix-tuning将一系列连续的任务特定向量添加到输入中,这些向量称为Prefix(前缀),与GPT-3添加的真实tokens提示不同,Prefix是虚拟的tokens。Prefix-tuning训练期间冻结transformer的参数,只更新Prefix的参数,这样,我们只需要存储大型Transformer的一个副本和学习到的特定于任务的前缀,为每个附加任务产生非常小的开销。
2. Prefix为何有效? 离散or连续?
论文指出,适当的上下文提示可以在不改变模型参数的情况下,引导模型的输出。例如,如果我们希望模型生成一个单词(例如,Obama),我们可以将其常见搭配作为上下文(例如,Barack),模型就会为所需的单词分配更高的概率。将这种直觉扩展到生成单个单词或句子之外,我们想要找到一个上下文来引导语言模型解决 NLG 任务。然而这样的上下文的存在并不明显,比如说“用一句话概括下表”这样的提示对大部分预训练模型都不起作用(除了GPT-3),无法引导模型执行table-to-text任务。利用训练数据自动寻找最佳的指示可能会有所帮助,但是离散优化在计算上有挑战性。因此,论文用连续的词向量前缀代替离散的tokens,让模型自己根据训练数据去学习任务特定的前缀,免去了人工设计前缀的麻烦,减去了离散优化前缀的繁琐,同时扩大了前缀可学习的空间。
如上图所示, Prefix-tuning 为自回归模型添加前缀以获得输入,或者为编码器译码器添加前缀以获得输入。表示前缀索引的序列,来表示前缀的长度。Prefix-tuning会初始化一个大小为 的可训练参数矩阵,其中表示transformer的第i时刻的隐状态维度。当i在前缀范围内时,直接从矩阵中取出前缀对应的向量作为该时刻的隐向量(Prefix在每一层都保持一致?),其他时刻利用模型的attention机制进行生成:
此外,作者在实验中发现,直接优化Prefix参数矩阵对学习率和初始化非常敏感,因此作者定义了一个中间矩阵辅助学习,先初始化一个维度相对小的参数矩阵,然后借助MLP将其映射到维度,一旦训练完成,这些额外的参数就可以去掉,只需要保存前缀()。
3. 疑惑
论文7.2节做了一个对比实验,对比了离散prompt、embedding-only ablation和本文的prefix-tuning的实验效果,离散prompt指的是使用自然语言模板作为提示,疑惑点在于embedding-only ablation,根据本人的理解,embedding-only ablation应该指的是将添加的连续前缀向量视为虚拟tokens,在transformer的每一层都要更新,由attention机制计算得到新的状态向量;而prefix-tuning添加的前缀向量不参与attention计算,每一层都保持不变。不知道是不是这个意思,希望看到的大佬可以指正~