| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ํ
- ALTERTABLE
- ์ฌ์ดํท๋ฐ
- ๋ฌด๊ฒฐ์ฑ์ ์ง
- ๋ฌธ์์ด
- Hyperlink Graphs
- ๋ฌด๊ฒฐ์ฑ์ ์ง๋ฉ์ปค๋์ฆ
- ์ฃผ์ฑ๋ถ ์ฐพ๊ธฐ
- DROPTABLE
- ๋ฐฑ์ค
- SQL
- ์ปจํ ์ด๋๊ฐ์ฒด
- ํ์ด์ฌ
- Python
- ๋ถ๊ฝ๋ฐ์ดํฐ์
- ํค ์ข ๋ฅ
- Key ์ข ๋ฅ
- ์ ์ฌ์์๋ชจ๋ธ
- latent factor model
- ํด๋ฆฐ์ฝ๋
- ๋ฌด๊ฒฐ์ฑ
- sklearn
- SQLDDL
- ์๊ณ ๋ฆฌ์ฆ
- TDD
- ์ธ๋๋ณ๊ฐ๋น์ง์ปฌ๋ ํฐ
- RENAMETABLE
- latent factor
- CREATETABLE
- knn_classify
- Today
- Total
DonHurry
step17. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ํ ์ฐธ์กฐ ๋ณธ๋ฌธ
๐ข ๋ณธ ํฌ์คํ ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ์์ํ๋ ๋ฅ๋ฌ๋3์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ต๋๋ค. ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๊ณ , ๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑํ๋ ํฌ์คํ ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ต์ฌ ๊ตฌ๋งค๋ฅผ ๊ฐ๋ ฅ ์ถ์ฒ๋๋ฆฝ๋๋ค.

ํ์ด์ฌ์ ํ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ผ๋ก ์ญ์ ํฉ๋๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ์ ๋๋ก ์์ฑํ์ง ์์ ์์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋ถ์กฑ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค. ํนํ ์ ๊ฒฝ๋ง์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผํฉ๋๋ค. ํ์ด์ฌ(CPython)์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ฐธ์กฐ์๋ฅผ ์ธ๋ ๋ฐฉ์๊ณผ ์ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ๋ชจ์๋ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ๋๋ฉ๋๋ค. ์ ์๋ ์ฐธ์กฐ ์นด์ดํธ, ํ์๋ GC(Garbage Collection)๋ผ๊ณ ํฉ์๋ค.
์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ณธ์ ์ฐธ์กฐ ์นด์ดํธ์ ๋๋ค. ๋ชจ๋ ๊ฐ์ฒด๋ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ธ ์ํ๋ก ์์ฑ๋์ด, ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐํฉ๋๋ค. ๊ฐ์ฒด์ ๋ํ ๋ชจ๋ ์ฐธ์กฐ๊ฐ ๋๊ธฐ๋ฉด ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋์ด ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๊ฐ ํ์ํ๊ฒ ๋ฉ๋๋ค.
์๋ ๊ทธ๋ฆผ์ ์ผ์ชฝ ์ํ์์ a = b = c = None์ ์คํํ๊ฒ ๋๋ฉด ์ค๋ฅธ์ชฝ๊ณผ ๊ฐ์ ์ํ๊ฐ ๋ ๊ฒ๋๋ค. ์ด๋ a์ ์ฐธ์กฐ ์นด์ดํธ๋ 0์ด ๋์ด ์ฆ์ ์ญ์ ๋๊ณ , ์ด์ด์ b์ ์ฐธ์กฐ ์นด์ดํธ๋ 0์ด ๋ฉ๋๋ค. c ์ญ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ญ์ ๋ฉ๋๋ค.

ํ์ง๋ง ์ฐธ์กฐ ์นด์ดํธ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๊ฐ ์๋๋ฐ, ๋ฐ๋ก ์ํ ์ฐธ์กฐ์ ๋๋ค. ์์ ๊ฐ์ด a = b = c = None์ ์คํ๋ง์ผ๋ก๋ ์ํ ์ฐธ์กฐ์ ์นด์ดํธ๋ฅผ 0์ผ๋ก ๋ง๋ค ์ ์์ด, ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์ ๊ณ ๋ คํด GC(์ธ๋๋ณ ๊ฐ๋น์ง ์ปฌ๋ ์ )๋ ๋ณด๋ค ์๋ฆฌํ ๋ฐฉ์์ผ๋ก ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ์ฐพ์๋ ๋๋ค. GC๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ ์์ ์ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์ ์ํด ์๋ ํธ์ถ๋ฉ๋๋ค.

GC๋ ์ํ ์ฐธ์กฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ GC์ ๋ฏธ๋ฃจ๋ฉด ํ๋ก๊ทธ๋จ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ปค์ง๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ํ ์ฐธ์กฐ๋ ์ต๋ํ ๋ง๋ค์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ฌ์ DeZero์๋ ์ํ ์ฐธ์กฐ๊ฐ ์กด์ฌํ๋๋ฐ, ํ์ค ํ์ด์ฌ ๋ชจ๋์ธ weakref๋ก ํด๊ฒฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.

weakref.ref ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝํ ์ฐธ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฝํ ์ฐธ์กฐ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋, ์ฐธ์กฐ ์นด์ดํธ๋ ์ฆ๊ฐ์ํค์ง ์์ต๋๋ค. DeZero์์๋ Function์ด Variable(outputs) ์ธ์คํด์ค๋ฅผ ๋์์ผ๋ก ์ฝํ ์ฐธ์กฐ๋ฅผ ํ๋๋ก ๋ณ๊ฒฝํ์ฌ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค. self.outputs๊ฐ ๋์์ ์ฝํ ์ฐธ์กฐ๋ก ๊ฐ๋ฆฌํค๊ฒ ๋ณ๊ฒฝํ์์ต๋๋ค.
import weakref
class Function:
def __call__(self, *inputs):
xs = [x.data for x in inputs]
ys = self.forward(*xs)
if not isinstance(ys, tuple):
ys = (ys, )
outputs = [Variable(as_array(y)) for y in ys]
self.generation = max([x.generation for x in inputs])
for output in outputs:
output.set_creator(self)
self.inputs = inputs
self.outputs = [weakref.ref(output) for output in outputs]
return outputs if len(outputs) > 1 else outputs[0]
๋ณ๊ฒฝ์ ์ฌํ๋ก Function ํด๋์ค์ outputs๋ฅผ ์ฐธ๊ณ ํ๋ ์ฝ๋๋ ์์ ํฉ๋๋ค. output.grad๋ฅผ output().grad๋ก ์์ ํ์์ต๋๋ค. ์ด์์ผ๋ก ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
class Variable:
...
def backward(self):
...
while funcs:
f = funcs.pop()
gys = [output().grad for output in f.outputs] # output์ weakref
...'DeZero > ๐ป์ 2๊ณ ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| step19. ๋ณ์ ์ฌ์ฉ์ฑ ๊ฐ์ (0) | 2023.01.20 |
|---|---|
| step18. ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ๋ชจ๋ (0) | 2023.01.19 |
| step16. ๋ณต์กํ ๊ณ์ฐ ๊ทธ๋ํ(๊ตฌํ ํธ) (0) | 2023.01.17 |
| step15. ๋ณต์กํ ๊ณ์ฐ ๊ทธ๋ํ(์ด๋ก ํธ) (0) | 2023.01.16 |
| step14. ๊ฐ์ ๋ณ์ ๋ฐ๋ณต ์ฌ์ฉ (0) | 2023.01.15 |