저번 포스팅에선 선형 회귀를 간단히 구현했습니다.
이미 우리는 선형 회귀를 구현할 때 파이토치에서 제공하는 자동 미분(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])
식, 가중치, 편향 등을 바꿔보면서 연습해보시길 바랍니다.
읽어주셔서 감사합니다.
'머신러닝, 딥러닝 ML, DL > Pytorch' 카테고리의 다른 글
[Pytorch] 파이토치, 선형 회귀(Linear Regression) 간단히 구현해보기 (2) | 2021.09.24 |
---|---|
[Pytorch] 파이토치, 텐서(Tensor)란 (텐서 속성, 텐서 초기화) (0) | 2021.09.24 |
[Pytorch] 파이토치로 GAN(Generative Adversarial Net) 구현하고 MNIST 손글씨 이미지 생성하기 (0) | 2021.06.30 |