3

注意力权重计算为:

在此处输入图像描述

我想知道h_s指的是什么。

在 tensorflow 代码中,编码器 RNN 返回一个元组:

encoder_outputs, encoder_state = tf.nn.dynamic_rnn(...)

正如我所想,h_s应该是encoder_state,但是github/nmt给出了不同的答案?

# attention_states: [batch_size, max_time, num_units]
attention_states = tf.transpose(encoder_outputs, [1, 0, 2])

# Create an attention mechanism
attention_mechanism = tf.contrib.seq2seq.LuongAttention(
    num_units, attention_states,
    memory_sequence_length=source_sequence_length)

我误解了代码吗?或者h_s实际上意味着encoder_outputs?

4

1 回答 1

2

公式可能来自这篇文章,所以我将使用同一篇文章中的 NN 图片:

nn

这里,是来自编码器(最后一层)h-bar(s)的所有蓝色隐藏状态,是来自解码器(也是最后一层)的当前红色隐藏状态。一张图片,你可以看到哪些块用虚线箭头连接到注意力权重。该功能通常是其中之一:h(t)t=0score

公式


Tensorflow 注意力机制与这张图相匹配。理论上,单元输出在大多数情况下它的隐藏状态(一个例外是 LSTM 单元,其中输出是状态的短期部分,即使在这种情况下,输出也更适合注意力机制)。在实践中,张量流与输入用零填充时encoder_state不同encoder_outputs:状态是从前一个单元状态传播的,而输出为零。显然,您不想关注尾随零,因此h-bar(s)为这些单元格设置是有意义的。

encoder_outputs从蓝色块向上的箭头也是如此。稍后在代码中,attention_mechanism连接到每个decoder_cell,以便其输出通过上下文向量到达图片上的黄色块。

decoder_cell = tf.contrib.seq2seq.AttentionWrapper(
    decoder_cell, attention_mechanism,
    attention_layer_size=num_units)
于 2018-01-23T08:17:24.907 回答