「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
コチラが一般的であるが、
ココでは、コチラを使用して視覚的に理解した上で実装する。
合成関数の微分についての性質。
合成関数(関数Aと関数B)
2 z = t t = x + y
dz ─ = 2t dt
dt ─ = 1 dx
dz dz dt ─ = ─ ─ = 2t * 1 = 2t = 2(x + y) dx dt dx
によって表現される。
100 200 220 (リンゴ)--->(*2)--->(*1.1)--->(支払い)
100 200 220
(リンゴ)--->(*)--->(*)--->(支払い)
↑2 ↑1.1
(リンゴの個数)(消費税)
以下を購入(消費税10%が適用される。
z = x + y
dz ─ = 1 dx
dz ─ = 1 dy
x ──┐dL dL dz
│─ ─ ─
│dL dz dx
↓ z L
(+) <-------------(何らかの計算)<------
↑ dL dL
│dL dL dz ─ ─
│─ ─ ─ dz dL
y ──┘dL dz dxdL 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
dz ─ = y dx
dz ─ = x dy
x ──┐dL dL dz
│─ ─ ─
│dL dz dx
↓ z L
(*) <-------------(何らかの計算)<------
↑ dL dL
│dL dL dz ─ ─
│─ ─ ─ dz dL
y ──┘dL dz dxdL 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
y = 2.2x
100(1x) 200(2x) 220(2.2x)
(リンゴ)--->(*)---->(*)---->(支払い)
↑2 ↑1.1
(リンゴの個数) (消費税)
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
(合成関数だからね)
x t z
--------->(+)---->(^2)---->
<--------- ↑ <---- <----
dz dz dt │ dz dz dz
-- -- -- │ -- -- -- = 1
dz dt dx │ dz dt dz
│
y
dz dz dt ─ = 1, ─ = 2t, ─ = 1 dz dt dx
x t z
--------->(+)---->(^2)---->
<--------- ↑ <---- <----
│
1*2t*1 │ 1*2t
= 2(x+y) │ = 2(x+y)
│
y
計算グラフの逆伝播で得られる値は、
100(1x) 200(2x) 220(2.2x)
(リンゴ)---->(*)------>(*)---->(支払い)
<----↑│ <------ ↑│<----
2.2 ││ 1.1 ││ 1.0
││ ││
2│↓110 1.1│↓200
(リンゴの個数)(消費税)
以下の逆伝播が計算できれば、勾配が計算できるということになる。
Wiki版はココで力尽きたので、あとは以下をご参照。