Tensorflow `tf.train.Optimizer`はどのように勾配を計算しますか?


10

Tensorflow mnistチュートリアル(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py)に従っています

チュートリアルではtf.train.Optimizer.minimize(具体的にはtf.train.GradientDescentOptimizer)を使用しています。グラデーションを定義するために引数がどこにも渡されていないようです。

Tensorフローはデフォルトで数値微分を使用していますか?

あなたができるようにグラデーションを渡す方法はありますscipy.optimize.minimizeか?

回答:


16

これは数値微分ではなく、自動微分です。これはテンソルフローが存在する主な理由の1つです。テンソルフローグラフで操作を指定することにより(Tensors に対する操作などで)、グラフを通じてチェーンルールを自動的にたどることができます。指定すると、自動的に組み合わせることができます。

何らかの理由でそれを区分的に上書きしたい場合は、で可能gradient_override_mapです。


数値微分を使った自動微分ではないですか?
Aerin 2017年

@BYORいいえ。上記のウィキペディアのリンクをチェックしてください。ただし、テンソルフローが実際に行うのは、「実際の」リバースモード自動差分とシンボリック微分の間のどこかです。
Dougal 2017年

@Dougal imはグラフなし、tf.functionデコレーターなしの熱心なモードを使用しています。自動微分はテンソル間の関係をどのようにして知るのですか?
datdinhquoc

1
@datdinhquocこれは基本的なアルゴリズムと同じですが、実装が少し複雑です。
Dougal

9

自動微分を使用します。チェーンルールを使用して、グラデーションを割り当てるグラフのバックワードに移動します。

テンソルCがあるとしましょう。このテンソルCは一連の演算の後で作成されたものとします。加算、乗算、非線形性などを経て

したがって、このCがXkと呼ばれるテンソルのセットに依存している場合、勾配を取得する必要があります

Tensorflowは常に操作のパスを追跡します。つまり、ノードの順次動作と、ノード間でのデータの流れを意味します。それはグラフによって行われます ここに画像の説明を入力してください

X入力に対するコストの導関数を取得する必要がある場合、これが最初に行うことは、グラフを拡張してx入力からコストへのパスをロードすることです。

次に、川の順序で始まります。次に、チェーンルールでグラデーションを分散します。(逆伝播と同じ)

いずれにしても、ソースコードをtf.gradients()に属している場合は、テンソルフローがこの勾配分布部分を適切に実行していることがわかります。

バックトラッキングtfがgraphと相互作用する間、バックワードパスでTFは異なるノードに出会いますこれらのノードの内部には、(ops)matmal、softmax、relu、batch_normalizationなどと呼ばれる操作がありますグラフ

この新しいノードは、操作の偏微分を構成します。get_gradient()

これらの新しく追加されたノードについて少し話しましょう

これらのノードの内部で、2つのものを追加します。1.導関数で計算した)2。

チェーンルールによって計算できます

これはバックワードAPIと同じです

したがって、テンソルフローは常に自動微分を行うためにグラフの順序を考慮します

したがって、勾配を計算するためにフォワードパス変数が必要であることがわかっているので、中間値もテンソルに格納する必要があります。これにより、メモリを削減できます。多くの演算では、勾配を計算して分散する方法を知っています。


1
グラフなし、tf.functionデコレーターなしの熱心なモードを使用しているim、自動微分はテンソル間の関係をどのようにして知るのですか?
datdinhquoc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.