Skip to content

DNET_DeepLearningBackpropagation

nishi_74322014 edited this page Sep 11, 2026 · 1 revision

深層学習の誤差逆伝播法

概要

  • 多層ニューラルネットワークを効率よく学習させるアルゴリズム
  • 層がより深くなっても、学習できる仕組みとして注目される。

誤差関数(損失関数)の最小化問題

誤差関数(損失関数)については
ニューラルネットワーク(学習)の該当節を参照。

  • 各層の重みを更新して誤差をゼロにしていく。

    • 最小=微分した値がゼロになる点。
    • 重みのパラメタは複数あるので偏微分を行う。
  • 誤差の種類
    過学習(機械学習(machine learning)の該当節を参照)に
    ならないようにバランスをとる。

    • 訓練誤差:学習時の誤差
    • 汎化誤差:推論時の誤差
  • 損失関数のグラフの全容は実際には観測できない。

パラメタ値の自動計算

見せかけの最適化を防ぐ

ニューラルネットワーク(学習)の該当節を参照。

数式 or 計算グラフ

数式

コチラが一般的であるが、

計算グラフ(理解の方法)

ココでは、計算グラフを使用して視覚的に理解した上で実装する。

計算グラフ

  • 計算過程をデータ構造としてのグラフによって表す。

  • データ構造としてのグラフは、複数の

    • ノードと
    • エッジ(ノードを結ぶ直線)

によって表現される。

  • 利点

    • 中間の計算結果は保持される。

    • 局所的な計算で単純な計算に集中できる(単純化)。

    • 最大の利点は逆伝播できる点。

      • 右(始点)から左(終点)に流れる。
      • 保持された計算結果と逆伝播で、微分を効率よく計算できる。

計算グラフの例

リンゴの例

  • 100円のリンゴを2個買う(消費税10%が適用される)。
          100       200         220
(リンゴ)--->(*2)--->(*1.1)--->(支払い)
  • 数値を外出にする(ノードは演算子だけ)。
          100      200      220
(リンゴ)--->(*)--->(*)--->(支払い)
               ↑2      ↑1.1
  (リンゴの個数)(消費税)

リンゴとミカンの例

以下を購入(消費税10%が適用される)。

  • 100円のリンゴを2個
  • 150円のミカンを3個

1

局所的

  • 局所的な計算を伝播することによって、最終的な結果を得ることが出来る。
  • 局所的な計算に集中できる。これによって問題に集中できる。

2

演算ノード毎の逆伝播

加算ノード

  • z = x + y
    
  • xで微分

    dz
    ─ = 1
    dx
    
  • yで微分

    dz
    ─ = 1
    dy
    
  • 計算グラフ

x ──┐dL dL dz
      │─ ─ ─
      │dL dz dx
      ↓         z                         L
      (+) <-------------(何らかの計算)<------
      ↑             dL                    dL
      │dL dL dz     ─                    ─
      │─ ─ ─     dz                    dL
y ──┘dL dz dy
  • なにもせず、次のノードに流す。
dL   dL dL dz     dL     dL
─ = ─ ─ ─ = 1 ─ 1 = ─
dx   dL dz dx     dz     dz

dL   dL dL dz     dL     dL
─ = ─ ─ ─ = 1 ─ 1 = ─
dy   dL dz dy     dz     dz

乗算ノード

  • z = x * y
    
  • xで微分

    dz
    ─ = y
    dx
    
  • yで微分

    dz
    ─ = x
    dy
    
  • 計算グラフ

x ──┐dL dL dz
      │─ ─ ─
      │dL dz dx
      ↓         z                         L
      (*) <-------------(何らかの計算)<------
      ↑             dL                    dL
      │dL dL dz     ─                    ─
      │─ ─ ─     dz                    dL
y ──┘dL dz dy
  • もう一方の入力を乗算して次のノードに流す。
dL   dL dL dz     dL     dL
─ = ─ ─ ─ = 1 ─ y = ─ y
dx   dL dz dx     dz     dz

dL   dL dL dz     dL     dL
─ = ─ ─ ─ = 1 ─ x = ─ x
dy   dL dz dy     dz     dz

計算グラフの順伝播・逆伝播

  • 例えば、リンゴの値上がりが支払金額に、どう影響するか?を計算する。
    これは、=リンゴの値段に関する支払金額の微分を求めることに相当する(乗算ノード)。

  • 逆方向の伝播では、連鎖律によって
    「局所的な微分」を「順方向の逆方向に伝播」する。

リンゴの例の順伝播

y = 2.2x

  • x = リンゴの値段
  • y = 支払金額
          100(1x)  200(2x)   220(2.2x)
(リンゴ)--->(*)---->(*)---->(支払い)
               ↑2       ↑1.1
  (リンゴの個数) (消費税)

