1

ニューラルネットワークの入力から出力までの勾配を計算したいと思います。私はすべての単一timesampleのための勾配を計算したいと思いますので、私はTensorflow:入力から出力への勾配の計算

tf.gradients(Output, Input) 

:私は次のように使用することができます全体の出力ベクトルへの入力からグラデーションの

Input: (num_timesteps, features) 

Output: (num_timesteps, 1) 

:私は、次のテンソルを持っていますすべてのiため

tf.gradients(Output[i], Input) 

を計算したいと思います。

それを行うための最善の方法は何ですか?

答えて

1

まずアップ、私はあなたがInputに対するOutputの勾配を意味するとします。

さて、これらの呼び出しの両方のthe result:単一の要素を持つリストになります

(任意の有効なi用)

  • dO = tf.gradients(Output, Input)
  • dO_i = tf.gradients(Output[i], Input)

      - とテンソル同一の形状Input、すなわち [num_timesteps, features]マトリックスとする。また、すべての行列を合計すると、 dO_i(すべて有効)は dOという行列になります。

      これを念頭に置いて、質問に戻ってください。多くの場合、Inputの個々の行は独立しており、Output[i]Input[i]からのみ計算され、他の入力は知られていません(典型的なケース:バッチン処理なしのバッチ処理)。それがあなたの場合、dOはあなたにすべての個々のコンポーネントを一度にdO_i与えるつもりです。

      [[ 0. 0. 0.] 
      [ 0. 0. 0.] 
      ... 
      [ 0. 0. 0.] 
      [ xxx xxx xxx]  <- i-th row 
      [ 0. 0. 0.] 
      ... 
      [ 0. 0. 0.]] 
      

      すべての行がi番目の1を除いて、0あることを行っている:各dO_i行列は次のように見に行くされているので

      です。だからちょうど1つの行列dOを計算することで、簡単にdO_iを得ることができます。これは非常に効率的です。

      しかし、それがあなたのケースではなく、すべてOutput[i]はすべての入力に依存している場合、その合計からちょうどdO_i個を抽出する方法はありません。別々に各グラデーションを計算する以外の方法はありません。iを繰り返し、tf.gradientsを実行してください。

  • 関連する問題