Pytorch๋ฅผ ์ฌ์ฉํ๋ฉด์ ์๊ฒ๋ ์ฌ์ํ์ง๋ง ์๊ทผ ์ค์ํ ์ ๋ณด(๊ฟํ)๋ค์ ์ ๋ฆฌํฉ๋๋ค. ์ฌ์ํ ๋ด์ฉ๋ค์ด๋ผ ์ ๊น๋จน๊ธฐ๋ ํด์, ํ๋ ๋ ๋ค์ ๊ธฐ์ต ์๊ธฐ ๋ชฉ์ ์ผ๋ก ๊ธฐ๋กํฉ๋๋ค. ๋ด์ฉ์ ์ธ์ ๋ ์ง ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
Pytorch Tensor
-
Tensor์ Parameter์ ์ฐจ์ด: Tensor๋
requires_grad
์ default ์ค์ ์ด False์ด๋ parameter๋requires_grad
์ default ์ค์ ์ด True์ด๋ค. -
Tensor์ Shape์ ์กฐ์ํด์ผํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์ํ๊ฐ ๋น์ฐ์์ ์ผ๋ก ๋ณ๊ฒฝ๋๋์ง(ex,
transpose()
,expand()
,view()
) ์ ์ํด์ผํ๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผcontiguous()
,reshape()
๋ฑ์ ์ฌ์ฉํ์ฌ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์ํ๋ก ์ ํ์์ผ์ค์ผ ํ๋ค. -
underbar์ ์ด์ฉ -
torch.add()
์torch.add_()
์ ์ฐจ์ด 1- underbar ์๋ ๊ฒฝ์ฐ (
add_()
): in_place ์ฐ์ฐ, ์๋ก์ด tensor๋ฅผ ๋ง๋ค์ง ์๊ณ ๊ธฐ์กด tensor์ ์ฐ์ฐ์ ํ๋ค. - underbar ์๋ ๊ฒฝ์ฐ (
add()
): ์๋ก์ด tensor๋ฅผ return
- underbar ์๋ ๊ฒฝ์ฐ (
Pytorch Autograd 2 3
-
graph๋ฅผ ํ๋ฒ ๋ง๋ค๊ณ ์ฌ ์ฌ์ฉํ๋ ค๋ฉด
retain_graph=True
์ต์ ์ ์ฌ์ฉํด์ผํ๊ณ ,backward()
์ฐ์ฐ์ ์ฌ๋ฌ๋ฒ ํด์ค ๋์๋ gradient ๊ฐ์ด ๊ณ์ ๋ํด์ง๊ธฐ ๋๋ฌธ์x.grad.zero_()
์ ๊ฐ์ gradient์ด๊ธฐํ ๊ณผ์ ์ด ํ์ํ๋ค. -
autograd์์ ์ง์ํ์ง ์๋ ์ฐ์ฐ์ ํด์ผํ ๋๋ forward, backward์ฐ์ฐ์ ์ง์ ๊ตฌํํด์ผํ๋ฉฐ, ์ด ๋ ์ฃผ์์ฌํญ์
- class๋ฅผ ๋ง๋ค ๋
torch.autograd.Function
๋ฅผ ์์ํ๊ธฐ - forwardํ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ๊ธฐ๋กํ๊ธฐ (
ctx.save_for_backward()
์ด์ฉ) - backward๋ฅผ ์ง์ ๊ตฌํํ์ ๋, backward๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํ ๋๋
torch.autograd.gradcheck()
๋ฅผ ํธ์ถํ์ฌ ํ์ธํ๋ ๊ฒ์ด ์ ์ฉํ๋ค.
- class๋ฅผ ๋ง๋ค ๋
-
evaluation ๊ณผ์ ๊ฐ์ด backward๋ฅผ ํ์ง ์๋ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ธฐ ์ํด
torch.no_grad()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ํด๋น ๋ถ๋ถ์์ ๋ชจ๋ ๋ณ์๋ค์requires_grad=False
๋ก ์ง์ ์ด ๋๋ค. -
create_graph
์ ์ญํ : ๋ง์ฝ 2์ฐจ ๋ฏธ๋ถ์ด ํ์ํ ๊ฒฝ์ฐ, ๋ด๋ถ ๊ทธ๋ํ์์ ์ฐ์ฐ ์์ ๋ฐ๋ก ์ ์ฅ์ ์ํ๊ธฐ ๋๋ฌธ์ 2์ฐจ ๋ฏธ๋ถ์ ๊ตฌํ๋ คํ๋ฉด ์๋ฌ๊ฐ ๋๋ค. ์ด๋,create_graph=True
๋ก ํด์ฃผ๋ฉด ๊ทธ๋ํ ๋ด๋ถ์์ ๊ฑฐ์ณ๊ฐ๋ ๋ ธ๋๋ค์ ํธ๋ฏธ๋ถ ์ฐ์ฐ์๋ค์ ๋ชจ๋ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํด์ง๋ค. (๋ฉ๋ชจ๋ฆฌ cost๋ ๋ง์ด ์ปค์ง ๊ฒ ๊ฐ๋ค) -
์ค๊ฐ์ gradient ๊ฐ์ ์์๋ก ๋ณ๊ฒฝํด์ผํ ๋, ๋ณ๊ฒฝํ
grad
๊ฐ์ ์ดํ ๊ณ์ฐ์๋ ์ํฅ์ ๋ฏธ์น๋ค.
Pytorch Module
Module์ ์ฃผ๋ก pytorch์ ๋ด์ฅ๋์ด์๋ ์ฌ๋ฌ Module๋ค์ ์กฐํฉํด์ ์๋ก์ด Module์ ๋ง๋ค ๋ ์ง์ Module์ ์ ์ํด์ ์ฌ์ฉํ๊ฒ ๋๋ค.
-
class my_module(torch.nn.Module)
์ ์ ์ํ๋ฉดself.__init__()
์์ ๋ค๋ฅธ ๋ชจ๋๋ค์ ๋ถ๋ฌ์ค๋๋ฐ ์ด๋Module.__setattr__()
๋ด๋ถ์์add_module()
์ด ์์ฉํด์ ํฌํจํ ๋ชจ๋์ ์ ์ธ์ํ ์ ์๊ฒ ๋๋ค.- ์ด๋
__init__
์์ ์ฌ์ฉํ ์ ์๋ ์ ์ ๋ฐฉ๋ฒ ์ค ๊ฟํ์ด๋ผ๊ณ ์๊ฐ๋๋ ๊ฒtorch.nn.ModuleList()
,torch.nn.ModuleDict()
๋ฐฉ๋ฒ์ด๋ค. ๊ฐ๊ฐ listํํ๋ก ํน์ dictํํ๋ก ๋ชจ๋์ ์ ์ฅํจ๊ณผ ๋์์ ์๋์ผ๋ก ๋ชจ๋์ ์ธ์ํ ์ ์๊ฒ๋ ๋ด์ฅ ํจ์์์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํ ๋ฏ ํ๋ค.
- ์ด๋
-
Module ํํธ์์๋ Module์ ์ฌ๋ฌ๊ฐ ๋ฌถ์ด ์ฌ์ฉํ ๋, ํน์ ๋ชจ๋ ์์์ ๋ค๋ฅธ ๋ชจ๋์ ํธ์ถ ํ ๋,
add_module()
ํจ์๊ฐ (์๋์ด๋ ์๋์ด๋ ) ํธ์ถ๋์ด ๋ชจ๋์ ์ธ์ํ ์ ์๊ฒ๋ ํ๋ ๊ฒ์ด ์ค์ point์๋ค.add_module()
์ ์๋์ผ๋ก ํธ์ถ- ํ์ด์ฌ ๋ฆฌ์คํธ ๋์
ModuleList()
์ฌ์ฉ, ํ์ด์ฌ ๋์ ๋๋ฆฌ ๋์ModuleDict()
์ฌ์ฉ
Pytorch Parameter
- Parmeter๋ฅผ ๋ชจ๋์ ์ถ๊ฐํ ๋
register_parameter()
ํจ์๊ฐ (์๋/์๋์ผ๋ก) ํธ์ถ๋์ด ๋ชจ๋์ ํ๋ผ๋ฏธํฐ๋ก ์ธ์ํ ์ ์๊ฒ๋ ํ๋ ๊ฒ์ด ์ค์ํ๋ค.register_parameter()
๋ฅผ ์๋์ผ๋ก ํธ์ถ- ํ์ด์ฌ ๋ฆฌ์คํธ, ๋์
๋๋ฆฌ ๋์
ParameterList()
,ParameterDict()
์ฌ์ฉ
Pytorch Buffer
-
Buffer๋ Module์ ์ ์ฅํด๋๊ณ ํ์ต์ ์ฌ์ฉํ์ง ์๋ Tensor.
register_buffer()
๋ฅผ ์ด์ฉํด ์ ์ํ๋ค. Buffer๋ train mode์ผ ๋๋ง ์ ๋ฐ์ดํธ๊ฐ ๋๊ณ eval mode์์๋ ๊ฐ์ด ๋ณํ์ง ์๋๋ค.- train mode์ผ๋๋ง ์ ๋ + eval mode์์ ๋ณํ์ง ์๋ ๋ณ์ ์ค ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ฑด ์ญ์ BN์ด๋ค. Batch Normalization์ moving average mean, moving average variance ๊ฐ์ ์ ์ฅํ ๋ buffer ์ฌ์ฉํ๋ค.
Pytorch Hook
- Hook์ Module ๋ด๋ถ๋ฅผ ๊ฑด๋ค์ด์ง ์์ผ๋ฉด์ Module์ forward, backward์ ๊ฐ๋ค์ ๊ด์ฐฐ/์์ ํ ๋ ์ฌ์ฉํ๋ค.