之前我学习Prompt范式的源起PET后就鸽了很久,相信卷友们已经把Prompt的论文都追完了,把我远远地落在了后面。周末我不甘被卷,奋起直追,连刷三篇paper,希望能赶上大家学习的步伐。 Prefix-tuning- Optimizing continuous prompts for generation NewBeeNLP 永远有料,永远有趣 212篇原创内容 公众号 自动化PromptPrompt范式的第一个阶段,就是在输入上加Prompt文本,再对输出进行映射。但这种方式怎么想都不是很优雅,无法避免人工的介入。即使有方法可以批量挖掘,但也有些复杂(有这个功夫能标不少高质量语料),而且模型毕竟是黑盒,对离散文本输入的鲁棒性很差: 怎么办呢?离散的不行,那就连续的呗 用固定的token代替prompt,拼接上文本输入,当成特殊的embedding输入,这样在训练时也可以对prompt进行优化,就减小了prompt挖掘、选择的成本。 如何加入Prompt前面的想法非常单纯,但实际操作起来还是需要些技巧的。 Prefix-tuningPrefix-tuning是做生成任务,它根据不同的模型结构定义了不同的Prompt拼接方式,在GPT类的自回归模型上采用 值得注意的还有三个改动:
P-tuningP-tuning是稍晚些的工作,主要针对NLU任务。对于BERT类双向语言模型采用模版 同时加了两个改动:
P-tuning的效果很好,之前的Prompt模型都是主打小样本效果,而P-tuning终于在整个数据集上超越了精调的效果: 虽然P-tuning效果好,但实验对比也有些问题,它没有freeze大模型,而是一起精调的,相当于引入了额外的输入特征,而平时我们在输入加个词法句法信息也会有提升,所以不能完全肯定这个效果是prompt带来的。同时随着模型尺寸增大,精调也会更难。 Prompt-tuningPrompt-tuning就更加有信服力一些,纯凭Prompt撬动了大模型。 Prompt-tuning给每个任务定义了自己的Prompt,拼接到数据上作为输入,同时freeze预训练模型进行训练,在没有加额外层的情况下,可以看到随着模型体积增大效果越来越好,最终追上了精调的效果: 同时,Prompt-tuning还提出了Prompt-ensembling,也就是在一个batch里同时训练同一个任务的不同prompt,这样相当于训练了不同「模型」,比模型集成的成本小多了。 其他Trick除了怎么加Prompt之外,Prompt向量的初始化和长度也有所讲究。 Prompt初始化Prefix-tuning采用了任务相关的文字进行初始化,而Prompt-tuning发现在NLU任务上用label文本初始化效果更好。不过随着模型尺寸的提升,这种gap也会最终消失。 Prompt长度从Prompt-tuning的实验可以看到,长度在10-20时的表现已经不错了,同时这个gap也会随着模型尺寸的提升而减小。 总结要说上次看PET时我对Prompt范式还是将信将疑,看完这几篇之后就比较认可了。尤其是Prompt-tuning的一系列实验,确实证明了增加少量可调节参数可以很好地运用大模型,并且模型能力越强,所需要的prompt人工调参就越少。 这种参数化Prompt的方法除了避免「人工」智能外,还有一方面就是省去了Y的映射。因为在精调的过程中,模型的输出就被拿捏死了,而且Prompt-tuning还用label初始化Prompt,更加让模型知道要输出啥。 Finally,终于追上了前沿,大家的鬼点子可真多啊。 一起交流 |
|