배우고 느끼고 생각하고 사랑하라

그리고 즐겨라

정리/Pytorch

[Pytorch 기본] Autograd

gyubinc 2023. 1. 17. 17:28
해당 게시글은 PyTorch tutorial을 기반으로 설명을 덧붙이고 코드를 수정하며 정리한 글입니다.
Pytorch는 autograd operation을 제공한다.

autograd는 automatic differentiation engine으로, neural network 학습에 사용되는 gradient를 제공한다. (경사하강법에서 활용 가능)

 

Background

Neural network는 weight, bias와 같은 parameter로 정의될 수 있는 함수들의 중첩이다.

NN의 학습은 크게 2가지 과정을 거쳐 이루어진다.

Forward Propagation : Input 데이터를 함수들에 넣어서 결과값을 뽑아내는 과정

Backward Propagation : output 데이터를 감소시키기 위해 각각의 미분값들을 역으로 구해가는 과정, 결과값을 감소시키기 위해서는 gradient에 rate를 곱해 빼주고, 증가시키기 위해서는 gradient에 rate를 곱해 더해준다.

*Backward Propagation 부분은 중요하니 따로 찾아볼 것 권장

 

Usage in PyTorch

(GPU 환경에서만 실행 가능)
 
import torch
from torchvision.models import resnet18, ResNet18_Weights
model = resnet18(weights = ResNet18_Weights.DEFAULT)
data = torch.rand(1,3,64,64)
labels = torch.rand(1,1000)

Forward pass

prediction = model(data)

model의 prediction과 random한 label을 통해 loss function의 결과값을 구한다.

loss = (prediction - labels).sum()
print(loss)
loss.backward()
optimizer를 load한다. SGD를 사용하였고 learning rate는 0.01 momentum은 0.9로 설정하였다.

적용할 parameter는 model이 가진 parameter 전부이다.
optim = torch.optim.SGD(model.parameters(), lr = 1e-2, momentum=0.9)

gradient descent 적용

optim.step()

Differentiation in Autograd

import torch

a = torch.tensor([2., 3.], requires_grad = True)
b = torch.tensor([6., 4.], requires_grad = True)

모델 생성

Q = 3*a**3 - b**2

해당 모델의 각 parameter a,b에 대하여 편미분한 결과는 아래와 같다.

external_grad = torch.tensor([1., 1.])
Q.backward(gradient = external_grad)
print(9*a**2 == a.grad)
print(-2*b == b.grad)

Chain rule을 통한 gradient 구하는 방식을 행렬곱의 형태로 아래와 같이 설명한다.

Frozen parameter

경우에 따라서 계산에 특정 parameter를 제외할 수 있다.

해당 파라미터를 frozen parameter 라고 하며, 이러한 과정은 pretrained model에 fine-tuning할 때 유용하다(이미 학습된 모델을 기반으로 학습하는 과정)

 

x = torch.rand(5,5)
y = torch.rand(5,5)
z = torch.rand((5,5), requires_grad = True)

a = x+y
print(f'Does "a" require gradients? : {a.requires_grad}')
b = x+z
print(f'Does "b" require gradients? : {b.requires_grad}')
finetuning model을 활용하여 classification하기 위해서는 보통 아래와 같이 label의 shape만 바꿔준다.
from torch import nn, optim

model = resnet18(weights = ResNet18_Weights.DEFAULT)

# Freeze all the parameters in the network
for param in model.parameters():
  param.requires_grad = False
  
model.fc = nn.Linear(512,10)

optimizer = optim.SGD(model.parameters(), lr = 1e-2, momentum = 0.9)
 

 

'정리 > Pytorch' 카테고리의 다른 글

[Pytorch 꿀팁] Cuda:out of memory  (0) 2023.03.24
[Pytorch 기본] Classifier  (0) 2023.01.21
[Pytorch 기본] Neural Network  (0) 2023.01.21
[Pytorch 기본] Tensor  (2) 2023.01.17