テンソルフローr1.0のアテンションデコーダの実装では混乱します。元のコードはhttps://github.com/tensorflow/tensorflow/blob/r1.0/tensorflow/contrib/seq2seq/python/ops/attention_decoder_fn.pyです。私の理解でテンソルフローr1.0におけるアテンションデコーダの実装
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の出力を使用します。
テンソルの実装が間違っていますか?しかし、実際には、この実装(テンソルフロー)が優れています。
ありがとうございます!