| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |
- ๋ฌด๊ฒฐ์ฑ์ ์ง
- ๋ฌธ์์ด
- ์ปจํ ์ด๋๊ฐ์ฒด
- DROPTABLE
- ๋ถ๊ฝ๋ฐ์ดํฐ์
- latent factor
- latent factor model
- ํ
- ์ฃผ์ฑ๋ถ ์ฐพ๊ธฐ
- ํด๋ฆฐ์ฝ๋
- CREATETABLE
- ์ธ๋๋ณ๊ฐ๋น์ง์ปฌ๋ ํฐ
- ํค ์ข ๋ฅ
- Hyperlink Graphs
- ๋ฌด๊ฒฐ์ฑ์ ์ง๋ฉ์ปค๋์ฆ
- TDD
- sklearn
- ์ฌ์ดํท๋ฐ
- SQL
- knn_classify
- SQLDDL
- RENAMETABLE
- ํ์ด์ฌ
- Python
- ALTERTABLE
- ์๊ณ ๋ฆฌ์ฆ
- Key ์ข ๋ฅ
- ์ ์ฌ์์๋ชจ๋ธ
- ๋ฌด๊ฒฐ์ฑ
- ๋ฐฑ์ค
- Today
- Total
DonHurry
step18. ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ๋ชจ๋ ๋ณธ๋ฌธ
๐ข ๋ณธ ํฌ์คํ ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ์์ํ๋ ๋ฅ๋ฌ๋3์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ต๋๋ค. ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๊ณ , ๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑํ๋ ํฌ์คํ ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ต์ฌ ๊ตฌ๋งค๋ฅผ ๊ฐ๋ ฅ ์ถ์ฒ๋๋ฆฝ๋๋ค.

