PyTorch를 활용해 딥러닝 모델을 개발할 때, 가장 핵심이 되는 과정은 학습 루프(Training Loop)를 구성하는 것입니다. PyTorch의 학습 과정은 크게 Forward(순전파), Backward(역전파), Optimization(최적화) 세 단계로 요약됩니다.
이번 포스팅에서는 각 단계의 기술적 원리와 함께, 실제 구현 시 주의해야 할 필수 코드 패턴을 정리해 보겠습니다.

1. Forward Pass (순전파): 데이터의 흐름
순전파는 입력 데이터($x$)가 모델의 각 층(Layer)을 통과하며 연산을 거쳐 최종 예측값($\hat{y}$)을 내놓는 과정입니다.
핵심 포인트:
- nn.Module을 상속받은 클래스에서 forward() 메소드를 정의합니다.
- 모델 객체를 함수처럼 호출하면(model(x)) 자동으로 forward()가 실행됩니다.
import torch
import torch.nn as nn
import torch.optim as optim
# 간단한 선형 회귀 모델 정의
class LinearRegressionModel(nn.Module):
def __init__(self):
super(LinearRegressionModel, self).__init__()
# 입력 1개 -> 출력 1개인 선형 변환층
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
model = LinearRegressionModel()
2. Backward Pass (역전파): 미분과 기울기 계산
역전파는 예측값과 실제값 사이의 오차(Loss)를 계산하고, 이 오차를 줄이기 위해 각 파라미터가 얼마나 변해야 하는지(Gradient, 기울기)를 구하는 과정입니다.
핵심 포인트:
- loss.backward()를 호출하면 PyTorch의 Autograd(자동 미분) 엔진이 체인 룰(Chain Rule)을 적용하여 기울기를 계산합니다.
- 이때 계산된 기울기는 각 파라미터의 .grad 속성에 저장됩니다.
# 손실 함수 정의 (평균 제곱 오차)
criterion = nn.MSELoss()
# 예제 데이터
x_train = torch.tensor([[1.0], [2.0], [3.0]], dtype=torch.float32)
y_train = torch.tensor([[2.0], [4.0], [6.0]], dtype=torch.float32)
# 1. 예측값 계산 (Forward)
outputs = model(x_train)
# 2. 손실 계산 (Loss Calculation)
loss = criterion(outputs, y_train)
# 3. 역전파 (Backward)
loss.backward()
3. Optimization (최적화): 가중치 업데이트
최적화는 역전파를 통해 구한 기울기를 바탕으로 모델의 가중치($W$, $b$)를 실제로 수정하는 단계입니다.
⚠️ 주의사항: optimizer.zero_grad()의 위치
PyTorch는 기본적으로 기울기를 누적(Accumulate)하는 성질이 있습니다. 따라서 새로운 배치(Batch) 학습을 시작하기 전에는 반드시 이전 단계의 기울기를 초기화해야 합니다.
# 옵티마이저 설정 (SGD 알고리즘 사용)
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 가중치 업데이트 실행
optimizer.step()
# 중요: 다음 루프를 위해 기울기 초기화
optimizer.zero_grad()
4. 전체 학습 루프 (Full Training Loop)
위의 단계들을 하나로 합친 표준 학습 코드입니다. 이 패턴은 딥러닝 모델 학습의 '템플릿'처럼 사용됩니다.
# 데이터 및 하이퍼파라미터 설정
num_epochs = 1000
model = LinearRegressionModel()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
for epoch in range(num_epochs):
# [1] 모델 예측 (Forward)
outputs = model(x_train)
loss = criterion(outputs, y_train)
# [2] 기울기 초기화 (Zero Gradient)
# 루프 시작 시점에 선언하는 것이 가장 안전합니다.
optimizer.zero_grad()
# [3] 가중치 기울기 계산 (Backward)
loss.backward()
# [4] 모델 파라미터 업데이트 (Step)
optimizer.step()
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
마치며: 요약 및 팁
| 단계 | 메서드 | 설명 |
| Forward | model(x) | 데이터를 입력하여 예측값 생성 |
| Loss | criterion(pred, y) | 예측값과 정답 간의 오차 측정 |
| Zero Grad | optimizer.zero_grad() | 이전 루프의 기울기 잔상 제거 |
| Backward | loss.backward() | 각 파라미터별 오차 기여도(기울기) 계산 |
| Step | optimizer.step() | 계산된 기울기로 실제 가중치 수정 |
PyTorch 학습의 핵심은 zero_grad() -> backward() -> step()으로 이어지는 이 메커니즘을 정확히 이해하는 것입니다. 이 순서가 바뀌거나 생략되면 학습이 전혀 이루어지지 않거나 잘못된 방향으로 흐를 수 있으니 유의하시기 바랍니다.
'Python for AI, Embedded > Deep Learning: PyTorch & AI Modeling' 카테고리의 다른 글
| PyTorch GPU(CUDA) 설정 및 사용법 완벽 가이드: 성능 10배 높이기 (0) | 2026.05.10 |
|---|---|
| PyTorch 모델 평가 및 시각화 완벽 가이드: matplotlib부터 TensorBoard까지 (0) | 2026.05.09 |
| PyTorch 옵티마이저(Optimizer) 완벽 정리: SGD vs Adam 개념부터 실습까지 (0) | 2026.05.07 |
| PyTorch 옵티마이저(Optimizer) 가이드: SGD와 Adam 차이점 및 실무 활용법 (0) | 2026.05.06 |
| PyTorch 활성화 함수와 손실 함수 완벽 가이드: Sigmoid부터 Cross-Entropy까지 (0) | 2026.05.05 |