Unsupervised Text Generation by Learning from Search(TGLS)
Unsupervised Text Generation by Learning from Search
- "先搜索后学习"的无监督文本生成方法
- 在paraphase generation和text formalization上,无监督模型上SOTA,有逼近监督模型的效果
文章的主要贡献
- 1、提出了无监督文本生成的通用模型框架(TGLS),在搜索中学习
- 2、展示了将大规模预训练模型整合到TGLS上的方法
- 3、在paraphase generation和text formalization上的贡献
- 4、对于在text formalization上,是首个设计基于搜索的方法并扩展到TGLS上
TGLS
- 方法分两个阶段
- 1、搜索:将文本用模拟退火(SA),并将搜索生成得到的文本作为“伪标注文本”,得到一个搜索器。
- 2、学习:将搜索器的结果输入生成器,并来训练生成器,得到新文本。
- 最终1、2交替
一阶段(搜索器):模拟退火搜索
- 用启发式的目标函数
s
(
y
∣
x
)
s(y|x)
s(y∣x)来作为文本生成的打分函数(x生成y)
s ( y ∣ x ) = s l m ( y ) ⋅ s s e m a n t i c ( x , y ) ⋅ s t a s k ( y , ⋅ ) s(y|x)=s_{lm}(y)\cdot s_{semantic}(x,y)\cdot s_{task}(y,\cdot) s(y∣x)=slm(y)⋅ssemantic(x,y)⋅stask(y,⋅)- s l m ( y ) s_{lm}(y) slm(y):文本的流畅度
- s s e m a n t i c ( x , y ) s_{semantic}(x,y) ssemantic(x,y):替换后文本的关联度
- s t a s k ( y , ⋅ ) s_{task}(y,\cdot) stask(y,⋅):和具体的任务相关
我们要最大化这目标函数,这用SA去做
假设当前已经进行了t轮,当前的文本是 y ( t ) y^{(t)} y(t),我们要生成 y ′ y' y′,生成的方式:word的插入,删除和替换
- 我们对于是否接受 y ′ y' y′有一个概率(SA中): p ( a c c e p t ∣ y ′ , y ( t ) , x , T ) = m i n { 1 , e x p ( s ( y ′ ∣ x ) − s ( y ( t ) ∣ x ) T ) } p(accept|y',y^{(t)},x,T)=min\{1,exp(\frac{s(y'|x)-s(y^{(t)}|x)}{T})\} p(accept∣y′,y(t),x,T)=min{1,exp(Ts(y′∣x)−s(y(t)∣x))}(T是SA的温度变量)
- 如果接受的话, y ( t + 1 ) = y ′ y^{(t+1)}=y' y(t+1)=y′
问题就是打分函数的构造了
一、文本流畅度 s l m s_{lm} slm
- 用在非平行语料上学习特殊任务的微调的GPT2计算文本的概率得分
s l m ( y ) = ( ∏ i = 1 n p ( y i ∣ y 1 , . . . , y i − 1 ) ) α s_{lm}(y)=(\prod_{i=1}^n p(y_i|y_1,...,y_{i-1}))^{\alpha} slm(y)=(i=1∏np(yi∣y1,...,yi−1))α- α \alpha α是
- 使用的是,带byte-pair encoding(BPE)的GPT2词汇表,这里的 y i y_i yi是在BPE分割后的token
二、语义的相关度 s s e m a n t i c s_{semantic} ssemantic
假设句子是 x = ( x 1 , . . . , x m ) x=(x_1,...,x_m) x=(x1,...,xm)
- 分两种:词级别和句子级别
- 词级别:首先用预训练的RoBERTa得到每个词的特征。因为用了MLM,所以RoBERTa用来做特征表示很好,RoBERTa计算的一个词表示为
R
o
B
E
R
T
a
(
x
i
,
x
)
RoBERTa(x_i,x)
RoBERTa(xi,x)
- 词级的语义分数,计算为:有多少keyword信息是被保留的
s w o r d ( y , x ) = min k ∈ k e y w o r d ( x ) max y i ∈ y R o B E R T a ( k , x ) ⊤ R o B E R T a ( y i , y ) s_{word}(y,x)=\min_{k\in keyword(x)}\max_{y_i\in y} RoBERTa(k,x)^\top RoBERTa(y_i,y) sword(y,x)=k∈keyword(x)minyi∈ymaxRoBERTa(k,x)⊤RoBERTa(yi,y)
- 词级的语义分数,计算为:有多少keyword信息是被保留的
- 句子级别:计算两个句子向量的余弦相似度:
s
s
e
n
t
(
y
,
x
)
=
y
⊤
x
∣
∣
y
∣
∣
∣
∣
x
∣
∣
s_{sent}(y,x)=\frac{y^\top x}{||y||||x||}
ssent(y,x)=∣∣y∣∣∣∣x∣∣y⊤x
- 句子向量计算为 x = R o B E R T a ( [ B O S ] , x ) x=RoBERTa([BOS],x) x=RoBERTa([BOS],x), [ B O S ] [BOS] [BOS]为句子开头
- 词级别:首先用预训练的RoBERTa得到每个词的特征。因为用了MLM,所以RoBERTa用来做特征表示很好,RoBERTa计算的一个词表示为
R
o
B
E
R
T
a
(
x
i
,
x
)
RoBERTa(x_i,x)
RoBERTa(xi,x)
最后 s s e m a n t i c ( y , x ) = s w o r d ( y , x ) β ⋅ s s e n t ( y , x ) γ β , γ 为 超 参 s_{semantic}(y,x)=s_{word}(y,x)^{\beta}\cdot s_{sent}(y,x)^{\gamma}\qquad \beta,\gamma为超参 ssemantic(y,x)=sword(y,x)β⋅ssent(y,x)γβ,γ为超参
三、特殊任务分数 s t a s k ( y ) s_{task}(y) stask(y)
- 两个任务:paraphase generation和text formalization
1、paraphase generation
- 任务是生成相似语义,但词汇不同
之前的工作是用BLEU分数,来惩罚两个句子n-gram的重叠,相当于BLEU取反
s p a r a p h a s e ( y , x ) = ( 1 − B E L U ( y , x ) ) δ s_{paraphase}(y,x)=(1-BELU(y,x))^{\delta} sparaphase(y,x)=(1−BELU(y,x))δ
2、text formalization
- 任务是将一个非正式的句子,转化成一个正式的风格,如文本风格迁移
这里以风格迁移举例,前提假设是,有风格标签,但是没有平行的监督样本 - 训练一个分类器来预测风格的可能性,这里也是基于RoBERTa的特征表示
- 这里的分数计算为 s f o r m a l i t y ( y ) = ( p ( f o r m a l ∣ R o B E R T a ( [ B O S ] , y ) ) ) δ s_{formality}(y)=(p(formal|RoBERTa([BOS],y)))^{\delta} sformality(y)=(p(formal∣RoBERTa([BOS],y)))δ
四、SA的句子编辑
在进行了t轮时,SA随机选择一个位置进行操作:Repalce,Insert,Delete
1、Repalce
根据 s ( y ∣ x ) s(y|x) s(y∣x)引起的后验概率来选择 x i x_i xi处要替换的候选单词
- 为了提高效率,之前有工作通过前向-后向的语言模型来评估top-k的候选单词
- 这里,通过RoBERTa来评估一个单词的后验概率,通过随机mask掉这一块RoBERTa的embedding层来实现(相当于变向使用MLM)
2、Insert
- 和replace一样,也是从后验的角度来推荐预测一个词
3、delete
- 就直接删
在text formalization中,这里的句子编辑要基于PPDB(Better paraphrase ranking, fine-grained entailment relations, word embeddings, and style classification
)中的规则,如"we are"变成"we’re."等,之前的工作也有手动设计规则来预处理的步骤
- TGLS可以简单的利用现成的资源,因为它能过滤掉一些坏的推荐词
二阶段(学习器):词级的交叉熵表示(Word-Level Cross-Entropy(CE) Learning)
SA推理效率低下,每个sample都要经历几百步的变换与评估
- 我们真正想训练的是一个可调控的文本生成器:我们在SA的结果上,训练一个GPT2,因此这个GPT2将可以从
p
(
y
∣
x
)
p(y|x)
p(y∣x)用自回归的方式直接生成一个句子
- 我们将输入的
x
x
x和SA生成的句子
y
(
S
A
)
y^{(SA)}
y(SA),用一个[SEP]在中间拼接起来
J C E = − ∑ n = 1 N ∑ v ∈ V y i , v ( S A ) log p i , v ( G P T 2 ) J_{CE}=-\sum_{n=1}^N\sum_{v\in V}y_{i,v}^{(SA)}\log p_{i,v}^{(GPT2)} JCE=−n=1∑Nv∈V∑yi,v(SA)logpi,v(GPT2) - y i , v ( S A ) y_{i,v}^{(SA)} yi,v(SA)表示SA的输出中,第i个词是不是v(是为1,不是为0)
- p i , v ( G P T 2 ) = P r [ y i = v ∣ y < i ( S A ) , x ] p_{i,v}^{(GPT2)}=Pr[y_i=v|y_{<i}^{(SA)},x] pi,v(GPT2)=Pr[yi=v∣y<i(SA),x],这个由GPT预测
- 这个词级的CE结合SA的输出并使用teacher-forcing的方法训练(就是y的设置)
- 我们将输入的
x
x
x和SA生成的句子
y
(
S
A
)
y^{(SA)}
y(SA),用一个[SEP]在中间拼接起来
最主要的是,最小化这个交叉熵损失,相当于最小化SA的输出与GPT输出的分布 min K L ( y ^ i ( S A ) ∣ ∣ p i ( G P T 2 ) ) \min KL(\hat y_i^{(SA)}||p_i^{(GPT2)}) minKL(y^i(SA)∣∣pi(GPT2)),实际上是在一定程度上去拟合SA的打分函数
最终(交替):句子级最大间距学习(Sequence-Level Maximum-Margin(MM) Learning)
尝试在搜索和学习中进行交替,即再将GPT2生成的输入进SA中
- 把x输入进GPT2中,用beam search得到输出序列记为 Y ( G P T 2 ) = { y ( G P T 2 , 1 ) , y ( G P T 2 , 2 ) . . . y ( G P T 2 , B ) } Y^{(GPT2)}=\{y^{(GPT2,1)},y^{(GPT2,2)}...y^{(GPT2,B)}\} Y(GPT2)={y(GPT2,1),y(GPT2,2)...y(GPT2,B)}
- 然后随机选择一个,输入进SA中,得到结果
y
(
S
A
−
S
2
)
y^{(SA-S2)}
y(SA−S2) ,得到B+1个样本的集合
Y
~
=
Y
(
G
P
T
2
)
∪
{
y
(
S
A
−
S
2
)
}
\tilde{Y}=Y^{(GPT2)}∪\{y^{(SA-S2)}\}
Y~=Y(GPT2)∪{y(SA−S2)}
- 然后将上面 s ( y ∣ x ) s(y|x) s(y∣x)最大的作为正样本,其他的作为负样本。大多数情况下,正样本是 y ( S A − S 2 ) y^{(SA-S2)} y(SA−S2)
- 用最大间隔去训练GPT2
J M M = ∑ y − ∈ Y ~ , y − ≠ y + max { 0 , − E ( y + ) + E ( y − ) − Δ } J_{MM}=\sum_{y^-\in \tilde{Y},y^- ≠y^+}\max \{0,-E(y^+)+E(y^-)-\Delta\} JMM=y−∈Y~,y−=y+∑max{0,−E(y+)+E(y−)−Δ}- − E ( y ) = ∑ i = 1 N z i , y i -E(y)=\sum_{i=1}^N z_{i,y_i} −E(y)=∑i=1Nzi,yi, z i , y i z_{i,y_i} zi,yi是单词 y i y_i yi在第i步的logit
伪代码与流程示意图
实验
实验结果挺好,详细请看原文