2017-04-06 17 views
0

テンソルフロー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の出力を使用します。

テンソルの実装が間違っていますか?しかし、実際には、この実装(テンソルフロー)が優れています。

ありがとうございます!

答えて

0

これは、アテンションベースのモデルの仕組みです。以前のベクトル(ht)での出力のみを予測するのとは異なり、コンテキストベクトル(Ct)と呼ばれる別のベクトルがあります。 softmaxを適用する前の最終隠れベクトルは、htとCtの連結になります。ここで、Ctは、ある種の注意を掛けたエンコーダの各隠れた状態を乗算して作られる。これは、エンコーダの各隠れ層ベクトルが、我々が予測しようとしているデコーダの出力にどのくらいの影響を与えるかのようなものです。このスカラーは注目されています。この注意は訓練可能なパラメータです。この値を得るには多くの方法があります。したがって、この値は、エンコーダの隠れ状態ベクトルとデコーダの現在の隠れベクトルに依存します。私は

enter image description here

考える This slides will give you a good understanding

関連する問題