对于 RNN,encode 的时候得一个个进行。相比之下 Transformer 可以并行的 encode,用 self-attention,但是,在 decode 的时候还是得和 RNN 一样,一个个进行。
如果尝试让 Transformer 的 decoder 并行输出,那么它需要知道长度,这时候可以考虑用 position embedding。
但这个有个问题(multi-modality problem),就是 decode 输出的时候不会考虑其左右的值的相关性,这会导致输出上的一些错误。
如右图所示,因为一句话会有多个翻译结果,所以当每一个输出都是独立的时候,就有可能得到他们的杂糅版本(无上下文相关性)。
Vanilla NAT
encoder 输出复制的次数。
<aside> ❓ 这有上下文么???
</aside>
训练方式
第一种方式
用 Fertility,就是直接标记。
训练方案
第二种方式,用 teacher-student:
这里 student 学习不再是 teacher 输出的概率,而是 teacher 输出的结果。如果直接让它学习概率的话,就会丢失某些可能。
第三种方式
合成版。后面加上一层 autoregressive。
试验结果。
还有一些方案:
Iterative Refinement
多翻译几次。
这里的 Decoder 就是上文的 Vanilla NAT 里的那个。
也可以在中间加一些 noise。
效果其实没有好多少。
Mask-Predict
是在 BERT 之后出的,所以 decoder 用的是 BERT。
两次迭代,不断减少 MASK 的数量。