์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ (Backpropagation)
์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์
๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ์๋ฐฉํฅ์ผ๋ก ๊ณ์ฐํ์ฌ ์ถ๋ ฅ์ ๊ณ์ฐํ ํ์ ์ค์
์ถ๋ ฅ๊ณผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ถ๋ ฅ ๊ฐ์ ์ค์ฐจ๋ฅผ ๊ณ์ฐํ๋ค.
-
๊ฐ์ค์น ์ด๊ธฐํ
๋ชจ๋ ๊ฐ์ค์น์ ๋ฐ์ด์ด์ค๋ฅผ 0โผ1 ์ฌ์ด์ ๋์(random number)๋ก ์ด๊ธฐํํ๋ค.
-
๋ฐ๋ณต ํ์ต
์ค์ฐจ๊ฐ ์ถฉ๋ถํ ์์์ง ๋๊น์ง, ๋ชจ๋ ๊ฐ์ค์น์ ๋ํด ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
-
์์ค ํจ์์ ๊ทธ๋๋์ธํธ ๊ณ์ฐ
๊ฐ ๊ฐ์ค์น์ ๋ํด ์์ค ํจ์ E์ ๊ธฐ์ธ๊ธฐ(gradient) ๋ฅผ ๊ณ์ฐํ๋ค:
โwโEโ
-
๊ฐ์ค์น ์
๋ฐ์ดํธ
๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ด์ฉํด ๊ฐ์ค์น๋ฅผ ์ค์ฐจ๋ฅผ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ์
๋ฐ์ดํธํ๋ค:
w(t+1)=w(t)โฮทโ
โwโEโ
- ฮท:
ํ์ต๋ฅ (learning rate)
์ญ์ ํ๋ฅผ ํตํด ๊ตฌํ ๊ธฐ์ธ๊ธฐ(gradient)๋ฅผ ์ฌ์ฉํ์ฌ, ์์ค ํจ์ E(w) ๊ฐ ์ต์๊ฐ ๋๋ ์ง์ ๊น์ง ํ์ต์ ์งํํ๋ค.

๋ฏธ๋ถ์ Chain Rule (์ฐ์ ๋ฒ์น)
์ ๊ฒฝ๋ง์ ์ฌ๋ฌ ์ธต์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฏ๋ก, ์ถ๋ ฅ๊น์ง์ ๊ฒฝ๋ก๊ฐ ํจ์์ ํฉ์ฑ์ผ๋ก ๋์ด ์์.
์๋ฅผ ๋ค์ด,
- y=f(u)
- u=g(x)
โxโyโ=โuโyโโ
โxโuโ

๐ก $w_1$์ ๋ณ๊ฒฝํ๋ ค๋ฉด??
- $w_1$์ $h_1$ ๊ณ์ฐ์ ์ํฅ์ ์ฃผ๊ณ
- $h_1$์ ๋ค์ $y$, ๊ทธ๋ฆฌ๊ณ `์ต์ข
์ค์ฐจ` $E$์ ์ํฅ์ ๋ฏธ์นจ
๋จ๊ณ๋ณ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋๋ ์ ๋ฏธ๋ถํด ๋๊ฐ๋๋ก ์ค๊ณ:
โw1โโEโ=โyโEโโ
โh1โโyโโ
โz1โโh1โโโ
โw1โโz1โโ
์ ๋i์ ์ ๋j๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ค์น "์ ๋j๊ฐ ์ถ๋ ฅ์ธต์ธ ๊ฒฝ์ฐ"
๐ ์ถ๋ ฅ์ธต ์ ๋์ ๋ํ ๊ฐ์ค์น ๋ฏธ๋ถ: โwijโโEโ
Chain Rule ์ ์ฉ
โwijโโEโ=โoutjโโEโโ
โnetjโโoutjโโโ
โwijโโnetjโโ
โ โoutjโโEโ
์ค์ฐจ ํจ์๊ฐ ์ถ๋ ฅ๊ฐ์ ์ผ๋ง๋ ๋ฏผ๊ฐํ์ง
โoutjโโEโ=โoutjโโโโ21โ(targetkโโoutkโ)2=outjโโtargetjโ
- ์ ๋์ ์ถ๋ ฅ๊ฐ ๋ณํ์ ๋ฐ๋ฅธ ์ค์ฐจ์ ๋ณํ์จ์ด๋ค.
โก โnetjโโoutjโโ
ํ์ฑํ ํจ์ f์ ๋ฏธ๋ถ
โnetjโโoutjโโ=โnetjโโf(netjโ)โ=fโฒ(netjโ)
- ์
๋ ฅํฉ์ ๋ณํ์ ๋ฐ๋ฅธ ์ ๋ j์ ์ถ๋ ฅ ๋ณํ์จ์ด๋ค.
- ํ์ฑํ ํจ์์ ๋ฏธ๋ถ๊ฐ์ด๋ค.
โข โwijโโnetjโโ
๊ฐ์ค์น wijโ๊ฐ ์
๋ ฅ ํฉ netjโ์ ์ผ๋ง๋ ์ํฅ์ ์ฃผ๋์ง
โwijโโnetjโโ=โwijโโโ(k=0โnโwkjโoutkโ)=outiโ
- ๊ฐ์ค์น์ ๋ณํ์ ๋ฐ๋ฅธ netjโ์ ๋ณํ์จ์ด๋ผ๊ณ ํ ์ ์๋ค.
โ
์ต์ข
๋ฏธ๋ถ ์ ์ ๋ฆฌ
โwijโโEโ=โ รโกรโข=(outjโโtargetjโ)โ
fโฒ(netjโ)โ
outiโ
์ ๋i์ ์ ๋j๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ค์น "์ ๋j๊ฐ ์๋์ธต์ธ ๊ฒฝ์ฐ"
๐ ์๋์ธต ์ ๋์ ๋ํ ๊ฐ์ค์น ๋ฏธ๋ถ: โwijโโEโ
์๋ ์ ๋์ ์ค์ฐจ๋ ์ถ๋ ฅ์ฒ๋ผ ์ง์ ๊ณ์ฐ๋์ง ์๊ธฐ ๋๋ฌธ์,
์ถ๋ ฅ์ธต์ผ๋ก๋ถํฐ ์ญ์ผ๋ก ์ ํ๋ ์ค์ฐจ๋ฅผ ๋ฐํ์ผ๋ก ๊ณ์ฐํด์ผ ํ๋ค.
Chain Rule ์ ์ฉ (์๋์ธต)
โwijโโEโ=โoutjโโEโโ
โnetjโโoutjโโโ
โwijโโnetjโโ
โ โoutjโโEโ: ์๋ ์ ๋ j์ ์ค์ฐจ
์๋์ธต์ ์ง์ ์ ๋ต์ด ์๊ธฐ ๋๋ฌธ์, ์ฐ๊ฒฐ๋ ์ถ๋ ฅ์ธต ์ ๋ k ๋ค๋ก๋ถํฐ ์ค์ฐจ๋ฅผ ์ ๋ฌ๋ฐ์:
โoutjโโEโ=kโLโโ(โoutkโโEโโ
โnetkโโoutkโโโ
โoutjโโnetkโโ)
=kโLโโ(โoutkโโEโโ
โnetkโโoutkโโโ
wjkโ)
=kโLโโฮดkโโ
wjkโ
- L์ ์๋ ์ ๋ j ์ ์ฐ๊ฒฐ๋ ์ถ๋ ฅ ์ ๋๋ค์ ์งํฉ
์ด๋ฏธ ๊ณ์ฐ๋ โoutkโโEโโ
โnetkโโoutkโโ ์ wjโk๋ง ๊ณฑํ๋ฉด ๋จ
๐ ์์์ ๊ณ์ฐ๋ ๊ฑฐ์๋ค๊ฐ ์ด๋ฏธ ์๋ฐ์ดํธ ๋๊ฒ์ ๊ณฑํ๋ฉด ๋จ
โก โoutjโโnetjโโ=fโฒ(netjโ)
- ํ์ฑํ ํจ์์ ๋ฏธ๋ถ๊ฐ
โข โwijโโnetjโโ=outiโ
- ์์ชฝ ์ ๋ i์ ์ถ๋ ฅ๊ฐ
โ
์ต์ข
๋ฏธ๋ถ ์ ์ ๋ฆฌ
โwijโโEโ=(kโLโโฮดkโโ
wjkโ)โ
fโฒ(netjโ)โ
outiโ
์ฌ๊ธฐ์
ฮดjโ=(kโLโโฮดkโโ
wjkโ)โ
fโฒ(netjโ)
์ผ๋ก ์ ์๋จ โ ์ด๊ฒ ์๋์ธต ์ค์ฐจ์ ํต์ฌ ๊ณต์
๐ ์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ "delta"
ฮดkโ ๋?
- ์ ๋ k์์์ ์ค์ฐจ๋ฅผ ์๋ฏธ
์ถ๋ ฅ์ธต์ด๋ ์๋์ธต์ ์ ๋์์ ์ค์ฐจ์ ๋ณํ๋ฅผ ์ ๋ฌํ๋ ๊ฐ
๐ ์ถ๋ ฅ์ธต ์ ๋ j
ฮดjโ=(outjโโtargetjโ)โ
fโฒ(netjโ)
๐ ์๋์ธต ์ ๋ j
ฮดjโ=(kโโwjkโโ
ฮดkโ)โ
fโฒ(netjโ)
์ฆ, ์ ๊ฒฝ๋ง ๋ ์ด์ด์ ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ๋ถํ์ฌ์ ๊ณ์ฐํ๋ค.
โwijโโEโ=ฮดjโโ
outiโwhereฮดjโ={(outjโโtargetjโ)โ
fโฒ(netjโ)(โkโwjkโฮดkโ)โ
fโฒ(netjโ)โifย jย ๊ฐย ์ถ๋ ฅ์ธตย ์ ๋ifย jย ๊ฐย ์๋์ธตย ์ ๋โ
๊ทธ๋ผ๋์ธํธ(๊ธฐ์ธ๊ธฐ)๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ํ์ํ ๊ฐ!
๊ฐ์ค์น ์
๋ฐ์ดํธ
- ๊ฐ์ค์น ๋ฏธ๋ถ:
์ถ๋ ฅ์ธต์ผ ๋๋ ฮดjโ๊ฐ์ ์
๋ ฅ๊ฐ outiโ๋ฅผ ๊ณฑํด์ ๊ณ์ฐ:โwijโโEโ=ฮดjโโ
outiโ
- ์๋์ธต์ผ ๋๋ ๋ธํ๊ฐ์ ์ด์ฉํด ์ด์ ์ธต์ผ๋ก๋ถํฐ ์ ํ๋ ์ค์ฐจ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ:
โwijโโEโ=(outjโโtargetjโ)โ
fโฒ(netjโ)โ
outiโ
๋ธํ์ ์ญํ
๋ธํ ฮดkโ๋ ์ค์ฐจ๋ฅผ ์ถ๋ ฅ์ธต์์ ์๋์ธต์ผ๋ก, ์๋์ธต์์ ์
๋ ฅ์ธต์ผ๋ก ์ ํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค.
์ ๊ฒฝ๋ง์ ํ์ต์ ์ด ๋ธํ ๊ฐ์ ํตํด ์ค์ฐจ๋ฅผ ๊ฐ ์ ๋์ ์ ํํ๊ณ , ์ด๋ฅผ ๋ฐ์ํ์ฌ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋๋ค.
๐งฎ ์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ ์ง์ ๊ณ์ฐ
โ
์๋ฐฉํฅ ํจ์ค (Forward Pass)

-
์ถ๋ ฅ์ธต ์ ๋ y์ ๋ํ ์ถ๋ ฅ ๊ณ์ฐ:
๊ฐ์ค์น์ ์
๋ ฅ ๊ฐ๋ค์ ๊ณ์ฐํ์ฌ netyโ๋ฅผ ๊ตฌํ๋ค.
netyโ=w5โโ
outh1โ+w6โโ
outh2โ+b3โ
=0.5โ0.524979+0.6โ0.549834+0.3=0.89239
์ฌ๊ธฐ์ outh1โ๊ณผ outh2โ๋ ์๋์ธต์์ ๋์ค๋ ๊ฐ์ด๋ค.
์ด ๊ฐ์ sigmoid ํจ์๋ก ํต๊ณผ์์ผ ์ต์ข
์ถ๋ ฅ outyโ๋ฅผ ์ป๋๋ค.
outyโ=1+eโnetyโ1โ=1+eโ0.892391โโ0.709383
-
์ด ์ค์ฐจ ๊ณ์ฐ
๋ชฉํ ์ถ๋ ฅ targetyโ=0.0๊ณผ ๊ณ์ฐ๋ ์ถ๋ ฅ outyโ์ฌ์ด์ ์ค์ฐจ๋ฅผ ๊ณ์ฐํ๋ค.
E=21โโ
(targetyโโoutyโ)2=21โโ
(0.00โ0.709383)2โ0.251612
โ
์ญ๋ฐฉํฅ ํจ์ค (Backward Pass)
๐์ถ๋ ฅ์ธต โ ์๋์ธต
- ๊ฐ์ค์น w5โ์ ๋ณํ๊ฐ ์ถ๋ ฅ ์ค์ฐจ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ์ฐ
Chain Ruleโw5โโEโ=โoutyโโEโโ
โnetyโโoutyโโโ
โw5โโnetyโโ

๋จ๊ณ๋ณ๋ก ๋ฏธ๋ถ:
์ถ๋ ฅ์ธต์ ๋ํ ์ค์ฐจ:โoutyโโEโ=(outyโโtargetyโ)=0.709383โ0=0.709383
layer2_error = layer2*y
ํ์ฑํ ํจ์ ๋ฏธ๋ถ (sigmoid ํจ์์ ๋ฏธ๋ถ):โnetyโโoutyโโ=outyโโ
(1โoutyโ)=0.709383โ
(1โ0.709383)=0.206158
layer2_delta=layer2_error*actf_deriv(layer2)
๊ฐ์ค์น ๋ฏธ๋ถ:โw5โโnetyโโ=outh1โ=0.524979
- ์ต์ข
๊ธฐ์ธ๊ธฐ ๊ณ์ฐ
๋ฐ๋ผ์ w5โ์ ๋ํ ๊ธฐ์ธ๊ธฐ๋:โw5โโEโ=โoutyโโEโโ
โnetyโโoutyโโโ
โw5โโnetyโโ =0.709383โ
0.206158โ
0.524979=0.076775 ์ด ๊ฐ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ด์ฉํ์ฌ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
layer2_delta*layer1.T
๐ ๊ฐ์ค์น ์
๋ฐ์ดํธ
๊ฒฝ์ฌํ๊ฐ๋ฒ์ ํตํด w5โ์ ๊ฐ์ ์
๋ฐ์ดํธํ๋ค:
w5โ(t+1)=w5โ(t)โฮทโ
โw5โโEโ
์ฌ๊ธฐ์ ํ์ต๋ฅ ฮท๋ 0.5์ด๊ณ , ๋ฐ๋ผ์:
w5โ(t+1)=0.5โ0.2โ
0.076775=0.484645
์ญ๋ฐฉํฅ ํจ์ค๋ ์ถ๋ ฅ ์ค์ฐจ๋ฅผ ์๋์ธต์ผ๋ก ์ ํํ์ฌ ๊ฐ ๊ฐ์ค์น๊ฐ ์ค์ฐจ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ์ฐํ๋ค.
์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ณผ์ ์ด๋ค.
w6โ(t+1)=0.583918b3โ(t+1)=0.270750
๊ฐ์ค์น๊ฐ ์ ์ ๋ฎ์์ง๋ค.
๋ฐ์ด์ด์ค๋ ๊ธฐ์กด ๊ฐ๋ณด๋ค ๋ฎ์์ง๊ฒ ๋๋ค. ์ด๋ ๋ค์๋ฒ์ ์ ๋์ ์ถ๋ ฅ์ ๋ ๋ฎ๊ฒ ๋ง๋ค๊ฒ์ด๋ค.
๐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ถ๋ ฅ๊ฐ์ 0 ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ์๋์ธต โ ์
๋ ฅ์ธต
- ๊ฐ์ค์น w1โ์ ์
๋ฐ์ดํธ ๊ณ์ฐ:
w1โ(t+1)=w1โ(t)โฮทโ
โw1โโEโ=0.10โ0.2โ
0.0=0.10 w2โ(t+1)=0.2,w3โ(t+1)=0.3,w4โ(t+1)=0.4
- ์
๋ ฅ๊ฐ์ด
0์ธ ๊ฒฝ์ฐ์๋ ๊ฐ์ค์น๋ ๋ณํํ์ง ์๋๋ค.
- ์
๋ ฅ์ด
0์ด๋ฉด ๊ฐ์ค์น๋ฅผ ์๋ฌด๋ฆฌ ๋ฐ๊ฟ๋ ๋ฌด์จ ์์ฉ์ด ์๋?
๋ฐ์ด์ด์ค b1โ์ b2โ์
๋ฐ์ดํธ:b1โ(t+1)=0.096352,b2โ(t+1)=0.195656
- ๋ฐ์ด์ด์ค๋ ๊ธฐ์กด ๊ฐ๋ณด๋ค ๋ฎ์์ง๊ฒ ๋์ด,
์ถ๋ ฅ๊ฐ์ ๋ ๋ฎ์ถ๋ ๋ฐฉํฅ์ผ๋ก ๋์ํ๋ค.
๐ ์์คํจ์ ํ๊ฐ
E=21โ(targetโoutyโ)2=21โ(0.00โ0.709383)2=0.251612
โฌ๏ธ ๊ฒฝ์ฌํ๊ฐ๋ฒ 1๋ฒ ์ ์ฉ
E=21โ(targetโoutyโ)2=21โ(0.00โ0.699553)2=0.244687
โฌ๏ธ ๊ฒฝ์ฌํ๊ฐ๋ฒ 10000๋ฒ ์ ์ฉ
E=21โ(targetโoutyโ)2=21โ(0.00โ0.005770)2=0.000016
์ค์ฐจ๊ฐ ํฌ๊ฒ ์ค์ด๋ ๋ค.
๐ฆ Numpy๋ฅผ ์ด์ฉํ์ฌ MLP ๊ตฌํ
import numpy as np
def actf(x):
return 1 / (1 + np.exp(-x))
def actf_deriv(x):
return x * (1 - x)
inputs, hiddens, outputs = 2, 2, 1
learning_rate = 0.2
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
T = np.array([[1], [0], [0], [1]])
W1 = np.array([[0.10, 0.20], [0.30, 0.40]])
W2 = np.array([[0.50], [0.60]])
B1 = np.array([0.1, 0.2])
B2 = np.array([0.3])
def predict(x):
layer0 = x
Z1 = np.dot(layer0, W1) + B1
layer1 = actf(Z1)
Z2 = np.dot(layer1, W2) + B2
layer2 = actf(Z2)
return layer0, layer1, layer2
def fit():
global W1, W2, B1, B2
for i in range(90000):
for x, y in zip(X, T):
x = np.reshape(x, (1, -1))
y = np.reshape(y, (1, -1))
layer0, layer1, layer2 = predict(x)
layer2_error = layer2 - y
layer2_delta = layer2_error * actf_deriv(layer2)
layer1_error = np.dot(layer2_delta, W2.T)
layer1_delta = layer1_error * actf_deriv(layer1)
W2 += -learning_rate * np.dot(layer1.T, layer2_delta)
W1 += -learning_rate * np.dot(layer0.T, layer1_delta)
B2 += -learning_rate * np.sum(layer2_delta, axis=0)
B1 += -learning_rate * np.sum(layer1_delta, axis=0)
def test():
for x, y in zip(X, T):
x = np.reshape(x, (1, -1))
layer0, layer1, layer2 = predict(x)
print(x, y, layer2)
fit()
test()
[[0 0]] [1] [[0.99196032]]
[[0 1]] [0] [[0.00835708]]
[[1 0]] [0] [[0.00836107]]
[[1 1]] [1] [[0.98974873]]
Summary
MLP๋ ์
๋ ฅ์ธต๊ณผ ์ถ๋ ฅ์ธต ์ฌ์ด์ ์๋์ธต(hidden layer)์ ๊ฐ๋ ์ ๊ฒฝ๋ง ๊ตฌ์กฐ์ด๋ค.
์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ MLP๋ฅผ ํ์ต์ํค๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํต์ฌ ๋ฐฉ๋ฒ์ด๋ค.
- ์ญ์ ํ์ ๊ณผ์ :
- ์
๋ ฅ์ด ์ฃผ์ด์ง๋ฉด
์๋ฐฉํฅ์ผ๋ก ๊ณ์ฐํ์ฌ ์ถ๋ ฅ์ ๊ตฌํ๋ค.
- ์ค์ ์ถ๋ ฅ๊ณผ ์ํ๋ ์ถ๋ ฅ์ ์ฐจ์ด์ธ
์ค์ฐจ๋ฅผ ๊ณ์ฐํ๋ค.
- ์ด ์ค์ฐจ๋ฅผ
์ญ๋ฐฉํฅ์ผ๋ก ์ ํํ์ฌ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๊ณ , ์ค์ฐจ๋ฅผ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ํ์ต์ ์งํํ๋ค.