首页 > 解决方案 > 如何用注意力屏蔽 Tensorflow Encoder-Decoder RNN 中的零填充值?

问题描述

在官方的 Tensorflow 神经机器翻译示例(https://www.tensorflow.org/alpha/tutorials/text/nmt_with_attention)中,在 Encoder 模型中,定义了一个 GRU 层。

但是,由于没有应用掩码,GRU 将正常处理零填充值。而在解码器中我认为情况更糟,因为填充值上的注意力将在上下文向量的最终计算中发挥重要作用。我认为在下面损失函数的定义中,零被屏蔽了,但此时为时已晚,编码器和注意力解码器的输出都会“损坏”。

我在整个过程中遗漏了什么吗?实现这一点的正常方法不应该是屏蔽填充值吗?

标签: tensorflow

解决方案


你是对的,你可以看到当你打印从编码器返回的张量时,右边的数字不同,尽管大部分来自填充: 在此处输入图像描述

通常的实现确实包括掩蔽。然后,您将使用掩码计算下一个单元格中的注意力权重。最简单的方法是在张量(1 - mask) * 1e9中的注意力 logits 中添加类似的东西score。本教程是一个非常基础的教程。例如,文本预处理非常简单(删除所有非 ASCII 字符),或者标记化与机器翻译中通常的不同。


推荐阅读