对于 RNN,encode 的时候得一个个进行。相比之下 Transformer 可以并行的 encode,用 self-attention,但是,在 decode 的时候还是得和 RNN 一样,一个个进行。

Screen Shot 2022-05-14 at 12.17.54 PM.png

如果尝试让 Transformer 的 decoder 并行输出,那么它需要知道长度,这时候可以考虑用 position embedding。

Screen Shot 2022-05-14 at 12.26.53 PM.png

但这个有个问题(multi-modality problem),就是 decode 输出的时候不会考虑其左右的值的相关性,这会导致输出上的一些错误。

如右图所示,因为一句话会有多个翻译结果,所以当每一个输出都是独立的时候,就有可能得到他们的杂糅版本(无上下文相关性)。

Screen Shot 2022-05-14 at 12.36.47 PM.png

Vanilla NAT

encoder 输出复制的次数。

<aside> ❓ 这有上下文么???

</aside>

Screen Shot 2022-05-14 at 2.05.41 PM.png

训练方式

第一种方式

用 Fertility,就是直接标记。

训练方案

训练方案

第二种方式,用 teacher-student:

Screen Shot 2022-05-14 at 2.15.04 PM.png

Screen Shot 2022-05-14 at 2.15.11 PM.png

这里 student 学习不再是 teacher 输出的概率,而是 teacher 输出的结果。如果直接让它学习概率的话,就会丢失某些可能。

第三种方式

合成版。后面加上一层 autoregressive。

Screen Shot 2022-05-14 at 2.20.03 PM.png

试验结果。

Screen Shot 2022-05-14 at 2.22.37 PM.png


还有一些方案:

Screen Shot 2022-05-14 at 2.30.32 PM.png

Iterative Refinement

多翻译几次。

这里的 Decoder 就是上文的 Vanilla NAT 里的那个。

也可以在中间加一些 noise。

效果其实没有好多少。

Screen Shot 2022-05-14 at 2.32.31 PM.png

Mask-Predict

是在 BERT 之后出的,所以 decoder 用的是 BERT。

Screen Shot 2022-05-14 at 2.36.51 PM.png

两次迭代,不断减少 MASK 的数量。