Python-deep-learning-computational-graphs
計算グラフ
バックプロパゲーションは、計算グラフを使用して、Tensorflow、Torch、Theanoなどの深層学習フレームワークに実装されます。 さらに重要なことは、計算グラフの逆伝播を理解するために、いくつかの異なるアルゴリズムと、backprop through timeやbackprop with share weightなどのバリエーションを組み合わせることです。 すべてが計算グラフに変換されても、それらは同じアルゴリズムであり、計算グラフの逆伝播にすぎません。
計算グラフとは
計算グラフは、ノードが数学的操作に対応する有向グラフとして定義されます。 計算グラフは、数式を表現および評価する方法です。
たとえば、ここに簡単な数学の方程式があります-
p = x + y
上記の方程式の計算グラフを次のように描くことができます。
上記の計算グラフには、2つの入力変数xおよびyと1つの出力qを持つ追加ノード(「+」記号のあるノード)があります。
もう少し複雑な例を見てみましょう。 次の方程式があります。
g = \ left(x + y \ right)\ ast z
上記の方程式は、次の計算グラフで表されます。
計算グラフと逆伝播
計算グラフと逆伝播は、どちらもニューラルネットワークをトレーニングするための深層学習における重要なコアコンセプトです。
フォワードパス
フォワードパスは、計算グラフで表される数式の値を評価する手順です。 フォワードパスを行うということは、変数の値を出力のある左(入力)から右へ順方向に渡すことを意味します。
すべての入力に何らかの値を与えることで例を考えてみましょう。 次の値がすべての入力に与えられていると仮定します。
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-学習率*勾配を実行して重みを更新します。
- 停止条件が満たされるまで、このプロセスを繰り返します。