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

10 篇文章 0 订阅
3 篇文章 0 订阅

近些年来,关于预训练语言模型(PLM)的研究数不胜数,Prompt-Tuning就是其中之一主打小巧轻便,更加普适高效,各种花式的魔改,例如 Prefix-tuning、P-tuning、Prompt-tuning等。如果对Prompt不大了解的朋友们可以移步我的另一篇文章https://mp.weixin.qq.com/s?__biz=MzkxMjExNTgwOQ==&mid=2247484234&idx=1&sn=e44ba444c3f12438671df91dffae03c3&chksm=c1109244f6671b52b482b67b569a978d85e4d6cbb150472ec9f1b3f9df11e9e9b1d609420df9&scene=178&cur_album_id=1513596827864989698#rd

一、背景

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

image-20220318113927087

论文地址:https://export.arxiv.org/pdf/2203.00759.pdf

模型整体架构图:

模型架构图

二、核心Ideas

2.1、Prompt-Based Task-Conditioned Transformer

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

Q τ = X τ W q Q_{τ}=X_{τ}W_q Qτ=XτWq K τ = X τ W k K_{τ}=X_{τ}W_k Kτ=XτWk V τ = X τ W v V_{τ}=X_{τ}W_v Vτ=XτWv 其中 Q τ , K τ , V τ Q_τ,K_τ, V_τ Qτ,Kτ,Vτ维度都是 L ∗ h ∗ d h L * h * d_h Lhdh (如果不清楚这里的维度含义可以看下“Attention Is All You Need”)

image-20220318151257897

P τ , k , P τ , v ∈ R l ∗ h ∗ d h P_{τ,k}, P_{τ,v} \in R^{l*h*d_h} Pτ,k,Pτ,vRlhdh 其中l代表模板的长度,这个是个超常数可以自行调节。文中这两个vertors作者称之为hyper-prompts。

image-20220318151402895

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

1) P τ , k P_{τ,k} Pτ,k作为origin key的前缀会参与attention分布的计算 s o f t m a x ( Q τ K τ ′ T ) softmax(Q_τK^{'T}_τ) softmax(QτKτT) , P τ , k P_{τ,k} Pτ,k会直接与 query Q τ Q_τ Qτ进行直接交互这样的话每个token就融入了特定的任务信息。

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

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

2.2 MTL-Prompt

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

image-20220319173606240

D k / v m ∈ R d ∗ b D^{m}_{k/v}\in R^{d*b} Dk/vmRdb 作者称之为down-projection matrices; U k / v m ∈ R d ∗ b U^{m}_{k/v}\in R^{d*b} Uk/vmRdb 作者称之为up-projection matrices 这两个参数矩阵是所以任务共享的,那么问题来了,如果所有任务共享这两个参数矩阵的话那么会不会造成任务之间信息冲突的,毫无疑问是会的,于是作者又来了个私有参数** D τ , k / v m D^{m}_{τ,k/v} Dτ,k/vm** , U τ , k / v m U^{m}_{τ,k/v} Uτ,k/vm ,这两个参数是每个任务私有的。

image-20220319175254596

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

2.3 HyperPrompt

这一部分讲的是设计一个全局共享的HyperNetwork生成上一部份需要的参数 D τ , k / v m D^{m}_{τ,k/v} Dτ,k/vm U τ , k / v m U^{m}_{τ,k/v} Uτ,k/vm ,对应架构图中的图(c)

image-20220319181256600

I τ m = h t ( k τ , z m ) I^m_{τ} =h_t (k_τ, z_m) Iτm=ht(kτ,zm) k τ 是 为 每 一 个 任 务 设 定 的 e m b e d d i n g , z m 是 每 一 层 T r a n s f o r m e r 的 e m b e d d i n g , h t 是 一 个 M L P ( 多 层 感 知 机 ) k_τ是为每一个任务设定的embedding,z_m是每一层Transformer的embedding, h_t是一个MLP(多层感知机) kτembedding,zmTransformerembeddinghtMLP()

image-20220319182816033

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

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

2)减少参数量

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

image-20220319184410539

三、实验结果

image-20220319184531961

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

四、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值