源码:https://github.com/yistLin/pytorch-dual-learning
本文作者提出了对偶学习可以更高效的利用单语数据。利用这种对偶学习,单语数据可以扮演和平行语料一样的角色,同时减少训练阶段对平行语料的依赖。具体来说,翻译模型的对偶学习可以描述成以下两个agent的游戏。
- 第一个agent只会A语言,他把一个用A语言写的信息通过有噪声的通道传给第二个agent,这个通道用翻译模型把A语言转换成B语言。
- 第二个agent只会B语言,他收到了翻译成B语言的信息。接着他检查信息然后告知第一个agent这是否是B语言。最后他将收到的信息通过另一个带噪声的通道传回第二个agent,通道用翻译模型将B语言翻译成A语言。
- 在收到第二个agent的信息后,他首先检查信息然后告知第二个agent收到的信息是否和他原本的信息一致。通过这种反馈,两个agents都可以了解两个交流通道(和两个翻译模型)的表现情况,因此可以进一步提升它们。
- 这个游戏当然也可以从第二个agent开始,跟如上的过程对称。
-
NMT的对偶学习
对于单语语料 D A D_A DA 包含 N A N_A NA个句子,单语语料 D B D_B DB 包含 N B N_B NB个句子,这两个语料可以没有任何关系。 P ( . ∣ s ; Θ A B ) P(.|s;\Theta_{AB}) P(.∣s;ΘAB) 和 P ( . ∣ s ; Θ B A ) P(.|s;\Theta_{BA}) P(.∣s;ΘBA) 是两个弱神经翻译模型。
假设我们已经有两个训练好的语言模型 L M A ( . ) LM_A(.) LMA(.) 和 L M B ( . ) LM_B(.) LMB(.) (由于有单于语料,所以很容易得到,也可以用 D A D_A DA, D B D_B DB 训练),每个语言模型将句子作为输入,输出一个实数代表句子属于当前语言的自信程度。
开始时,将 D A D_A DA中的句子 s s s 送入翻译模型中,得到 s m i d s_{mid} smid 作为中间翻译的输出。这个中间过程有一个及时的奖励(reward) r 1 = L M B ( s m i d ) r_1=LM_B(s_{mid}) r1=LMB(smid) ,代表句子为语言B的自信程度。得到了 s m i d s_{mid} smid 以后,我们用 s s s可以从 s m i d s_{mid} smid 中recoverd的log probability作为communication奖励(we will use reconstruction and communication
interchangeably)。数学表示为 r 2 = l o g ( P ( s ∣ s m i d ; Θ B A ) r_2=log(P(s|s_{mid};\Theta_{BA}) r2=log(P(s∣smid;ΘBA) 。
简单的将LM reward和communication reward做一个线性组合的到最终奖励,e.g. r = α r 1 + ( 1 − α ) r 2 r=\alpha r_1+(1-\alpha)r_2 r=αr1+(1−α)r2。然后用policy gradient methods 最大化奖励(强化学习中经常会用到)
用下面两个公式计算 Θ A B \Theta_{AB} ΘAB、 Θ B A \Theta_{BA} ΘBA的梯度
算法流程 - 实验结果(略)
- 讨论
-
对偶训练不一定只用于nmt,有对偶性的任务都可以对偶训练。
比如speech recognition versus text to speech
image caption versus image generation,
question answering versus question generation
search (matching queries to documents) versus keyword extraction (extracting
keywords/queries for documents)
-
对偶训练不只限制两个任务。核心方法就是形成一个闭合的回路,通过比较最终的输出和输入的区别,捕捉反馈信号。
比如对英语句子,首先将它翻译成中文,然后再翻译成法语,最后翻译回英文。两个英文之间的相似性表示了三个翻译模型的有效性。这个叫close-loop learning
-