论文原文:Prefix-Tuning: Optimizing Continuous Prompts for Generation, 2021,不到一年的文章,引用已经两百多了,你说呢。 git: https://github.com/XiangLi1999/PrefixTuning
Fine-tuning范式大家肯定都再熟悉不过,微调所有语言模型参数,而从gpt3出现之后提出的in-context learning,还是越来越火的prompt,fine-tuning 已经out of state了。而这篇文章就提出prefix-tuning的nlg训练方法。
国际惯例,列举finetuning缺点:
受启发于gpt3出现之后提出的in-context learning(固定语言模型参数),因此,prefix-tuning致力于如何不改变语言模型参数的方式,增加一些任务相关的(task-specific)额外的参数,希望效果甚至超过finetune(降本增效)。
如图,prefix-tuning每个任务有少量prefix的参数,约占整体0.1%,远小于lightweight fine-tuning的2-4%。
出发点:生成任务,想要生成合适的下文,只要给语言模型输入合适的上文(prompt),就能在不改变语言模型参数的情况下获得对应的输出,例如想要生成Obama,那么上文输入Barack大概率是可行的。问题就是如何学到上文,以及上文是什么形式的输入。
首先是输入:
其次就是如何学习,文章定义Prefix方式,即:
而prefix是什么呢?是virtual tokens,使用$P_\theta$保存的向量作为激活层的输入向量,而其他token正常使用语言模型激活层的输出。
$$
h{i}=\left{\begin{array}{ll}P{\theta}i,:, & \text { if } i \in \mathrm{P}{\mathrm{idx}} \ \mathbf{L M}{\phi}\left(z{i}, h{<i}\right), & \text { otherwise }\end{array}\right.
$$
注意这里是激活层,至于为什么是激活层,后面会通过实验说明为什么,结构图如下:prefix的输出隐变量来自于$P_{theta}$保存的隐变量。 眼尖的同学可能会发现这样的话隐变量中可能会丢失上下文信息,讲道理应该在词向量层,只有virtual tokens可训,其他词向量不可训才对。 我理解因为prefix的token相对位置都是固定的,所以训练后向量中本身就有一些上下文信息,因为上下文就基本不变,所以每次都是一样的也影响不大。
在训练阶段,只有$P_{\theta}$是可训练的,无论gpt2-MEDIUM还是LARGE,相比之前的模型基本都可比,有些甚至更优,而这是在只改变0.1%参数的情况下。不得不说降本增效啊。
至于为什么prefix是激活层?为什么是在开头,如果在句子后面会怎么样?还有其他位置呢?
因此文章还研究了:
其中prefix-tuning是PREFIX; x; y形式,infix-tuning即x; INFIX; y
下过如下图,prefix都是最优的。
关注公众号接收最新文章:百川NLP
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。