自動微分を使用します。チェーンルールを使用して、グラデーションを割り当てるグラフのバックワードに移動します。
テンソルCがあるとしましょう。このテンソルCは一連の演算の後で作成されたものとします。加算、乗算、非線形性などを経て
したがって、このCがXkと呼ばれるテンソルのセットに依存している場合、勾配を取得する必要があります
Tensorflowは常に操作のパスを追跡します。つまり、ノードの順次動作と、ノード間でのデータの流れを意味します。それはグラフによって行われます
X入力に対するコストの導関数を取得する必要がある場合、これが最初に行うことは、グラフを拡張してx入力からコストへのパスをロードすることです。
次に、川の順序で始まります。次に、チェーンルールでグラデーションを分散します。(逆伝播と同じ)
いずれにしても、ソースコードをtf.gradients()に属している場合は、テンソルフローがこの勾配分布部分を適切に実行していることがわかります。
バックトラッキングtfがgraphと相互作用する間、バックワードパスでTFは異なるノードに出会いますこれらのノードの内部には、(ops)matmal、softmax、relu、batch_normalizationなどと呼ばれる操作がありますグラフ
この新しいノードは、操作の偏微分を構成します。get_gradient()
これらの新しく追加されたノードについて少し話しましょう
これらのノードの内部で、2つのものを追加します。1.導関数で計算した)2。
チェーンルールによって計算できます
これはバックワードAPIと同じです
したがって、テンソルフローは常に自動微分を行うためにグラフの順序を考慮します
したがって、勾配を計算するためにフォワードパス変数が必要であることがわかっているので、中間値もテンソルに格納する必要があります。これにより、メモリを削減できます。多くの演算では、勾配を計算して分散する方法を知っています。