私のモデルではdynamic_rnn
の2つのスタッキングが使用されています。つまり、第2のdynamic_rnn
のinitial_state
は、final_state
の最初のdynamic_rnn
です。私の損失関数は、output
の2番目のdynamic_rnn
に基づいて計算されます。私の質問は、グラデーションが最初にdynamic_rnn
に伝播するのでしょうか?グラデーションバックは複数のdynamic_rnnに伝播されますか?
なぜ私は冗長に2つのdynamic_rnn
を使用するのかと聞かれるかもしれません。答えは私の問題では、最後のステップを除いて、ほとんどの入力シーケンスは全く同じです。だから、時間を節約するためにこれらすべての入力シーケンスの一般的な部分に対してdynamic_rnn
を1回実行し、別々の最後の入力要素を受け入れる別のdynamic_rnn
にfinal_state
を送ります。
長さ10のシーケンスが3つあるとします。これらのシーケンスはすべて、最後のステップ(10番目の要素)を除いて同じです。簡略化されたコード:
cell = BasicRNNCell()
# the first dynamic_rnn which handles the common part
first_outputs, first_states = tf.nn.dynamic_rnn(
cell=cell,
dtype=tf.float32,
sequence_length=[9], # only one sample with length 9
inputs=identical_input # input with shape (1, 9, input_element_dim)
)
# tile the first_states to accommodate next dynamic_rnn
# first_states is transformed from shape (1, hidden_state_dim) to (3, hidden_state_dim)
first_states = tf.reshape(tf.tile(first_states, [1, 3]), [3, hidden_state_dim])
# the second dynamic_rnn which handles the distinct last element
second_outputs, second_states = tf.nn.dynamic_rnn(
initial_state=first_states,
cell=cell,
dtype=tf.float32,
sequence_length=[1, 1, 1], # 3 samples with only one element
inputs=distinct_input # input with shape (3, 1, input_element_dim)
)
# calculate loss based on second_outputs
loss = some_loss_function(second_outputs, groud_truth)