【Pytorch】学習記録(3) 逆伝播

バックプロパゲーションは、グラフ上で勾配伝播を実行できる、ニューラル ネットワークにおける非常に重要なアルゴリズムです。図 1 に示すように、これは最も単純なニューラル ネットワークであり、ω はモデル内に存在する重みであり、これがトレーニングの目標です。y は最終出力、* は計算が実行される場所です。訓練中に実際に ω の重みが更新され、更新の際に計算され、損失値を最小限に抑えること\omega = \omega-\alpha\frac{\部分損失}{​​\部分 \omega}が目標となります

図 1 最も単純なニューラル ネットワーク

 勾配降下の完全な式には偏微分が含まれており、微分部分は次のように導出されます\frac{\部分損失}{​​\部分 \omega}=2x_n(x_n\omega-y_n)単純なモデルの場合は上記の分析方法を使用して実行できますが、複雑なモデルの場合はそれができなくなります。

図 2 複雑なモデル

図 2 に示すように、各円には独自の ω があり、重みの数は非常に多くなります。2 列目の隠れ層 h1 には 6 つの要素があるため、h1 は 6 次元ベクトルに属し、x は入力としての 5 次元ベクトルになります。h=ωx の形で h を求めたい場合は、行列の乗算を行う必要があります。行列の形状から、ω は合計 30 の異なる重みを持つ 6×5 行列である必要があることがわかります。同様に、第 3 層には元素が 7 つあり、その ω は 6×7=42 個あり、合計で数百個と非常に多くなります。解析式を一つ一つ書くのはほぼ不可能です。

そこで、複雑なネットワークをグラフとして扱い、そのグラフ上で勾配を伝播させ、最終的に連鎖則に従って勾配を計算するアルゴリズムが必要となり、このアルゴリズムをバックプロパゲーションアルゴリズムと呼びます。

たとえば、2 層のニューラル ネットワークがあり\hat{y}=W_2(W_1\cdot X+b_1)+b_2、入力 X にまず +b で W1 が乗算され、内層の出力が得られます。次に、外側の W2 と乗算し、b2 に加算して、最終的な y 出力を取得します。これはグラフを計算するプロセスであり、局所偏導関数を計算する際に、緑色のボックス (計算モジュール) ごとに異なる方法が使用されます。

多層ニューラル ネットワークの場合、これだけでは不適切です。y は拡張および簡略化できるため、ニューラル ネットワークの層が何層であっても、最終的には y=WX の形式に拡張できます。 +b (図 3 を参照)。この問題を解決するために、各層の出力に非線形変換関数を適用します。たとえば、最初の層の 3 つの出力について、それぞれ x1 x2 x3 を代入し1+e^{-x}、この結果が次の層に代入される、というようになります。

図 3 多層ニューラル ネットワークの結合

図 4 z 方向からの後方フィードバック


以下では、Pytorch でデータ フィードフォワード フィードバックを実装する方法を説明します。まず、pytorchにおける基本的なデータ型はTensor型であり、すべてのデータ値はTensorに格納されなければなりません。Tensor はベクトル、行列、スカラーなどを保存できます。テンソルには、data と grad の 2 つの部分が含まれており、それぞれ ω 自体の値と ω への損失関数の導関数を格納するために使用されます。モデルを構築するときは、実際には計算グラフを構築することになります

要約: バックプロパゲーションアルゴリズムのステップ、最初のステップは損失を計算すること、2 番目のステップは逆方向に実行すること、3 番目のステップはそれを実行すること、4 番目のステップは勾配をクリアすることであり、コーティングサイクルは十分です\omega = \omega-\alpha\frac{\部分損失}{​​\部分 \omega}

おすすめ

転載: blog.csdn.net/m0_55080712/article/details/122837290