머신러닝, 딥러닝 ML, DL/Pytorch

[Pytorch] Autograd, 자동 미분 ( requires_grad, backward(), 예시 )

킹남지 2021. 10. 2. 13:40
반응형

 

저번 포스팅에선 선형 회귀를 간단히 구현했습니다.

이미 우리는 선형 회귀를 구현할 때 파이토치에서 제공하는 자동 미분(Autograd) 기능을 수행했습니다.

( requiers_grad = True, backward() )

 

 

자동 미분(Autograd)

사용은 해봤지만 이번 포스팅에서는 자동 미분에 대해 좀 더 알아보겠습니다.

 

신경망을 학습할 때 가장 자주 사용되는 알고리즘은 역전파입니다.

역전파시 매개변수(모델의 가중치, 편향)는 해당 매개변수에 대한 손실 함수의 변화도(gradient)에 따라 조정됐습니다.

변화도를 계산하기 위해 파이토치에는 torch.autograd라고 불리는 자동 미분(Autograd) 엔진이 내장돼 있습니다.

 

예시 1

import torch

가장 먼저, $w^3 + 10$ 라는 식을 통해 w에 대해 미분을 진행해보겠습니다. 

 

가장 먼저 값이 3인 스칼라 텐서 w를 선언합니다.

선언 시, requires_grad = Ture 로 설정하면 이제 이 텐서에 대한 기울기를 저장하게 됩니다.

w = torch.tensor(3.0, requires_grad = True)

 

수식도 정의해줍니다.

y = w**3 + 10

 

수식에 대한 미분을 진행해봅시다. 이전에도 사용한 backward() 메서드를 호출합니다. 

y.backward()

 

기울기가 잘 계산됐는지 확인하겠습니다.

print(f'y를 w로 미분한 값 : {w.grad}')

[출력 결과]
y를 w로 미분한 값 : 27.0

위와 같이 w.grad를 출력하면 w에 대한 기울기를 확인할 수 있습니다.

 

w 값과 식을 바꿔서도 진행해보시길 바랍니다.

 

예시 2 

import torch
import torch.nn as nn

첫 예시에서 간단한 식을 통해 미분을 수행했습니다.

이번에는 입력, 출력 그리고 가중치, 편향, 손실함수를 모두 임의로 만들고, 자동 미분을 사용해보겠습니다.

 

입력, 출력, 가중치, 편향을 모두 임의로 만들어줍니다.

x = torch.ones(5)  # 입력
y = torch.zeros(3)  # 출력

w = torch.randn(5, 3, requires_grad=True) # 가중치
b = torch.randn(3, requires_grad=True) # 편향

 

식을 정의하고 손실 함수는 MSE 를 사용하겠습니다.

z = torch.matmul(x, w) + b
loss_fn = nn.MSELoss() # 손실 함수

 

손실함수 값을 계산하고, backward()를 호출해 기울기를 계산합니다.

loss = loss_fn(z, y)

loss.backward()

 

결과는 아래와 같습니다.

print(f'loss를 w로 미분한 값 :\n {w.grad}')
print(f'loss를 b로 미분한 값 : {b.grad}')

[출력 결과]
loss를 w로 미분한 값 :
 tensor([[0.0305, 0.4962, 2.3927],
        [0.0305, 0.4962, 2.3927],
        [0.0305, 0.4962, 2.3927],
        [0.0305, 0.4962, 2.3927],
        [0.0305, 0.4962, 2.3927]])
loss를 b로 미분한 값 : tensor([0.0305, 0.4962, 2.3927])

 

식, 가중치, 편향 등을 바꿔보면서 연습해보시길 바랍니다.

 

읽어주셔서 감사합니다.

반응형