-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_DeepLearningBackpropagation
- 戻る(深層学習(deep learning))
- パーセプトロン
-
ニューラルネットワーク
- ニューラルネットワーク(推論)
-
ニューラルネットワーク(学習)
・深層学習の誤差逆伝播法
・深層学習のテクニック
- 多層ニューラルネットワークを効率よく学習させるアルゴリズム
- 層がより深くなっても、学習できる仕組みとして注目される。
誤差関数(損失関数)については
ニューラルネットワーク(学習)の該当節を参照。
-
各層の重みを更新して誤差をゼロにしていく。
-
誤差の種類
過学習(機械学習(machine learning)の該当節を参照)に
ならないようにバランスをとる。- 訓練誤差:学習時の誤差
- 汎化誤差:推論時の誤差
-
損失関数のグラフの全容は実際には観測できない。
-
多変数の合成関数を偏微分する際の
連鎖律(チェインルール)で、
自動的に、各層を遡って勾配を計算し、重みを更新出来る。 -
ポイント
-
イテレーション
最小の値を見つけるまで繰り返した計算の回数 -
学習率
- パラメタ更新を行う際の更新幅
(ハイパー・パラメタ、機械学習(machine learning)の該当節を参照) - 勾配(ニューラルネットワーク(学習)の該当節を参照)に沿って、
一度にどれだけ降りていくか。
- パラメタ更新を行う際の更新幅
-
ニューラルネットワーク(学習)の該当節を参照。
-
勾配降下法(ニューラルネットワーク(学習)の該当節を参照)
(損失関数の勾配を計算するための
数値微分)は、
計算に時間がかかるので、ニューラルネットワークを学習させる際は
誤差逆伝播法を用い効率よく計算を行う。
コチラが一般的であるが、
ココでは、計算グラフを使用して視覚的に理解した上で実装する。
-
計算過程をデータ構造としてのグラフによって表す。
-
データ構造としてのグラフは、複数の
- ノードと
- エッジ(ノードを結ぶ直線)
によって表現される。
-
利点
-
中間の計算結果は保持される。
-
局所的な計算で単純な計算に集中できる(単純化)。
-
最大の利点は逆伝播できる点。
- 右(始点)から左(終点)に流れる。
- 保持された計算結果と逆伝播で、微分を効率よく計算できる。
-
- 100円のリンゴを2個買う(消費税10%が適用される)。
100 200 220
(リンゴ)--->(*2)--->(*1.1)--->(支払い)
- 数値を外出にする(ノードは演算子だけ)。
100 200 220
(リンゴ)--->(*)--->(*)--->(支払い)
↑2 ↑1.1
(リンゴの個数)(消費税)
以下を購入(消費税10%が適用される)。
- 100円のリンゴを2個
- 150円のミカンを3個

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

-
式
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
(リンゴの個数)(消費税)

以下の逆伝播が計算できれば、勾配が計算できるということになる。
順伝播で計算したドット積の行列を転置させる。
-
np.dot(x, w)
-
入力の場合は、dout 重みの行列を転置
np.dot(dout, w.T)
-
重みの場合は、入力の行列を転置 dout
np.dot(x.T, dout)
-
全パスの偏微分値を合計したものを加算
E資格:試験対策の該当節を参照。
Wiki版はココで力尽きたので、あとは以下をご参照。
- https://1drv.ms/p/s!Amfs5caPP9r5jh-m6pIMwKgDln1N?e=dRS7uP
- https://github.com/OpenTouryoProject/DxCommon/blob/master/Notebook/path/KasagoDL3.ipynb
移行メモ
「計算グラフ」の利点にあった「最大の利点は順伝播できる点。/ 右(始点)から左(終点)に流れる。」は、右から左へ流れるのは逆伝播であり、 節全体(誤差逆伝播法)の文脈とも合わないため「逆伝播できる点」に正した。
「乗算ノード」の逆伝播の式は、元の 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: 移行, 人工知能, 深層学習, ニューラルネットワーク, 誤差逆伝播法, 計算グラフ, 連鎖律
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。