이것저것 기록

[DL, PyTorch] loss, optimizer 설정하기 본문

Data Science/ML & DL

[DL, PyTorch] loss, optimizer 설정하기

anweh 2020. 10. 14. 10:07

PyTorch로 신경망 모델을 설계할 때, 크게 다음과 같은 세 가지 스텝을 따르면 된다.

  1. Design your model using class with Variables 
  2. Construct loss and optim
  3. Train cycle (forward, backward, update)

여기서 두 번째 순서인 로스와 옵티마이저를 설정하는 방법을 포스팅 해보려고 한다. 

 


1. Opimizer 설정

옵티마이저는 PyTorch의 optim 패키지를 사용하여 간단하게 정의할 수 있다.

optim 패키지는 다양한 최적화 알고리즘을 초합하고 있으니까 참고하면 된다. 

 

torch.optim — PyTorch 1.6.0 documentation

torch.optim torch.optim is a package implementing various optimization algorithms. Most commonly used methods are already supported, and the interface is general enough, so that more sophisticated ones can be also easily integrated in the future. How to us

pytorch.org

import torch.optim as optim


optimizer = optim.SGD([a, b], lr=lr)

for epoch in range(n_epochs):
    yhat = a + b * x_train_tensor
    error = y_train_tensor - yhat
    loss = (error ** 2).mean()

    loss.backward()

    optimizer.step()
    optimizer.zero_grad()

print(a, b)

옵티마이저는 update할 parameter와 learning rate 및 여러 다른 hyper-parameter를 받아 step() method 를 통해 업데이트한다.

Gradient를 0으로 만드는 것도 옵티마이저의 zero_grad() method 가 해결해 준다.

그러니까 어떤 옵티마이저를 쓸지 정하고, 파라미터와 lr을 넘겨주면 남은 일?은 .step(), .zero_grad()이 해준다고 보면 될 것 같다. 

옵티마이저에 대해  알아두면 좋은 것들: (greeksharifa.github.io/pytorch/2018/11/10/pytorch-usage-03-How-to-Use-PyTorch/#set-loss-functioncreterion-and-optimizer)

  1. optimizer는 step() method를 통해 argument로 전달받은 parameter를 업데이트한다.
  2. 모델의 parameter별로(per-parameter) 다른 기준(learning rate 등)을 적용시킬 수 있다.
  3. torch.optim.Optimizer(params, defaults)는 모든 optimizer의 base class이다.
  4. nn.Module과 같이 state_dict()와 load_state_dict()를 지원하여 optimizer의 상태를 저장하고 불러올 수 있다.
  5. zero_grad() method는 optimizer에 연결된 parameter들의 gradient를 0으로 만든다.
  6. torch.optim.lr_scheduler는 epoch에 따라 learning rate를 조절할 수 있다.

 

 

2. Loss 설정

로스는 모델이 추측한 결과와 실제 정답이 얼마나 다른지에 대한 loss를 계산한다. 

로스 함수에도 종류가 엄청 많으니까 참고하면 좋다. 

 

torch.nn — PyTorch 1.6.0 documentation

Shortcuts

pytorch.org

로스 함수를 정의할 때 보통은 creterion, loss_fn, loss_function 등의 이름을 많이 사용한다. 

import torch.nn as nn

loss_fn = nn.MSELoss(reduction='mean')

optimizer = optim.SGD([a, b], lr=lr)

for epoch in range(n_epochs):
    yhat = a + b * x_train_tensor

    loss = loss_fn(y_train_tensor, yhat)

    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

 

 

 

Comments