이번 포스트에서는 파이토치가 제공하는 AUTOGRAD에 대해서 알아보자. AUTOGRAD는 신경망 학습에서 아주 중요한 부분 중 하나이다. 그렇기 때문에 신경망을 구성에 대한 사전 지식이 부족하다면, 이전의 신경망 구성에 대한 포스트를 읽고오면 좋을것 같다.
AUTOGRAD
AUTOGRAD는 왜 신경망을 학습하는데 중요할까? 신경망은 입력에서 출력까지 데이터가 흘러가면서 가중치와 편향의 영향을 받는다. 그리고 나서 손실함수를 계산하고 backpropagation(역전파) 알고리즘을 통해 손실함수를 최소화 할수 있는 방향으로 가중치를 갱신해나간다. 이때 가중치는 손실함수의 기울기(변화도)에 따라 조정된다. 그래서 이러한 기울기를 계산하기 위해 파이토치는 torch.autograd라는 자동 미분 엔진을 제공한다. 이를 활용하여 우리는 신경망 학습을 위한 기울기를 자동으로 계산할 수 있다.
이해를 위해 단틍 신경망을 만들고 시작한다.
import torch
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True) # requires_grad=True 일때만 기울기 계산
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
1. 기울기(Gradient) 계산
신경망에서는 파라미터에 대한 손심함수를 미분하여 가중치를 최적화 할 수 있다. $x$와 $y$에 대해 편미분을 하기 위해 loss.backward()를 호출하여 기울기를 계산한다.
loss.backward()
print(w.grad)
print(b.grad)
Out:
backward()를 사용한 기울기 계산은 한번만 수행할 수 있다. 하지만, 여러번 backward를 호출해야 할 경우에는 backward() 에 retrain_graph=Ture 인자를 전달해줘야 한다.
2. 기울기 추적 멈추기
requires_grad=True인 텐서들은 기본적으로 연산기록을 추적하고 기울기를 계산하게 된다. 하지만 모델학습을 완료한 후에는 기울기를 계산할 필요가 없다. 그때는 입력데이터를 적용하는 forward 연산만 필요하다. 그 경우에는 가중치를 갱신하는 부분을 with torch.no_grad() 하위 단에 포함시켜 기울기 연산 추적을 멈출수 있다.
기울기 추적을 멈춰야 하는 이유는 몇가지가 있다. 첫번째는, 사전학습된 신경망을 가져와 활용할때 Fine-tuning 단계를 거쳐야 하는데 이때 일부 파라미터를 고정하기 때문에 기울기 추적을 멈추어 고정값을 보존해야한다. 그리고 기울기를 추적하지 않는것이 연산량의 증가를 막기 때문에 forward 단계에서 속도가 향상된다.
z = torch.matmul(x, w)+b
print(z.requires_grad)
with torch.no_grad():
z = torch.matmul(x, w)+b
print(z.requires_grad)
Out:
위 코드 블럭의 윗부분은 연산을 추적하기 때문에 True를 반환하고 아래의 코드는 추적을 멈췄기 때문에 False를 반환한다.
이번 포스트는 파이토치의 AUTOGRAD에 대해 정리해보았다.
'AI' 카테고리의 다른 글
[파이토치] 모델 저장 및 불러오기 (1) | 2022.10.07 |
---|---|
[파이토치]최적화 (1) | 2022.10.06 |
[파이토치]신경망 구성 (0) | 2022.09.29 |
[논문리뷰]Conditional Generative Adversarial Nets(CGAN) (1) | 2022.09.23 |
[파이토치] Transform (1) | 2022.09.21 |
댓글