Fine-tuning过时啦,NLG生成任务如何Tuning?

2022-09-06 20:11:50 浏览数 (2)

论文原文: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缺点:

  • 需要微调语言模型所有参数,每个任务都需要保存一遍所有的模型参数。
  • 同时,最近也有lightweight fine-tuning,即固定语言模型大部分参数,微调2-4%任务相关的参数,但是作者认为还是太多。

受启发于gpt3出现之后提出的in-context learning(固定语言模型参数),因此,prefix-tuning致力于如何不改变语言模型参数的方式,增加一些任务相关的(task-specific)额外的参数,希望效果甚至超过finetune(降本增效)。

image-20220516000951329.pngimage-20220516000951329.png

如图,prefix-tuning每个任务有少量prefix的参数,约占整体0.1%,远小于lightweight fine-tuning的2-4%。

方法

出发点:生成任务,想要生成合适的下文,只要给语言模型输入合适的上文(prompt),就能在不改变语言模型参数的情况下获得对应的输出,例如想要生成Obama,那么上文输入Barack大概率是可行的。问题就是如何学到上文,以及上文是什么形式的输入。

首先是输入:

  1. 上文如果是离散的token的话,难以学习,可以通过搜索,不够精细。
  2. 如果是continuous word embeddings,那么就可以通过梯度优化向量。选他没错。

其次就是如何学习,文章定义Prefix方式,即:

  • 对于自回归模型:z = PREFIX; x; y
  • 对于encoder-decoder模型:z = PREFIX; x; PREFIX′; y,e-d都包含了prefix作为prompt。

而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相对位置都是固定的,所以训练后向量中本身就有一些上下文信息,因为上下文就基本不变,所以每次都是一样的也影响不大。

企业微信截图_47432c20-3fbd-4326-a0dd-fb9562622efc.png企业微信截图_47432c20-3fbd-4326-a0dd-fb9562622efc.png

实验

在训练阶段,只有$P_{theta}$是可训练的,无论gpt2-MEDIUM还是LARGE,相比之前的模型基本都可比,有些甚至更优,而这是在只改变0.1%参数的情况下。不得不说降本增效啊。

image.pngimage.png

至于为什么prefix是激活层?为什么是在开头,如果在句子后面会怎么样?还有其他位置呢?

因此文章还研究了:

  • 从embedding层微调、
  • infix( x;INFIX; y):位置对于生成效果的影响,prefix也是要略优于infix的。

其中prefix-tuning是PREFIX; x; y形式,infix-tuning即x; INFIX; y

下过如下图,prefix都是最优的。

实验效果实验效果

关注公众号接收最新文章:百川NLP

0 人点赞