신경망 학습에서 가장 널리 사용되는 역전파 알고리즘은 매개변수(가중치)를 손실 함수의 기울기에 따라 조정합니다. PyTorch는 이러한 기울기 계산을 위해 torch.autograd 자동 미분 엔진을 제공하며, 임의의 계산 그래프에 대한 미분을 지원합니다.
계산 그래프 구성 예제
import torch
inputs = torch.ones(4) # 입력 텐서
targets = torch.zeros(2) # 예측 출력
weights = torch.randn(4, 2, requires_grad=True)
bias = torch.randn(2, requires_grad=True)
# 순전파 계산
output = inputs @ weights + bias
loss = torch.nn.functional.mse_loss(output, targets) # 평균 제곱 오차
텐서, 연산, 계산 그래프
위 코드는 다음과 같은 계산 그래프를 생성합니다. requires_grad=True로 설정된 텐서는 기울기 추적을 활성화합니다. 텐서에 적용된 모든 연산은 Function 객체로 구현되어 순전파와 역전파 함수를 포함합니다.
print('Output의 grad_fn:', output.grad_fn)
print('Loss의 grad_fn:', loss.grad_fn)
# 출력 예시:
# Output의 grad_fn: <AddBackward0>
# Loss의 grad_fn: <MseLossBackward0>
기울기 계산 방법
매개변수 가중치의 기울기를 계산하려면 backward() 메서드를 호출합니다:
loss.backward()
print(weights.grad) # ∂loss/∂weights
print(bias.grad) # ∂loss/∂bias
# 출력 예시:
# tensor([[0.12, 0.34], [0.12, 0.34], [0.12, 0.34], [0.12, 0.34]])
# tensor([0.12, 0.34])
주의: requires_grad=True인 리프 노드에서만 .grad 속성을 가집니다. 동일 그래프에서 여러 번 역전파를 수행할 때는 backward(retain_graph=True)를 사용합니다.
기울기 추적 비활성화
추론 시에는 기울기 추적이 불필요합니다. torch.no_grad() 컨텍스트나 detach()로 계산 추적을 중지할 수 있습니다:
with torch.no_grad():
inference_output = inputs @ weights + bias
print(inference_output.requires_grad) # False
detached_output = output.detach()
print(detached_output.requires_grad) # False
이 기법은 미세 조정 시 고정 파라미터 지정이나 순전파 성능 최적화에 활용됩니다.
동적 계산 그래프의 특징
PyTorch의 계산 그래프는 방향성 비순환 그래프(DAG)로 구성됩니다. 리프 노드는 입력 텐서, 루트 노드는 출력 텐서이며, 연쇄 법칙을 통해 기울기를 자동 계산합니다. 주목할 점은 PyTorch의 그래프가 동적이라는 것입니다. 각 .backward() 호출 시 새로운 그래프가 생성되므로, 반복마다 다른 연산과 텐서 형태를 사용할 수 있습니다.