我正在用Pytorch编写序列神经网络的序列。在official Pytorch seq2seq tutorial中,有一个注意力解码器的代码,我不能理解/认为可能包含错误。
它通过连接输出和此时的隐藏状态来计算每个时间步的注意力权重,然后乘以一个矩阵,得到一个大小等于输出序列长度的向量。注意,这些注意力权重不依赖于编码器序列(在代码中命名为encoder_outputs ),我认为它应该依赖于编码器序列。
此外,the paper cited in the tutorial还列出了三种不同的得分函数,可用于计算注意力权重(本文的3.1节)。这些函数都不是简单地连接和乘以一个矩阵。
因此,在我看来,本教程中的代码在它应用的函数和传递给该函数的参数中都是错误的。我是不是遗漏了什么?
发布于 2019-12-05 17:33:55
本教程在您提到的Luong论文中有这些注意事项的简化版本。
它只使用一个线性层来结合输入嵌入和解码器RNN隐藏状态。这有时被称为“基于位置的”注意力,因为它不依赖于编码器的输出。然后,它应用softmax并计算注意力权重,该过程照常进行。
这并不总是不好的,因为从编码器输出中,注意力机制可能会关注之前的令牌,然后注意力将不会是单调的,因此您的模型将失败。
为了实现Luong论文中的注意事项,我建议在将线性层应用于解码器隐藏状态和编码器输出之后,使用“concat”注意。然后,矩阵W_a会将这些连接的结果转换为您选择的任意维度,最后,v_a是一个向量,它将转换为所需的上下文向量维度。
发布于 2020-11-25 20:15:26
在该算法中,attn_weights依赖于解码参数。然后我们得到一个线性层的输出(这里是10)。这是注意力向量。然后我们将其与encoder_outputs相乘。因此,在每个时期,我们通过反向传播来更新attn_weights。从口头上讲,在每次迭代中,它都在以相反的方向学习。让我举个例子:
我们的任务是把英语翻译成德语。
我想唱一首歌。-> Ich möchte ein ein singen.
在解码器中,单个动词在末尾。所以我们的解码器attn_weights看到解码器的输出,并学习应用输入编码的哪些部分。当你用encoder_outputs乘以这个值时,你会得到一个矩阵,它在必要的点上有很高的值。因此,实际上通过这种方式,它是在学习当解码器看到德语中的句型时,它必须注意输入的哪些部分。所以我认为学习的方向是正确的。
https://stackoverflow.com/questions/55958876
复制相似问题