原始论文地址:2202.12499] PromDA: Prompt-based Data Augmentation for Low-Resource NLU Tasks (arxiv.org)
深度神经网络通常需要大规模、高质量标注数据才能实现 SOTA \text{SOTA} SOTA的效果。然而,在许多场景中构造标注数据都十分有挑战。本论文研究低资源自然语言理解( NLU \text{NLU} NLU)任务,包括序列分类和序列标注任务。先前的工作通常会为 NLU \text{NLU} NLU模型提供额外的标注数据。一些工作通过部署自训练框架来从无标注领域内数据生成伪标注数据。但是,从通用语料中抽取领域内无标注数据并非易事。一些工作利用自启发规则来扩展原始的少量训练数据(例如随机替换同义词),从而有效地创建新的训练实例。然而,这些方法都有可能扭曲文本,导致产生的合成数据在语法和语义上不正确。
为了解决上面的问题,许多现有的工作尝试使用语言模型( Language Model,LM \text{Language Model,LM} Language Model,LM)或者预训练语言模型( Pre-trained Language Model,PLM \text{Pre-trained Language Model,PLM} Pre-trained Language Model,PLM)来进行数据增强。给定训练数据,其可以直接微调 PLM \text{PLM} PLM来产生新的合成数据。然而在低资源 NLU \text{NLU} NLU任务中,使用小数据直接微调 PLM \text{PLM} PLM的所有参数可能会导致过拟合, PLM \text{PLM} PLM只会简单的记住这些训练样本。这将会导致产生的合成数据与原始训练数据非常相似,不能为 NLU \text{NLU} NLU模型提供新的训练信号。最近,一些工作提出了prompt tuning,其仅需要反向传播 Soft Prompt \text{Soft Prompt} Soft Prompt的错误。同时也表明prompt tuning足够与全模型微调相媲美,并且能够极大的减少调整的参数量。因此,prompt tuning十分适合解决低资源微调的过拟合问题。
本文提出了基于Prompt的数据增强模型( Prompt-based Data Augmentation , PromDA \text{Prompt-based Data Augmentation},\textbf{PromDA} Prompt-based Data Augmentation,PromDA)。具体来说,固定整个预训练模型,但在小数据上微调时,仅需要微调额外的 soft prompt \text{soft prompt} soft prompt。此外,作者还观察到 soft prompt \text{soft prompt} soft prompt的初始化对于微调有十分重要的影响,特别是在低资源条件下。为了更好的初始化prompt参数用于数据增强任务,我们提出了任务不可知的同义关键词预训练任务,来预训练 PLM \text{PLM} PLM的prompt参数。这个任务模拟了从部分片段信息(例如关键词)生成完整训练样本的过程。类似于先前的工作,论文基于输出的标签来产生合成数据,本文称这个方法为 Output View Generation \text{Output View Generation} Output View Generation。为了提升生成样本的多样性,论文实现了另一种称为 Input View Generation \text{Input View Generation} Input View Generation的微调生成任务,其从样本中抽取关键词作为输入,样本作为输出。由于小训练数据训练出的 NLG \text{NLG} NLG模型还是会生成低质量的样本,本文利用一致性过滤( NLU Consistency Filter \text{NLU Consistency Filter} NLU Consistency Filter)来过滤生成的样本。
在低资源 NLU \text{NLU} NLU任务中,仅有一个标注数据集合 T = { ( x 1 , y 1 ) , … , ( x n , y n ) } \mathcal{T}=\{(x_1,y_1),\dots,(x_n,y_n)\} T={(x1,y1),…,(xn,yn)}可以使用,其中 n n n相对较小。基于原始标注数据 T \mathcal{T} T生成的合成表示数据为 T LM = { ( x ^ 1 , y ^ 1 ) , … , ( x ^ n , y ^ n ) } \mathcal{T}_{\text{LM}}=\{(\hat{x}_1,\hat{y}_1),\dots,(\hat{x}_n,\hat{y}_n)\} TLM={(x^1,y^1),…,(x^n,y^n)}。本文的目标是,使用 T ∪ T LM \mathcal{T}\cup\mathcal{T}_{\text{LM}} T∪TLM训练出优于仅使用 T \mathcal{T} T训练出的模型。
微调是一种常见的调整预训练模型适应下游任务的方式。在低资源数据增强领域,期望生成模型产生的合成数据 L LM \mathcal{L}_{\text{LM}} LLM不同于训练集 T \mathcal{T} T,从而为 NLU \text{NLU} NLU模型提供新的信息。但是,使用少量训练数据微调的模型并不适合用来生成增强样本,因为容易过拟合至训练集上。
Prompt-based learning最早起源于 GPT-3 \text{GPT-3} GPT-3的zero-shot learning,其保持预训练语言模型参数的固定,仅在任务相关的输入前添加一些附加的自然语言信息。这种固定预训练语言模型参数的方法可以改善训练中的泛化性。本文受先前工作的启发,使用 Soft Prompt \text{Soft Prompt} Soft Prompt来训练预训练语言模型。具体来说,本文使用基于Transformer预训练语言模型的 seq2seq \text{seq2seq} seq2seq模型来产生合成数据。但是,不同于先前一些工作中的 Soft Prompt \text{Soft Prompt} Soft Prompt,论文中的工作不仅会在输入层添加 Soft Prompt \text{Soft Prompt} Soft Prompt,而且会在每个transformer层前都添加可训练多层感知机。
令 P j = { p 1 j , … , p k j } P^j=\{\textbf{p}_1^j,\dots,\textbf{p}_k^j\} Pj={p1j,…,pkj}表示第 j j j层的 Soft Prompt \text{Soft Prompt} Soft Prompt,则在Transformer模型中第 j j j层的第 i i i个隐藏层输出 h i j \textbf{h}_i^j hij定义如下:
h i j = { p i j , i ≤ k w i , i > k ∧ j = 0 T r a n s ( h j − 1 ) i , Otherwise \textbf{h}_i^j= \begin{cases} \textbf{p}_i^j,i\leq k \\ \textbf{w}_i,i>k\land j=0 \\ Trans(\textbf{h}^{j-1})_i,\text{Otherwise} \end{cases} hij=⎩⎪⎨⎪⎧pij,i≤kwi,i>k∧j=0Trans(hj−1)i,Otherwise
其中, Trans ( ) \text{Trans}() Trans()是Transformer层的前向传播函数, w i w_i wi是输入层的固定词向量。(感觉上,这里的意思是 P j P^j Pj可训练,其余参数不可训练)
Soft Prompt \text{Soft Prompt} Soft Prompt中 P \text{P} P的参数初始化会显著影响合成数据的质量,特别是在低资源数据增强任务中。本文提出了直接固定预训练语言模型参数,仅预训练 Soft Prompt \text{Soft Prompt} Soft Prompt参数的Prompt初始化方式。此外,论文基于假定"能够从给定的部分信息来合成完整的数据",提出了预训练任务 Synonym Keywords to Sentence \text{Synonym Keywords to Sentence} Synonym Keywords to Sentence。
具体来说,给定一段文本。首先,使用无监督关键词抽取算法 R a k e Rake Rake获取关键词;然后,利用 WordNet \text{WordNet} WordNet进行关键词的同义词替换;最后,基于这些同义关键词来重构原始文本。
先前的一些工作通常会对编码器的输入进行约束,例如输入为固定的关键词或者有限的标签。但是,这种相对较小的输入空间可能会导致输出也较为相似。因此,为了进一步丰富输入空间,论文提出了双视角( Dual-View \text{Dual-View} Dual-View)数据增强。其中,"输入视角( Input View \text{Input View} Input View)"会基于句子中的关键词来产生合成数据;而"输出视角( Output View \text{Output View} Output View)"则是基于标签来产生合成数据。如算法1中的说明, PromDA \textbf{PromDA} PromDA先会从 Input View \text{Input View} Input View和 Output View \text{Output View} Output View生成 T I 1 \mathcal{T}_I^1 TI1和 T O 1 \mathcal{T}_O^1 TO1。然后, PromDA \textbf{PromDA} PromDA将 T I 1 \mathcal{T}_I^1 TI1输入至 Output Veiw \text{Output Veiw} Output Veiw,并将 T O 1 \mathcal{T}_O^1 TO1输入至 Input View \text{Input View} Input View。这个操作将会使用最终的输出 T O 2 \mathcal{T}_O^2 TO2和
T I 2 \mathcal{T}_I^2 TI2包含更多的新单词/短语/知识。
对于具体任务。文本分类任务的输出是合成文本和标签,序列标注任务的输出是具有标注边界和实体类型的文本。下表为双视角合成数据的示例
由于 PromDA \textbf{PromDA} PromDA使用小数据进行训练,其可能会生成低质量的样本。论文使用 NLU \text{NLU} NLU一致性过滤来生成最终的样本。具体来说,给定 PromDA \textbf{PromDA} PromDA产生的合成数据及标签,使用 NLU \text{NLU} NLU模型来再次标注这些数据,并保留那些 PromDA \textbf{PromDA} PromDA和 NLU \text{NLU} NLU模型输出一致的样本。
算法1----双视角数据增强
输入:少量的标注数据集 T \mathcal{T} T,迭代数 N N N;
输出:训练好的 NLU \text{NLU} NLU模型 M N L U M_{NLU} MNLU;
DualViewDA ( D , N ) \text{DualViewDA}(\mathcal{D},N) DualViewDA(D,N)
- M L M ← Train ( L M , T ) M_{LM}\leftarrow\text{Train}(LM,\mathcal{T}) MLM←Train(LM,T) # 训练语言模型
- T I 1 ← Gen ( M L M , T , I ) \mathcal{T}_I^1\leftarrow\text{Gen}(M_{LM},\mathcal{T},I) TI1←Gen(MLM,T,I) # Input,合成数据1
- T O 1 ← Gen ( M L M , T , O ) \mathcal{T}_O^1\leftarrow\text{Gen}(M_{LM},\mathcal{T},O) TO1←Gen(MLM,T,O) # Output,合成数据2
- T I 2 ← Gen ( M L M , T O 1 , I ) \mathcal{T}_I^2\leftarrow\text{Gen}(M_{LM},\mathcal{T}_O^1,I) TI2←Gen(MLM,TO1,I) # 合成数据3
- T O 2 ← Gen ( M L M , T I 1 , I ) \mathcal{T}_O^2\leftarrow\text{Gen}(M_{LM},\mathcal{T}_I^1,I) TO2←Gen(MLM,TI1,I) # 合成数据4
- T ^ L M ← T I 1 ∪ T I 2 ∪ T O 1 ∪ T O 2 \hat{\mathcal{T}}_{LM}\leftarrow\mathcal{T}_I^1\cup\mathcal{T}_I^2\cup\mathcal{T}_O^1\cup\mathcal{T}_O^2 T^LM←TI1∪TI2∪TO1∪TO2 # 合并所有的合成数据
- M N L U 0 ← Train ( N L U , T ) M_{NLU}^0\leftarrow\text{Train}(NLU,\mathcal{T}) MNLU0←Train(NLU,T) # 使用少量标注数据训练NLU模型
- for r ∈ 1 , … , N do \textbf{for}\;r\in 1,\dots,N\;\textbf{do} forr∈1,…,Ndo
- T L M r ← Consist ( M N L U r − 1 , T ^ L M ) \quad\mathcal{T}_{LM}^r\leftarrow\text{Consist}(M_{NLU}^{r-1}, \hat{\mathcal{T}}_{LM}) TLMr←Consist(MNLUr−1,T^LM) # 使用一致性过滤产生用于训练的合成数据
- T r ← T L M r ∪ T \quad\mathcal{T}^r\leftarrow\mathcal{T}_{LM}^r\cup\mathcal{T} Tr←TLMr∪T
- M N L U r ← Train ( N L U , T r ) \quad M_{NLU}^r\leftarrow\text{Train}(NLU,\mathcal{T}^r) MNLUr←Train(NLU,Tr)
- M N L U ← M N L U N M_{NLU}\leftarrow M_{NLU}^N MNLU←MNLUN
- return M N L U \textbf{return}\;M_{NLU} returnMNLU