์ด๋ฒ ๋จ๊ณ์์๋ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ๋ชจ๋๋ฅผ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ์ ํ์ ์๋ ๋ฏธ๋ถ๊ฐ๋ค์ ์ญ์ ํ๊ฒ ์ต๋๋ค. ํ์ฌ์ DeZero๋ ๋ฏธ๋ถ์ ์งํํ๋ฉด ๋ชจ๋ ๋ณ์๊ฐ ๋ฏธ๋ถ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํฉ๋๋ค. ๋ณดํต ๋จธ์ ๋ฌ๋์์๋ ๋ง๋จ ๋ณ์์ ๋ฏธ๋ถ๊ฐ๋ง ํ์ํ๋ฏ๋ก, ์ค๊ฐ ๋ณ์์ ๋ฏธ๋ถ๊ฐ์ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ(retain_grad)์ ์ถ๊ฐํฉ๋๋ค.
class Variable:
...
def backward(self, retain_grad=False):
...
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:
add_func(x.creator)
if not retain_grad:
for y in f.outputs:
y().grad = None # y๋ ์ฝํ ์ฐธ์กฐ(weakref)
ํ ์คํธ๋ก ๋ค์ ์ฝ๋๋ฅผ ์คํํด๋ณด๊ฒ ์ต๋๋ค. ์ค๊ฐ ๋ณ์์ธ y์ t์ ๋ฏธ๋ถ๊ฐ์ ์ญ์ ๋๊ณ , ๋ง๋จ ๋ณ์์ธ x0๊ณผ x1์ ๋ฏธ๋ถ๊ฐ๋ง ์ ์ง๋ฉ๋๋ค. ๋๋ถ์ ์ ์ฝ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฅธ ๊ณณ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
x0 = Variable(np.array(1.0))
x1 = Variable(np.array(1.0))
t = add(x0, x1)
y = add(x0, t)
y.backward()
print(y.grad, t.grad) # None None
print(x0.grad, x1.grad) # 2.0 1.0
์ ๊ฒฝ๋ง์ ํฌ๊ฒ ํ์ต๊ณผ ์ถ๋ก ์ด๋ผ๋ ๋ ๊ฐ์ง ๋จ๊ณ๋ก ๋๋ฉ๋๋ค. ํ์ต ์์๋ ๋ฏธ๋ถ๊ฐ์ ๊ตฌํด์ผํ์ง๋ง, ์ถ๋ก ์์๋ ์์ ํ๋ง์ ์งํํ๊ธฐ ๋๋ฌธ์ ์ค๊ฐ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํฌ๊ฒ ์ค์ด๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ์ธ PyTorch์์๋ ์ด ๊ธฐ๋ฅ์ torch.no_grad()๋ผ๋ ํจ์ ํํ๋ก ์ ๊ณตํฉ๋๋ค. (๋งค์ฐ ์์ฃผ ์ฐ์ ๋๋ค.)
์์ ํ๋ง ํ์ฉํ ๋๋ฅผ ์ํด, ์ญ์ ํ ํ์ฑ ๋ชจ๋์ ์ญ์ ํ ๋นํ์ฑ ๋ชจ๋๋ฅผ ์ ํํ๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ Config ํด๋์ค๋ฅผ ํ์ฉํ๊ฒ ์ต๋๋ค. enable_backprop์ด True์ด๋ฉด ์ญ์ ํ ํ์ฑ ๋ชจ๋์ ๋๋ค. Config ๊ฐ์ ์ค์ ๋ฐ์ดํฐ๋ ๋จ ํ ๊ตฐ๋ฐ์๋ง ์กด์ฌํ๋ ๊ฒ์ด ์ข๊ธฐ ๋๋ฌธ์, ์ธ์คํด์คํํ์ง ์๊ณ ํด๋์ค ์ํ๋ก ๋๊ฒ ์ต๋๋ค.
class Config:
enable_backprop = True
์ด์ Function์์ Config ํด๋์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค. ์ญ์ ํ ์์ ํ์ํ ์ธ๋์ ๊ณ์ฐ๋ค์ ์ฐ๊ฒฐ์ ๋ง๋ค์ด๋ด๋ output.set_creator(self)๋ฑ์ ๊ธฐ๋ฅ์ if๋ฌธ ์์ ๋ฃ์์ต๋๋ค.
class Function:
def __call__(self, *inputs):
...
if Config.enable_backprop:
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]
ํ์ด์ฌ์๋ with๋ผ๋ ํธ๋ฆฌํ ๊ตฌ๋ฌธ์ด ์์ต๋๋ค. ์๋ ์ฝ๋์ ๊ฐ์ด with ๋ธ๋ก์ ๋ค์ด๊ฐ ๋ ์ด๋ค ์ฒ๋ฆฌ(์ ์ฒ๋ฆฌ)๋ฅผ ํด์ฃผ๊ณ , with ๋ธ๋ก์ ๋น ์ ธ๋์ฌ ๋ ์ฒ๋ฆฌ(ํ์ฒ๋ฆฌ)๋ฅผ ์๋์ผ๋ก ํ ์ ์์ต๋๋ค. ํด๋น ์ฝ๋๋ using_config ์์์๋ง ์ญ์ ํ ๋นํ์ฑ ๋ชจ๋์ธ ๊ฒ์ด๊ณ , ๋น ์ ธ๋์ค๋ฉด ์ผ๋ฐ ๋ชจ๋์ธ ์ญ์ ํ ํ์ฑ ๋ชจ๋๋ก ๋์๊ฐ๋ ๊ฒ์ ๋๋ค.
with using_config('enable_backprop', False):
x = Variable(np.array(2.0))
y = square(x)
์์ ํ์ฉํ๋ using_config ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค. ๋ค์ ์์ํ ์ ์์ต๋๋ค. ์ฐ์ with ๋ธ๋ก ์์์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒ์ ๊ณ ๋ คํ์ฌ try/finally ๊ตฌ๋ฌธ์ ํ์ฉํฉ๋๋ค. ๋ฏธ๋ฆฌ ์ด์ ๊ฐ์ธ old_value๋ฅผ ๋ฐ์๋๊ณ , setattr๋ฅผ ํตํด ์๋ก์ด value๋ฅผ ์ค์ ํฉ๋๋ค. ์ต์ข ์ ์ผ๋ก with ๋ธ๋ก์ ๋น ์ ธ๋์ฌ ๋์๋ ์๋ ๊ฐ์ธ old_value๋ก ๋ณต์๋ฉ๋๋ค.
import contextlib
@contextlib.contextmanager
def using_config(name, value):
old_value = getattr(Config, name)
setattr(Config, name, value)
try:
yield
finally:
setattr(Config, name, old_value)
ํธ์์ฑ์ ์ํด ๋ค์๊ณผ ๊ฐ์ ํจ์๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๋ก์จ PyTorch์ torch.no_grad์ ๋์ผํ๊ฒ ์๋์ํฌ ์ ์์ต๋๋ค. ์์ผ๋ก ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ์ด ํ์ ์์ ๋, no_grad ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
def no_grad():
return using_config('enable_backprop', False)
with no_grad():
x = Variable(np.array(2.0))
y = square(x)'DeZero > ๐ป์ 2๊ณ ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| step20. ์ฐ์ฐ์ ์ค๋ฒ๋ก๋(1) (0) | 2023.01.21 |
|---|---|
| step19. ๋ณ์ ์ฌ์ฉ์ฑ ๊ฐ์ (0) | 2023.01.20 |
| step17. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ํ ์ฐธ์กฐ (0) | 2023.01.18 |
| step16. ๋ณต์กํ ๊ณ์ฐ ๊ทธ๋ํ(๊ตฌํ ํธ) (0) | 2023.01.17 |
| step15. ๋ณต์กํ ๊ณ์ฐ ๊ทธ๋ํ(์ด๋ก ํธ) (0) | 2023.01.16 |