「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>深層学習(deep learning)]]
--[[パーセプトロン]]
--[[ニューラルネットワーク]]
---[[ニューラルネットワーク(推論)]]
---[[ニューラルネットワーク(学習)]]~
・深層学習の誤差逆伝播法~
・[[深層学習のテクニック]]

*目次 [#l5f09e41]
#contents

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

**[[誤差関数(損失関数)>ニューラルネットワーク(学習)#l7995afd]]の最小化問題 [#q7efa2ae]
-各層の重みを更新して誤差をゼロにしていく。
--最小=[[微分>DS:数学的基礎 - 微分・偏微分]]した値がゼロになる点。
--重みのパラメタは複数あるので[[偏微分>DS:数学的基礎 - 微分・偏微分]]を行う。

-誤差の種類~
[[過学習>機械学習(machine learning)#l377f5cd]]にならないようにバランスをとる。
--訓練誤差:学習時の誤差
--汎化誤差:推論時の誤差

-損失関数のグラフの全容は実際には観測できない。

***パラメタ値の自動計算 [#udcbc3eb]
-多変数の合成関数を[[偏微分>DS:数学的基礎 - 微分・偏微分]]する際の[[連鎖律(チェインルール)>DS:数学的基礎 - 微分・偏微分#w092a77a]]で、~
自動的に、各層を遡って勾配を計算し、重みを更新出来る。

-ポイント

--イテレーション~
最小の値を見つけるまで繰り返した計算の回数

--学習率
---パラメタ更新を行う際の更新幅([[パイパー・パラメタ>機械学習(machine learning)#v45aae84]])
---[[勾配>ニューラルネットワーク(学習)#e083729e]]に沿って、一度にどれだけ降りていくか。

***[[見せかけの最適化を防ぐ>ニューラルネットワーク(学習)#nec068c7]] [#yd2703cb]

**数式 or [[計算グラフ>#nb05eda0]] [#q3b34a43]
-[[勾配降下法>ニューラルネットワーク(学習)#v7a3cd9d]]([[損失関数>ニューラルネットワーク(学習)#l7995afd]]の[[勾配>ニューラルネットワーク(学習)#e083729e]]を計算するための[[数値微分>DS:数学的基礎 - 微分・偏微分#w4dd09ea]])は、~
計算に時間がかかるので、[[ニューラルネットワーク]]を学習させる際に用い効率よく計算を行う。

-誤差逆伝播法は、[[数式>#wd81e6f3]] or [[計算グラフ>#g635c7bb]]によって理解する。

***数式 [#wd81e6f3]
コチラが一般的であるが、

***[[計算グラフ>#nb05eda0]] [#g635c7bb]
ココでは、コチラを使用して視覚的に理解した上で実装する。

*計算グラフ [#nb05eda0]
-計算過程をデータ構造としてのグラフによって表す。

-データ構造としてのグラフは、複数の
--ノードと
--エッジ(ノードを結ぶ直線)

>によって表現される。

-利点

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

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

--最大の利点は順伝播できる点。
---右(始点)から左(終点)に流れる。
---保持された計算結果と[[逆伝播>#r2e3f747]]で、微分を効率よく計算できる。

**計算グラフの例 [#b090418b]

***リンゴの例 [#s01fab91]
-100円のリンゴを2個買う(消費税10%が適用される)。

           100       200         220
 (リンゴ)--->(*2)--->(*1.1)--->(支払い)

-数値を外出にする(ノードは演算子だけ)。

           100      200      220
 (リンゴ)--->(*)--->(*)--->(支払い)
                ↑2      ↑1.1
   (リンゴの個数)(消費税)

***リンゴとミカンの例 [#p6e466ec]
以下を購入(消費税10%が適用される。
-100円のリンゴを2個
-150円のミカンを3個

#ref(1.png,left,nowrap,1)

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

#ref(2.png,left,nowrap,2)

**演算ノード毎の逆伝播 [#cb2242eb]

***加算ノード [#zafaca23]
-式
 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 dx

-&color(red){なにもせず、次のノードに流す。};
 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

***乗算ノード [#o8cb1675]
-式
 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 dx

-&color(red){倍率を乗算して次のノードに流す。};
 dL   dL dL dz     dL     dL
 ─ = ─ ─ ─ = 1 ─ x = ─ x
 dx   dL dz dx     dz     dz
 
 dL   dL dL dz     dL     dL
 ─ = ─ ─ ─ = 1 ─ y = ─ y
 dy   dL dz dy     dz     dz

**計算グラフの順伝播・逆伝播 [#r2e3f747]
-例えば、リンゴの値上がりが支払金額に、どう影響するか?を計算する。~
これは、=リンゴの値段に関する支払金額の微分を求めることに相当する([[乗算ノード>#o8cb1675]])。

-逆方向の伝播では、[[連鎖律>DS:数学的基礎 - 微分・偏微分#w092a77a]]によって「局所的な微分」を「順方向の逆方向に伝播」する。

***[[リンゴの例>#s01fab91]]の順伝播 [#s52d1a19]
y = 2.2x
-x = リンゴの値段
-y = 支払金額

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

***[[リンゴの例>#s01fab91]]の逆伝播 [#rc32093f]
-dL~
─  = 2.2~
dx

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

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

***計算グラフの逆伝播 [#a248e396]
順方向と逆向きに局所的な微分を乗算。

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

*合成関数、計算グラフ、連鎖律 [#y13d4b28]

**合成関数を計算グラフで表現 [#mc94a092]

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

**この計算グラフは連鎖律で微分可 [#e396491d]

***計算グラフ [#u5b60f81]
(合成関数だからね)

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

***[[偏微分>DS:数学的基礎 - 微分・偏微分#z8297246]] [#ca7bf7cf]
 dz      dz       dt
 ─ = 1, ─ = 2t, ─ = 1
 dz      dt       dx

***[[連鎖律>DS:数学的基礎 - 微分・偏微分#w092a77a]] [#mda52cae]
     x           t          z
 --------->(+)---->(^2)---->
 <--------- ↑  <----      <----
            │
 1*2t*1     │  1*2t
  = 2(x+y)  │   = 2(x+y)
            │
             y

**逆伝播による勾配の自動計算 [#v7a9bf78]
計算グラフの逆伝播で得られる値は、
-[[連鎖律>#w092a77a]]で微分を乗算していって得られた値で、
-それぞれの値が1増えた時、その他の値に変更がない場合、~
最終結果に影響を与える大きさ ≒ 勾配になる。

***リンゴの例 [#td37075f]

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

***リンゴとミカンの例 [#gf20d94c]

#ref(3.png,left,nowrap,3)

*ニューラルネットへの応用 [#i6289c9b]
以下の逆伝播が計算できれば、勾配が計算できるということになる。

**中間層のアフィン変換 [#fb1a105e]

***入力&重みの[[ドット積>NumPy#l3b1be5b]] [#w0621ade]
順伝播で計算した[[ドット積>NumPy#l3b1be5b]]の行列を転置させる。

-np.dot(x, w)

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

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

***バイアスの加算 [#wcb80d88]
全パスの偏微分値を合計したものを加算

**中間層の活性化関数 [#c1955e8e]

***Sigmoid関数 [#v41eda9c]
***tanh関数 [#h4b30d94]
***ReLU関数 [#b2a77d11]

**出力層の活性化関数 [#o890bc64]

***恒等関数 [#z788581b]
***Sigmoid関数 [#sbbe8412]
***Softmax関数 [#td0b23e9]

**[[Python実装>E資格:試験対策#w08a5032]] [#e9e8988d]

*レイヤの実装 [#ec446ec7]
Wiki版はココで力尽きたので、あとは以下をご参照。
-https://1drv.ms/p/s!Amfs5caPP9r5jh-m6pIMwKgDln1N?e=dRS7uP
-https://github.com/OpenTouryoProject/DxCommon/blob/master/Notebook/Jupyter/path/KasagoDL3.ipynb

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS