如何优雅的将Prompt应用于多任务场景?

553 阅读4分钟
  • 一、背景
  • 二、核心Ideas
    • 2.1、Prompt-Based Task-Conditioned Transformer
  • 2.2 MTL-Prompt
    • 2.3 HyperPrompt
  • 三、实验结果
  • 四、总结

近些年来,关于预训练语言模型(PLM)的研究数不胜数,Prompt-Tuning就是其中之一主打小巧轻便,更加普适高效,各种花式的魔改,例如 Prefix-tuning、P-tuning、Prompt-tuning等。如果对Prompt不大了解的朋友们可以移步我的另一篇文章NLP新宠——Prompt范式

一、背景

今天想和给大家介绍的工作是如何将Prompt应用于多任务的场景,常见的Multi-task模型一般的架构是底部共享参数,然后在顶层每个场景学习自己的私有参数典型的代表模型有MMoE等,也就是说关键点在于如何让模型学习每个任务的特定参数,今天解读的论文是在Transformer 中Muti-Head Self-Attention做的文章,在计算self-attention的时候融入特定任务的信息,那么到底怎么融入呢我们接下来进一步分析。

论文地址:export.arxiv.org/pdf/2203.00…

模型整体架构图:

二、核心Ideas

2.1、Prompt-Based Task-Conditioned Transformer

该部分主要是介绍如何将每个任务特定的prompt信息加入到训练任务中去,具体的做法是将场景信息分别与进行concat, 然后在与去进行multi-head self-attention。

       其中 维度都是   (如果不清楚这里的维度含义可以看下“Attention Is All You Need”)

 其中l代表模板的长度,这个是个超常数可以自行调节。文中这两个vertors作者称之为hyper-prompts。

那么为什么会认为加入hyper-prompts会在多任务的场景下有效呢?

1)作为origin key的前缀会参与attention分布的计算  , 会直接与 query 进行直接交互这样的话每个token就融入了特定的任务信息。

2)可以作为特定任务的记忆,让多头注意力从中提取信息。

这里还有个问题任务特定的信息是如何来的呢?随机初始化?大家都知道 Transfomer含有多层mutil-head self-attention假设为m 层,如果我们有T个任务,那么我们为了加入特定任务信息参数量为 ,这样的话参数量是不大可以接受的,那么有没有别的办法呢,我们接着往下讲。

2.2 MTL-Prompt

这一部分作者讲的有点混乱,我讲下自己的见解,如果有错可以留言指出。上面我们说到为每一个任务,每一层mutlti-head self-attention 设定特定任务参数的话参数量有点不可接受,于是作者为每一个任务初始化一个全局的参数矩阵 ,然后通过一系列转换得到

  作者称之为down-projection  matrices;   作者称之为up-projection  matrices 这两个参数矩阵是所以任务共享的,那么问题来了,如果所有任务共享这两个参数矩阵的话那么会不会造成任务之间信息冲突的,毫无疑问是会的,于是作者又来了个私有参数**** ,  ,这两个参数是每个任务私有的。

这一部分的流程可以参考整体架构图中间的那一部分。

2.3 HyperPrompt

这一部分讲的是设计一个全局共享的HyperNetwork生成上一部份需要的参数  ,  ,对应架构图中的图(c)

    

作者觉得这一部分的好处是:

1)所以任务以及Transformer每一层可以共享信息

2)减少参数量

对于第二点其实并没有减少多少参数量呀(消融实验有给出对比),而且还会增加整体模型的复杂度,不太符合奥卡姆剃刀原则(简单好用)。

三、实验结果

后面三个实验是本文的结果,可以看出参数量并没有减少多少,效果提升 也不是很明显。

四、总结

本文说到底其实还是围绕着在multi-head self-attention计算时为每个任务学习特定的参数,而不是在输入embedding中直接加入,谷歌出品我们暂且相信它会有效吧。