如何提高文本生成任务中的文本多样性

1. 引言

    在文本生成任务中,经典模型Seq2Seq虽然取得了很大的进步,但是由于其目标函数采用的是极大似然估计,即:
1 / ∣ S ∣ ∑ ( T , S ) ∈ S log ⁡ p ( T ∣ S ) 1 /|\mathcal{S}| \sum_{(T, S) \in \mathcal{S}} \log p(T | S) 1/S(T,S)Slogp(TS)其中, S S S表示给定的输入句子, T T T表示输出句子。因此,会导致一个问题,即生成的句子一般是训练集中比较高频的回复,这样的回复虽然是比较安全的,但是却会使得回复变得平淡无奇,缺乏多样性。因此,很多学者对该模型进行改进,希望可以提高文本生成的多样性,从2015年以来,提高文本多样性的方法大致可以分为四类:

  • 第一类:采用新的模型对Beam Search得到的候选序列进行重排,比如MMI-bidi等。
  • 第二类:引入内容的形式,对输出文本先预测一个关键词,然后对其进行补全,比如Seq2BF等。
  • 第三类:直接修改Beam Search算法,对每个时间步的条件概率施加多样性惩罚,比如MMI-antiLM、diverseRL、DBS等。
  • 第四类:直接修改训练时的损失函数,比如ITF-loss等

本文将对这些方法进行汇总和对比。

2. MMI-antiLM、MMI-bidi方法

    为了使得生成的句子更加多样性,李纪为博士等人(2015)采用了最大互信息(Maximum Mutual Information,MMI)作为目标损失函数,在一定程度上提高了文本生成的多样性和趣味性。

论文地址:《A Diversity-Promoting Objective Function for Neural Conversation Models》

2.1 MMI-antiLM、MMI-bidi损失函数

    在文本生成任务中,令 S S S表示给定的输入句子 S = { s 1 , s 2 , … , s N s } S=\left\{s_{1}, s_{2}, \dots, s_{N_{s}}\right\} S={ s1,s2,,sNs},其中, N s N_{s} Ns表示输入句子的词汇数量,即句子的长度,令 T T T表示输出句子 T = { t 1 , t 2 , … , t N t , E O S } T=\left\{t_{1}, t_{2}, \ldots, t_{N_{t}}, E O S\right\} T={ t1,t2,,tNt,EOS} N t N_{t} Nt表示输出句子的词汇数量,即句子的长度,则MMI目标损失函数可以表示为:
log ⁡ p ( S , T ) p ( S ) p ( T ) \log \frac{p(S, T)}{p(S) p(T)} logp(S)p(T)p(S,T)这样一来,损失函数不仅仅考虑了输入句子,还考虑输出句子的出现频率,因此,不会偏袒于那些高频率的回复。该损失函数可以进一步表达为:
T ^ = arg ⁡ max ⁡ T { log ⁡ p ( T ∣ S ) − log ⁡ p ( T ) } \hat{T}=\underset{T}{\arg \max }\{\log p(T | S)-\log p(T)\} T^=Targmax{ logp(TS)logp(T)}可以发现,其实MMI损失函数可以看成是在极大似然估计的基础上,添加了一项对输出句子概率的惩罚项,用更通用的形式可以表达为:
T ^ = arg ⁡ max ⁡ T { log ⁡ p ( T ∣ S ) − λ log ⁡ p ( T ) } \hat{T}=\underset{T}{\arg \max }\{\log p(T | S)-\lambda \log p(T)\} T^=Targmax{ logp(TS)λlogp(T)}其中, λ \lambda λ为惩罚参数,表示高频率回复的惩罚。作者将这种目标函数记为MMI-antiLM。根据贝叶斯公式,有:
log ⁡ p ( T ) = log ⁡ p ( T ∣ S ) + log ⁡ p ( S ) − log ⁡ p ( S ∣ T ) \log p(T)=\log p(T | S)+\log p(S)-\log p(S | T) logp(T)=logp(TS)+logp(S)logp(ST)将该式代入目标函数有:
T ^ = arg ⁡ max ⁡ T { ( 1 − λ ) log ⁡ p ( T ∣ S ) + λ log ⁡ p ( S ∣ T ) − λ log ⁡ p ( S ) } = arg ⁡ max ⁡ T { ( 1 − λ ) log ⁡ p ( T ∣ S ) + λ log ⁡ p ( S ∣ T ) } \begin{aligned} \hat{T} &=\arg \max _{T}\{(1-\lambda) \log p(T | S) +\lambda \log p(S | T)-\lambda \log p(S) \} \\ &=\arg \max _{T}\{(1-\lambda) \log p(T | S)+\lambda \log p(S | T)\} \end{aligned} T^=argTmax{ (1λ)logp(TS)+λlogp(ST)λlogp(S)}=argTmax{ (1λ)logp(TS)+λlogp(ST)}作者将这种目标函数记为MMI-bidi

