我对tensorflow r1.0中的注意解码器实现感到困惑。原始代码可在此处找到:https://github.com/tensorflow/tensorflow/blob/r1.0/tensorflow/contrib/seq2seq/python/ops/attention_decoder_fn.py。
以下是我感到困惑的代码部分:
def decoder_fn(time, cell_state, cell_input, cell_output, context_state):
if cell_state is None: # first call, return encoder_state
cell_state = encoder_state
# init attention
attention = _init_attention(encoder_state)
else:
# construct attention
attention = attention_construct_fn(cell_output, attention_keys,
attention_values)
# in the doc, they said they won't change the cell_output
cell_output = attention
# combine cell_input and attention
next_input = array_ops.concat([cell_input, attention], 1)
return (None, cell_state, next_input, cell_output, context_state)
根据我的理解,解码器接收来自上一时间步的状态并产生隐藏状态和输出。基于先前的RNN隐藏状态和当前输入创建注意力。我们的解码器最终输出是RNN在每个时间步骤产生的所有输出。
然而,似乎在张量流中,解码器将注意力作为输出返回,并且在每个时间步骤中它使用RNN的输出作为输入来计算注意力。
tensorflow中的实现是错误的吗?但实际上,这种实现(在tensorflow中)表现更好。
谢谢!
答案 0 :(得分:0)
这就是基于注意力的模型的工作原理。与仅使用前一个向量(ht)预测输出不同,这里有另一个称为上下文向量(Ct)的向量。因此,在应用softmax之前的最终隐藏向量将是ht和Ct的串联。这里Ct是由编码器中的每个隐藏状态乘以某种注意力组成的。这就像编码器中每个隐藏层矢量对我们将要预测的解码器输出有多大影响。这个标量被称为关注。这种关注是一个可训练的参数。有很多方法可以获得这个值。因此,该值依赖于编码器中的隐藏状态向量和解码器中的当前隐藏向量。 This slides will give you a good understanding
我认为