DonHurry

step15. ๋ณต์žกํ•œ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„(์ด๋ก  ํŽธ) ๋ณธ๋ฌธ

DeZero/๐Ÿ—ป์ œ2๊ณ ์ง€

step15. ๋ณต์žกํ•œ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„(์ด๋ก  ํŽธ)

_๋„๋… 2023. 1. 16. 00:01

๐Ÿ“ข ๋ณธ ํฌ์ŠคํŒ…์€ ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹3์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ณ , ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ต์žฌ ๊ตฌ๋งค๋ฅผ ๊ฐ•๋ ฅ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ทธ๋ฆผ[15-1]๊ณผ ๊ฐ™์ด ํ•œ ์ค„๋กœ ๋Š˜์–ด์„  ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„๋งŒ ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋” ๋ณต์žกํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ, ์ง€๊ธˆ์˜ DeZero๋Š” ์ œ๋Œ€๋กœ ๊ณ„์‚ฐํ•ด๋‚ด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

 

์˜ฌ๋ฐ”๋ฅธ ์—ญ์ „ํŒŒ์˜ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ์˜ DeZero๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋“ค์ด ๋ณด์ž…๋‹ˆ๋‹ค. C ๋‹ค์Œ์— ๋ฐ”๋กœ A๋กœ ์ด์–ด์ง€๊ณ , ํ•จ์ˆ˜ A์˜ ์—ญ์ „ํŒŒ๊ฐ€ ๋‘ ๋ฒˆ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

๋ฌธ์ œ์˜ ์›์ธ์€ funcs ๋ฆฌ์ŠคํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜๋ฅผ pop()์„ ์ด์šฉํ•ด ๊บผ๋‚ด๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋ฅผ ๋‹ด๊ฒŒ ๋  ๊ฒฝ์šฐ ๋‚˜์ค‘์— ๋‹ด๊ธด ์›์†Œ๋ฅผ ์ž˜๋ชป ๊บผ๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ํ•œ ์ค„๋กœ ๋‚˜์—ด๋œ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๋‹ค๋ค˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ์ŠคํŠธ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ผ ๋•Œ ํ•ญ์ƒ ์›์†Œ๊ฐ€ ํ•˜๋‚˜ ๋ฟ์ด์–ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

class Variable:
    ...
    
    def backward(self):
        if self.grad is None:
            self.grad = np.ones_like(self.data)

        funcs = [self.creator]
        while funcs:
            f = funcs.pop()
            gys = [output.grad for output in f.outputs]
            gxs = f.backward(*gys)
            if not isinstance(gxs, tuple):
                gxs = (gxs, )

            for x, gx in zip(f.inputs, gxs):
                if x.grad is None:
                    x.grad = gx
                else:
                    x.grad = x.grad + gx
            
                if x.creator is not None:
                    funcs.append(x.creator)

 

์ง€๊ธˆ๊นŒ์ง€๋Š” funcs ๋ฆฌ์ŠคํŠธ์˜ ๋‹ค์Œ์— ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜์˜ ํ›„๋ณด๋“ค์„ ์ƒ๊ฐ ์—†์ด ๋งˆ์ง€๋ง‰ ์›์†Œ๋งŒ ๊บผ๋ƒˆ์ง€๋งŒ, ์ด์ œ๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ์„ค์ •ํ• ๊นŒ์š”? ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ณ„์‚ฐ์ธ ์ˆœ์ „ํŒŒ ๋•Œ ํ•จ์ˆ˜๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ณผ์ •์„ ๋ชฉ๊ฒฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐฝ์กฐ์ž-ํ”ผ์กฐ๋ฌผ ๊ด€๊ณ„ ํ˜น์€ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๋ชฉ๊ฒฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ด€๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜์˜ ์„ธ๋Œ€๋ฅผ ๊ธฐ๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ธ๋Œ€ ์ˆ˜๊ฐ€ ํฐ ์ˆœ์„œ๋Œ€๋กœ ์—ญ์ „ํŒŒ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด, ๋ถ€๋ชจ๋ณด๋‹ค ์ž์‹์ด ๋จผ์ € ์ฒ˜๋ฆฌ๋จ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.