2.2 如何使用

    在真实的训练过程中,如果直接将MMI-antiLM和MMI-bidi两种损失函数作为训练时的损失函数,那么训练将会非常艰难,会导致语法紊乱和解码难的问题,因此,作者在真实训练过程中,还是采用极大似然估计作为模型训练的损失函数,但是在预测时才采用MMI损失函数。

    对于MMI-antiLM损失函数,我们知道,当 λ \lambda λ比较大时,此时损失函数会减弱第一项的权重,导致生成的句子会出现一些语法上的错误,特别是当句子比较长时,当 λ \lambda λ设置比较小时,作者发现该问题还是会出现。我们知道,对于decoder,每一个词的输出都依赖于前面词汇的输出和encoder得到的语义向量,但是,随着句子长度的增长,encoder的语义向量对后面词语的影响会慢慢减弱,因此,输出句子的通顺程度到了后面主要还是依赖于语言模型而不是输入句子,那么,对于后面词语的生成,其实可以不采用多样性惩罚,因此,对于MMI-antiLM损失函数中的 p ( T ) p(T) p(T)项,作者在实际使用时进行了如下改进:
U ( T ) = ∏ k = 1 N t p ( t k ∣ t 1 , t 2 , … , t k − 1 ) ⋅ g ( k ) U(T)=\prod_{k=1}^{N_{t}} p\left(t_{k} | t_{1}, t_{2}, \ldots, t_{k-1}\right) \cdot g(k) U(T)=k=1Ntp(tkt1,t2,,tk1)g(k)其中, g ( k ) g(k) g(k)表示对输出句子每一个词语的权重,其计算公式如下:
g ( k ) = { 1  if  k ≤ γ 0  if  k > γ g(k)=\left\{\begin{array}{ll}{1} & {\text { if } k \leq \gamma} \\ {0} & {\text { if } k>\gamma}\end{array}\right. g(k)={ 10 if kγ if k>γ其中, γ \gamma γ为一个阈值参数,表示当长度大于该值后,则将对应的 p ( T ) p(T) p(T)项置为0,也就是说对生成句子后面的词语不施加多样性惩罚,多样性只取决于前面几个词汇。这样一来,MMI-antiLM的损失函数可以改写为:
log ⁡ p ( T ∣ S ) − λ log ⁡ U ( T ) \log p(T | S)-\lambda \log U(T) logp(TS)λlogU(T)
    另外,作者在真实应用时,还加入句子长度作为另一项正则项,即:
S c o r e ( T ) = p ( T ∣ S ) − λ U ( T ) + γ N t Score(T)=p(T | S)-\lambda U(T)+\gamma N_{t} Score(T)=p(TS)λU(T)+γNt其中, γ \gamma γ表示惩罚参数。

    对于MMI-bidi损失函数,我们知道其实就是 log ⁡ p ( T ∣ S ) \log p(T | S) logp(TS) log ⁡ p ( S ∣ T ) \log p(S |T) logp

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值