• toc {:toc}

Model.train() & Model.eval()

  • λͺ¨λΈμ„ κ΅μœ‘ν•˜κ³  μžˆλ‹€λŠ” 것을 λͺ¨λΈμ— μ•Œλ¦°λ‹€.
  • Batch Normalization Layer, Dropout Layer 의 경우 train, eval 에 λ”°λΌμ„œ λ‹€λ₯΄κ²Œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— ν•™μŠ΅, 좔둠에 λ”°λ₯Έ λ™μž‘μ„ μ§€μ •ν•΄μ€˜μ•Ό ν•œλ‹€.
  • train()
    • Batch Norm - Batch Statistics λ₯Ό μ΄μš©ν•œλ‹€.
    • Dropout - μ£Όμ–΄μ§„ ν™•λ₯ μ— 따라 ν™œμ„±ν™”λœλ‹€.
  • eval()
    • Batch Norm - ν•™μŠ΅ μ‹œ μ‚¬μš©λœ Batch Statistics λ₯Ό 톡해 κ²°μ •λœ Running Statistics λ₯Ό μ΄μš©ν•œλ‹€.
    • Dropout - λΉ„ν™œμ„±ν™” λœλ‹€.

With torch.no_grad()

no_grad documentation{: width=β€œ800”}{: .center}

  • no_grad() λ₯Ό with statement 에 ν¬ν•¨μ‹œν‚€λ©΄ Pytorch 의 Autograd Engine 을 λΉ„ν™œμ„±ν™”ν•˜μ—¬ gradient 연산을 μ‚¬μš©ν•˜μ§€ μ•Šλ‹€.
  • 이 경우 backward λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  require_grad=False κ°€ λœλ‹€.
  • gradient 연산을 ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 쀄이고 속도λ₯Ό 높인닀.

optimizer.zero_grad()

  • Pytorch 의 경우 gradient 값듀을 backward ν•  λ•Œ κ³„μ†ν•΄μ„œ μΆ•μ ν•œλ‹€.

  • zero_grad() λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 이전 step μ—μ„œ backward ν•  λ•Œ μ‚¬μš©λœ gradient 값이 ν˜„μž¬ step μ—μ„œλ„ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— 쀑볡 μ μš©λœλ‹€.

    β†’ 쀑볡 μ μš©λœλ‹€λ©΄ μ˜λ„ν•œ λ°©ν–₯κ³Ό λ‹€λ₯Έ λ°©ν–₯을 κ°€λ₯΄μΌœ ν•™μŠ΅μ΄ 잘 λ˜μ§€ μ•ŠλŠ”λ‹€.

β‡’ 결둠적으둜 λ§€ ν•™μŠ΅ iteration λ§ˆλ‹€ optimizer.zero_grad() λ₯Ό ν•΄μ£Όλ©΄μ„œ gradient λ₯Ό 0 으둜 μ΄ˆκΈ°ν™” μ‹œμΌœμ€˜μ•Ό ν•œλ‹€.