如何注意屏蔽Tensorflow编码器-解码器RNN中的零填充值? 在正式的张量神经网络翻译实例中,在编码器模型中定义了GRU层。

如何注意屏蔽Tensorflow编码器-解码器RNN中的零填充值? 在正式的张量神经网络翻译实例中,在编码器模型中定义了GRU层。,tensorflow,Tensorflow,但是,GRU将正常处理零填充值,因为没有应用掩蔽。在解码器中,我认为情况更糟,因为对填充值的关注将在上下文向量的最终计算中发挥重要作用。我认为在下面损失函数的定义中,零被屏蔽了,但此时为时已晚,编码器和注意力解码器的输出都将“中断” 在整个过程中我是否遗漏了什么?实现这一点的正常方法不应该是屏蔽填充值吗?您是对的,您可以看到,当您打印编码器返回的张量时,屏幕右侧的数字会有所不同,尽管大部分来自填充: 通常的实现确实包括掩蔽。然后,在计算下一个单元格中的注意权重时,将使用遮罩。最简单的方法是在分

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


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

您是对的,您可以看到,当您打印编码器返回的张量时,屏幕右侧的数字会有所不同,尽管大部分来自填充:


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

您是对的,您可以看到,当您打印编码器返回的张量时,文本右侧的数字不同,尽管大部分来自填充:


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

我同意,在计算注意力权重时,可以简单地乘以一个较大的负数,这样softmax将为零。但在RNN中,这也是计算时间的问题,您不想处理所有的零。在新的Tensorflow中是否有任何RNN的函数或包装器支持PyTorch的pack\u padded\u序列?Tensorflow 1.x以前有
dynamic\u RNN
函数,可以以不同的长度工作,但它不再是API的一部分。在实践中,机器翻译使用带扣的批处理,因此批处理中的所有句子的长度大致相同,因此如果浪费在填充上,内存会更少。这可以通过函数来完成。啊,好的,我还没有看到这个函数,它似乎是一个很好的函数。因此,这一项,与注意力分数的定制掩蔽相结合,应该可以完成这项工作。只需再编写几行代码。尽管如此,我还是希望看到这个任务的执行时间(TF与Pytork)的比较图!我同意,当你计算注意力权重时,你可以简单地乘以一个大的负数,这样softmax将为零。但在RNN中,这也是计算时间的问题,您不想处理所有的零。在新的Tensorflow中是否有任何RNN的函数或包装器支持PyTorch的pack\u padded\u序列?Tensorflow 1.x以前有
dynamic\u RNN
函数,可以以不同的长度工作,但它不再是API的一部分。在实践中,机器翻译使用带扣的批处理,因此批处理中的所有句子的长度大致相同,因此如果浪费在填充上,内存会更少。这可以通过函数来完成。啊,好的,我还没有看到这个函数,它似乎是一个很好的函数。因此,这一项,与注意力分数的定制掩蔽相结合,应该可以完成这项工作。只需再编写几行代码。尽管如此,我还是希望看到这个任务的执行时间(TF与Pytork)的比较图!