リンゴの例の逆伝播

  • dL/dx = 2.2
          100(1x)  200(2x)   220(2.2x)
(リンゴ)--->(*)---->(*)---->(支払い)
          <--- ↑  <---- ↑  <----
           2.2 │   1.1  │    1.0
               │2       │1.1
  (リンゴの個数) (消費税)

※ 2.2は(x =)リンゴの値段が1上がると最終値が幾ら上がるか?を表している。

計算グラフの逆伝播

順方向と逆向きに局所的な微分を乗算。

 x         y
---->(f)---->
<----     <----
   dy
 E ─      E
   dx

合成関数、計算グラフ、連鎖律

合成関数を計算グラフで表現

  • z=(x+y)^2
  • z=t^2
  • t=x+y

この計算グラフは連鎖律で微分可

計算グラフ(合成関数)

(合成関数だからね)

    x           t          z
--------->(+)---->(^2)---->
<--------- ↑  <----      <----
dz dz dt   │ dz dz         dz
-- -- --   │ -- --         -- = 1
dz dt dx   │ dz dt         dz
           │
            y

偏微分(合成関数)

偏微分についてはDS:数学的基礎 - 微分・偏微分の該当節を参照。

dz      dz       dt
─ = 1, ─ = 2t, ─ = 1
dz      dt       dx

連鎖律(合成関数)

連鎖律についてはDS:数学的基礎 - 微分・偏微分の該当節を参照。

    x           t          z
--------->(+)---->(^2)---->
<--------- ↑  <----      <----
           │
1*2t*1     │  1*2t
 = 2(x+y)  │   = 2(x+y)
           │
            y

逆伝播による勾配の自動計算

計算グラフの逆伝播で得られる値は、

  • 連鎖律で微分を乗算していって得られた値で、
  • それぞれの値が1増えた時、その他の値に変更がない場合、
    最終結果に影響を与える大きさ ≒ 勾配になる。

リンゴの例(勾配の自動計算)

          100(1x)   200(2x)     220(2.2x)
(リンゴ)---->(*)------>(*)---->(支払い)
          <----↑│ <------ ↑│<----
           2.2 ││   1.1   ││ 1.0
               ││         ││
              2│↓110   1.1│↓200
         (リンゴの個数)(消費税)

リンゴとミカンの例(勾配の自動計算)

3

ニューラルネットへの応用

以下の逆伝播が計算できれば、勾配が計算できるということになる。

中間層のアフィン変換

入力&重みのドット積

順伝播で計算したドット積の行列を転置させる。

  • np.dot(x, w)

    • 入力の場合は、dout 重みの行列を転置

      np.dot(dout, w.T)
    • 重みの場合は、入力の行列を転置 dout

      np.dot(x.T, dout)

バイアスの加算

全パスの偏微分値を合計したものを加算

中間層の活性化関数

Sigmoid関数(中間層)

tanh関数

ReLU関数

出力層の活性化関数

恒等関数

Sigmoid関数(出力層)

Softmax関数

Python実装

E資格:試験対策の該当節を参照。

レイヤの実装

Wiki版はココで力尽きたので、あとは以下をご参照。

移行メモ

  • 「計算グラフ」の利点にあった「最大の利点は順伝播できる点。/ 右(始点)から左(終点)に流れる。」は、右から左へ流れるのは逆伝播であり、 節全体(誤差逆伝播法)の文脈とも合わないため「逆伝播できる点」に正した。

  • 「乗算ノード」の逆伝播の式は、元の PukiWiki では dL/dx に x を、dL/dy に y を掛ける形になっていたが、 直前で自ら示している dz/dx = y、dz/dy = x と矛盾するため、 dL/dx に y を、dL/dy に x を掛ける形に正した (見出しの「倍率を乗算して」も「もう一方の入力を乗算して」と補った)。 加算ノード・乗算ノードの計算グラフ中、y 側の分母が dx となっていた箇所も dy に正した。

  • 「パイパー・パラメタ」は「ハイパー・パラメタ」に正した。

  • 「数式 or 計算グラフ」の一文は、元の PukiWiki では 「…計算に時間がかかるので、ニューラルネットワークを学習させる際に用い効率よく計算を行う。」 と主語が欠けていたため、「誤差逆伝播法を用い」を補った。

  • 「逆伝播による勾配の自動計算」の連鎖律のリンクは、元の PukiWiki では 本ページ内アンカ(#w092a77a)を指していたが、 実体は「DS:数学的基礎 - 微分・偏微分」側の節であるため、そちらを参照先とした。


Tags: 移行, 人工知能, 深層学習, ニューラルネットワーク, 誤差逆伝播法, 計算グラフ, 連鎖律

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally