๊ธฐ์ดˆ/์ธ๊ณต์ง€๋Šฅ

์˜ค์ฐจ์—ญ์ „ํŒŒ(Back-Propagation)

James Hwang๐Ÿ˜Ž 2021. 8. 29. 23:30
๐Ÿ’ก 'Deep Learning from Scratch'๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•จ

์‹ ๊ฒฝ๋ง(neural network)์˜ ํ•™์Šต์„ ์œ„ํ•ด์„œ๋Š” ๊ฐ€์ค‘์น˜ ๋งค๊ฐœ๋ณ€์ˆ˜(weight parameter)์— ๋Œ€ํ•œ ์†์‹ค ํ•จ์ˆ˜(loss function)์˜ ๊ธฐ์šธ๊ธฐ(gradient)๋ฅผ ๊ตฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์šธ๊ธฐ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์ˆ˜์น˜ ๋ฏธ๋ถ„(numerical differentation)์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜์น˜ ๋ฏธ๋ถ„์€ '๊ทผ์‚ฌ์น˜(approximation)'๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹จ์ˆœํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ๊ณ„์‚ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฒŒ์‹œ๋ฌผ์€ ๊ฐ€์ค‘์น˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ์šธ๊ธฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ '์˜ค์ฐจ์—ญ์ „๋ฒ•'์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ์—ญ์ „ํŒŒ

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ์‹ ๊ฒฝ๋ง์ด ์žˆ์„ ๋•Œ, ์‹ ๊ฒฝ๋ง์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„์‚ฐ ์—ญ์‹œ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆœ์ „ํŒŒ(foward-propagation)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ „ํŒŒ๋Š” ์‹ ๊ฒฝ๋ง์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ์ „ํŒŒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ, ์—ญ์ „ํŒŒ๋Š” '๊ตญ์†Œ์ ์ธ ๋ฏธ๋ถ„'์„ ์ˆœ๋ฐฉํ–ฅ๊ณผ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์ธ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, '๊ตญ์†Œ์  ๋ฏธ๋ถ„'์„ ์ „๋‹ฌํ•˜๋Š” ์›๋ฆฌ๋Š” ์—ฐ์‡„๋ฒ•์น™(Chain rule)์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตญ์†Œ์  ๊ณ„์‚ฐ
์ „์ฒด์—์„œ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋“  ๊ด€๊ณ„์—†์ด ์ž์‹ ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋งŒ์„ ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ. ์—ฌ๊ธฐ์„œ ๊ตญ์†Œ์ ์ด๋ž€ '์ž์‹ ๊ณผ ์ง์ ‘ ๊ด€๊ณ„๋œ ์ž‘์€ ๋ฒ”์œ„'๋ฅผ ๋œปํ•จ.

1.1 ์—ญ์ „ํŒŒ์˜ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„(Computational graph)

๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„๋Š” ๊ณ„์‚ฐ ๊ณผ์ •์„ ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณต์ˆ˜์˜ ๋…ธ๋“œ(node)์™€ ์—์ง€(edge)๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์—ญ์ „ํŒŒ๋ฅผ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 1. ์—ญ์ „ํŒŒ์˜ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„

์œ„์˜ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์ด ์—ญ์ „ํŒŒ์˜ ๊ณ„์‚ฐ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์‹ ํ˜ธ $ E $์— ๋…ธ๋“œ์˜ ๊ตญ์†Œ์  ๋ฏธ๋ถ„($ \frac{\partial y}{\partial x} $)์„ ๊ณฑํ•œ ํ›„ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  2. ์ƒ๋ฅ˜์—์„œ ์ „๋‹ฌ๋œ ๊ฐ’์— ๊ตญ์†Œ์ ์ธ ๋ฏธ๋ถ„์„ ๊ณฑํ•˜์—ฌ ์•ž์ชฝ ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
๊ตญ์†Œ์  ๋ฏธ๋ถ„
๊ตญ์†Œ์  ๋ฏธ๋ถ„์€ ์ˆœ์ „ํŒŒ์˜ $ y=f(x) $ ๊ณ„์‚ฐ์˜ ๋ฏธ๋ถ„์„ ๊ตฌํ•œ๋‹ค๋Š” ๊ฒƒ. ์ด๋Š” $ x $์— ๋Œ€ํ•œ $ y $์˜ ๋ฏธ๋ถ„($ \frac{\partial y}{\partial x} $)์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ.

์œ„์˜ ์—ญ์ „ํŒŒ ๊ณ„์‚ฐ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅด๋ฉด ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋ฏธ๋ถ„ ๊ฐ’์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฐ์‡„ ๋ฒ•์น™์˜ ์›๋ฆฌ๋กœ ์ธํ•˜์—ฌ ๊ฐ€๋Šฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1.2 ์—ฐ์‡„๋ฒ•์น™

์—ฐ์‡„๋ฒ•์น™์„ ์ดํ•ดํ•˜๋ ค๋ฉด ํ•ฉ์„ฑ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ดํ•ด๋ถ€ํ„ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ์„ฑ ํ•จ์ˆ˜๋ž€ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, $ z=(x+y)^2 $์€ ์•„๋ž˜์˜ ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$$ z = t^2 $$
$$ t = x+y $$
์—ฐ์‡„๋ฒ•์น™์€ ํ•ฉ์„ฑ ํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์— ๋Œ€ํ•œ ์„ฑ์งˆ์ž…๋‹ˆ๋‹ค. ํ•ฉ์„ฑ ํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์€ 'ํ•ฉ์„ฑ ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์˜ ๊ณฑ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค'๊ณ  ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •์˜๋ฅผ ์ด์šฉํ•˜๋ฉด, ์œ„์˜ ์ˆ˜์‹์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฏธ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$$ \frac{\partial z}{\partial t} = 2t $$
$$ \frac{\partial t}{\partial x} = 1 $$
์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ•˜๊ณ  ์‹ถ์€ $ \frac{\partial z}{\partial x} $๋Š” ๋‘ ๋ฏธ๋ถ„์„ ๊ณฑํ•จ์œผ๋กœ์จ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$$ \frac{\partial z}{\partial x} = \frac{\partial z}{\partial t}\frac{\partial t}{\partial x} = 2t \cdot 1 = 2(x+y) $$
์ด๋ฅผ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์˜ ๊ทธ๋ฆผ 2์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 2. $ z = (x+y) ^ 2 $์˜ ์—ญ์ „ํŒŒ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„


2. ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ๊ณ„์ธต ๊ตฌํ˜„

2์ ˆ์—์„œ๋Š” ๋Œ€ํ‘œ์ ์ธ ํ™œ์„ฑํ™” ํ•จ์ˆ˜์ธ Recitified Linear Unit (ReLU)์™€ ์‹œ๊ทธ๋ชจ์ด๋“œ(Sigmoid)์˜ ๊ณ„์ธต์— ์—ญ์ „ํŒŒ์˜ ๊ฐœ๋…์„ ์ ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2.1 ReLU ๊ณ„์ธต

ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ReLU๋ฅผ $ x $์— ๋Œ€ํ•œ $ y $์˜ ๋ฏธ๋ถ„์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
$$ \frac{\partial y}{\partial x}=\begin{cases} 1 &(x>0)\\ 0 &(x\leq0) \end{cases} $$
์ˆœ์ „ํŒŒ์˜ ์ž…๋ ฅ์ธ $ x $๊ฐ€ 0๋ณด๋‹ค ํฌ๋ฉด ์—ญ์ „ํŒŒ๋Š” ์ƒ๋ฅ˜์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ํ•˜๋ฅ˜๋กœ ํ˜๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์ˆœ์ „ํŒŒ์—์„œ $ x $๊ฐ€ 0 ์ดํ•˜๋ฉด ์—ญ์ „ํŒŒ ๋•Œ๋Š” ํ•˜๋ฅ˜๋กœ 0์„ ํ˜๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค.

class Relu:
    def __init__(self):
        self.mask = None
    
    def forward(self, x):
        self.mask = (x <= 0)
        out = x.copy()
        out[self.mask] = 0

        return out
    
    def backward(self, dout):
        dout[self.mask] = 0
        dx = dout

        return dx

2.2 ์‹œ๊ทธ๋ชจ์ด๋“œ ๊ณ„์ธต

์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜์˜ ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
$$ y=\frac{1}{1+\exp{(-x)}} $$
์ด๋ฅผ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ญ์ „ํŒŒ์˜ ๋‹จ๊ณ„ ๋ณ„๋กœ ๊ณ„์‚ฐํ•œ ๊ฒƒ์ด ์•„๋ž˜์˜ ๊ทธ๋ฆผ 3์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 3. ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜์˜ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„

์œ„์˜ ๊ทธ๋ฆผ์—์„œ ๊ตฌํ•œ ์—ญ์ „ํŒŒ์˜ ์ตœ์ข… ์ถœ๋ ฅ์ธ $ \frac{\partial L}{\partial y}{y^{2}\exp{(-x)}} $๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$$ \begin{matrix} \frac{\partial L}{\partial y}{y^2\exp{(-x)}} &=& \frac{\partial L}{\partial y}\frac{1}{(1+\exp{(-x)}^2}\exp{(-x)}\\ &=& \frac{\partial L}{\partial y}\frac{1}{1+\exp{(-x)}}\frac{\exp{(-x)}}{1+\exp{(-x)}}\\ &=& \frac{\partial L}{\partial y}y(1-y) \end{matrix} $$
์‹œ๊ทธ๋ชจ์ด๋“œ ๊ณ„์ธต์˜ ์—ญ์ „ํŒŒ๋Š” ์ˆœ์ „ํŒŒ์˜ ์ถœ๋ ฅ์ธ $ y $๋งŒ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class sigmoid:
    def __init__(self):
        self.out = None
    
    def forward(self, x):
        out = 1 / (1 + np.exp(-x))
        self.out = out

        return out

    def backward(self, dout):
        dx = dout * (1.0 - self.out) * self.out

        return dx