注意权重是按以下方式计算的:
我想知道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])# 创建一个注意力机制attention_mechanism = tf.contrib.seq2seq.LuongAttention( num_units, attention_states, memory_sequence_length=source_sequence_length)
我是否误解了代码?还是h_s
实际上指的是encoder_outputs
?
回答:
这个公式可能来自这篇文章,所以我将使用同一文章中的一个神经网络图片:
在这里,h-bar(s)
是编码器(最后一层)中所有的蓝色隐藏状态,而h(t)
是解码器(也为最后一层)中当前的红色隐藏状态。在图片中t=0
,你可以看到哪些块通过虚线箭头连接到注意权重。score
函数通常是以下之一:
TensorFlow的注意机制与这张图片相匹配。从理论上讲,单元输出在大多数情况下就是其隐藏状态(一个例外是LSTM单元,其中输出是状态的短期部分,即使在这种情况下,输出更适合注意机制)。在实践中,当输入用零填充时,TensorFlow的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)