이것저것 기록

[DL, PyTorch] Autograd: 자동 미분 본문

Data Science/ML & DL

[DL, PyTorch] Autograd: 자동 미분

anweh 2020. 10. 13. 20:45

 

PyTorch에는 Autograd라는 기특한 패키지가 있다. 

깃헙에서 딥러닝 코드들을 보다보면 .requires_grad=True 라는 코드를 엄청 자주 보게 되는데, 이게 바로 Autograd라는 패키지와 연관이 있는 코드이다. 

이 패키지는 Tensor의 모든 연산에 대해 자동 미분을 제공한다.

 

torch.Tensor는 패키지에서 가장 중심이 되는 클래스이다. 

텐서의 속성 중 하나인 .requires_grad=True로 세팅하면 텐서의 모든 연산에 대해 추적을 시작한다.

계산 작업이 모두 수행되면 .backward()를 호출해서 모든 gradients를 자동으로 계산할 수 있다. 

gradients들은 .grad 속성에 누적되어 저장된다. 

 

Autograd 패키지의 동작 원리를 자세히 이해하고 싶으면 다음 링크의 영상들을 추천! 


 

1. 예제 함수

 

데이터의 평균을 구하는 함수를 예제 함수로 사용! 

 

 

 

 

2. 텐서(데이터) 및 함수 선언 

import torch
from torch.autograd import Variable


# 텐서 선언
torch.random.manual_seed(1234)
data = torch.rand(10) * 10
print('data: {}'.format(data))
beta = torch.rand(1, requires_grad=True)
print('beta: {}'.format(beta))

#함수 선언
y = torch.mean((data - beta)**2)
print()

data변수에 위와 같이 텐서를 선언해줬다. 

.manual_seed()는 변수를 무작위로 설정하되, 몇 번을 반복해도 똑같은 무작위 변수를 설정하게 해주는 코드 같은 거다.

분명히 random 설정했는데 (1234)를 넣어서 몇 번을 재실행 해도 똑같은 수가 할당됨을 확인할 수 있다. 

나는 베타에 대한 그레디언트를 구하고 싶기 때문에 requires=True 라고 설정했다.

베타에 기울기 추적 옵션을 달아준 셈인데, 이렇게 하면 베타와 관련되어 생성되는 모든 텐서에 기울기 추적 옵션인 grad_fn 태그가 달려서 생성된다.

예를 들어, 함수 y는 베타를 이용해 생성됐기 때문에 y에도 역시 grad_fn이 붙어서 생성된다. 

 

 

3. 기울기값 계산

기울기값을 계산하기 위해 해야하는 일은 기울기 계산을 활성화 시켜주면 된다.

y에 대한 베타의 기울기값을 구하는 것이니까 다음과 같이 .backward()를 써서 역전파를 실행해주면 된다. 

# auto grad
y.backward()
print('beta.grad.item(): {}'.format(beta.grad.item()))

 

 

참고 링크

Comments