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

Pytorch Autograd 2 3

  • graph๋ฅผ ํ•œ๋ฒˆ ๋งŒ๋“ค๊ณ  ์žฌ ์‚ฌ์šฉํ•˜๋ ค๋ฉด retain_graph=True ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ , backward()์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด์ค„ ๋•Œ์—๋Š” gradient ๊ฐ’์ด ๊ณ„์† ๋”ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— x.grad.zero_()์™€ ๊ฐ™์€ gradient์ดˆ๊ธฐํ™” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

  • autograd์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์—ฐ์‚ฐ์„ ํ•ด์•ผํ•  ๋•Œ๋Š” forward, backward์—ฐ์‚ฐ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋ฉฐ, ์ด ๋•Œ ์ฃผ์˜์‚ฌํ•ญ์€

    1. class๋ฅผ ๋งŒ๋“ค ๋•Œ torch.autograd.Function๋ฅผ ์ƒ์†ํ•˜๊ธฐ
    2. forwardํ•  ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๋”ฐ๋กœ ๊ธฐ๋กํ•˜๊ธฐ (ctx.save_for_backward() ์ด์šฉ)
    3. backward๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, backward๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ๋•Œ๋Š” torch.autograd.gradcheck() ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค.
  • 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์˜ ๊ฐ’๋“ค์„ ๊ด€์ฐฐ/์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.