/ / Tensorflowの“ tf.gather”と“ tf.gradients”を一緒に使用する - テンソルフロー、スパース行列

Tensorflowの "tf.gather"と "tf.gradients"を一緒に使う - テンソルフロー、スパース行列

テンソル "Y"の勾配を計算したいTensorflowのパラメータ行列 "X"に関して。具体的には、 "X"の "インデックス"の特定のセットに対してのみ勾配を計算します。次のコードは、最初に勾配全体を計算してから、目的のインデックスに対応する勾配を返します。

Y=some_function_of_X
grad=tf.gradients(Y,X)
grads_i_want_to_compute=tf.gather(grad,indices)

Tensorflow "s" tf.scatter_sub "を使用して、勾配降下法に基づいてパラメータ行列" X "の目的のインデックスを更新できます。

tf.scatter_sub(X,indices,learning_rate*grads_i_want_to_compute)

これは正しく機能しますが、一日の終わりにすべての勾配が計算されます。処理速度のために、私はすべての勾配を計算したくありません。だから私はこれを試してみました:

Y=some_function_of_X
sparse_X=tf.gather(X,indices)
grads_i_want_to_compute = tf.gradient(Y,sparse_X)
tf.scatter_sub(X,indices,learning_rate*grads_i_want_to_compute)

後者では、 "tf.gradient"は "None"オブジェクトを返すので先に進むことはできません。誰もがこの問題を解決する方法を知っていますか?

回答:

回答№1は1

これを機能させるには、YがXの関数ではなくsparse_Xの関数である必要があります。


回答№2の場合は0

Xを小さなテンソルの集合に分割してから計算することができます

Y = f(tf.concat(list_of_X_i、...))

その後、勾配w.r.tを計算します。あなたが気にかけているX_iのそれぞれ。あなたがやろうとしていることのためにそれは実用的でも効率的でもないかもしれません。

考慮すべきもう一つのことはに依存しているということですネットワークの深さと構造、Xの単一要素に対する勾配は、上の層からの勾配の多く(あるいはすべて)に依存します。そのため、ブルートフォースアプローチと比較して大量の計算量を節約することはできません。