Python-deep-learning-computational-graphs

提供:Dev Guides
移動先:案内検索

計算グラフ

バックプロパゲーションは、計算グラフを使用して、Tensorflow、Torch、Theanoなどの深層学習フレームワークに実装されます。 さらに重要なことは、計算グラフの逆伝播を理解するために、いくつかの異なるアルゴリズムと、backprop through timeやbackprop with share weightなどのバリエーションを組み合わせることです。 すべてが計算グラフに変換されても、それらは同じアルゴリズムであり、計算グラフの逆伝播にすぎません。

計算グラフとは

計算グラフは、ノードが数学的操作に対応する有向グラフとして定義されます。 計算グラフは、数式を表現および評価する方法です。

たとえば、ここに簡単な数学の方程式があります-

p = x + y

上記の方程式の計算グラフを次のように描くことができます。

計算グラフ方程式1

上記の計算グラフには、2つの入力変数xおよびyと1つの出力qを持つ追加ノード(「+」記号のあるノード)があります。

もう少し複雑な例を見てみましょう。 次の方程式があります。

g = \ left(x + y \ right)\ ast z

上記の方程式は、次の計算グラフで表されます。

計算グラフ式2

計算グラフと逆伝播

計算グラフと逆伝播は、どちらもニューラルネットワークをトレーニングするための深層学習における重要なコアコンセプトです。

フォワードパス

フォワードパスは、計算グラフで表される数式の値を評価する手順です。 フォワードパスを行うということは、変数の値を出力のある左(入力)から右へ順方向に渡すことを意味します。

すべての入力に何らかの値を与えることで例を考えてみましょう。 次の値がすべての入力に与えられていると仮定します。

x = 1、y = 3、z = −3

これらの値を入力に渡すことで、フォワードパスを実行し、各ノードの出力に対して次の値を取得できます。

最初に、x = 1およびy = 3の値を使用して、p = 4を取得します。

フォワードパス

次に、p = 4およびz = -3を使用して、g = -12を取得します。 私たちは左から右へ、前に進みます。

前方通過方程式

バックワードパスの目的

バックワードパスでは、最終出力に対する各入力の勾配を計算します。 これらの勾配は、勾配降下を使用してニューラルネットワークをトレーニングするために不可欠です。

たとえば、次の勾配が必要です。

望ましい勾配

\ frac \ {\ partial x} \ {\ partial f}、\ frac \ {\ partial y} \ {\ partial f}、\ frac \ {\ partial z} \ {\ partial f}

バックワードパス(backpropagation)

最終出力(それ自体)に対する最終出力の導関数を見つけることにより、逆方向パスを開始します。 したがって、ID派生になり、値は1に等しくなります。

\ frac \ {\ partial g} \ {\ partial g} = 1

計算グラフは次のようになります-

バックワードパス

次に、「*」操作を逆方向にパスします。 pとzで勾配を計算します。 g = p * zなので、次のことがわかります-

\ frac \ {\ partial g} \ {\ partial z} = p

\ frac \ {\ partial g} \ {\ partial p} = z

フォワードパスからzとpの値を既に知っています。 したがって、我々は得る-

\ frac \ {\ partial g} \ {\ partial z} = p = 4

and

\ frac \ {\ partial g} \ {\ partial p} = z = -3

私たちはxとyで勾配を計算したい-

\ frac \ {\ partial g} \ {\ partial x}、\ frac \ {\ partial g} \ {\ partial y}

ただし、これを効率的に行う必要があります(xとgはこのグラフでは2ホップしか離れていませんが、それらが互いに本当に離れていると想像してください)。 これらの値を効率的に計算するには、微分の連鎖規則を使用します。 チェーンルールから、私たちは持っています-

\ frac \ {\ partial g} \ {\ partial x} = \ frac \ {\ partial g} \ {\ partial p} \ ast \ frac \ {\ partial p} \ {\ partial x}

\ frac \ {\ partial g} \ {\ partial y} = \ frac \ {\ partial g} \ {\ partial p} \ ast \ frac \ {\ partial p} \ {\ partial y}

しかし、pはxとyに直接依存するため、dg/dp = -3、dp/dx、およびdp/dyは簡単です。 私たちが持っています-

p = x + y \ Rightarrow \ frac \ {\ partial x} \ {\ partial p} = 1、\ frac \ {\ partial y} \ {\ partial p} = 1

したがって、我々は得る-

\ frac \ {\ partial g} \ {\ partial f} = \ frac \ {\ partial g} \ {\ partial p} \ ast \ frac \ {\ partial p} \ {\ partial x} = \ left (-3 \ right).1 = -3

さらに、入力y-

\ frac \ {\ partial g} \ {\ partial y} = \ frac \ {\ partial g} \ {\ partial p} \ ast \ frac \ {\ partial p} \ {\ partial y} = \ left (-3 \ right).1 = -3

これを逆方向に行う主な理由は、xで勾配を計算しなければならなかったときに、すでに計算された値とdq/dx(同じノードの入力に対するノード出力の導関数)のみを使用したためです。 ローカル情報を使用して、グローバル値を計算しました。

ニューラルネットワークをトレーニングする手順

ニューラルネットワークをトレーニングするには、次の手順に従います-

  • データセットのデータポイントxに対して、xを入力としてフォワードパスを実行し、出力としてコストcを計算します。
  • cから開始して逆方向パスを行い、グラフ内のすべてのノードの勾配を計算します。 これには、ニューラルネットワークの重みを表すノードが含まれます。
  • 次に、W = W-学習率*勾配を実行して重みを更新します。
  • 停止条件が満たされるまで、このプロセスを繰り返します。