본문 바로가기
C.W.K.
Stream
Lesson 07 of 08 · published

순전파

~22 min · forward, shapes, autograd

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

순전파는 실제로 무슨 일을 할까

순전파는 입력 데이터 x를 모든 층에 차례로 통과시켜 출력 y를 만드는 과정이야. 출력은 로짓이나 확률, 임베딩처럼 헤드가 반환하는 어떤 값이든 될 수 있어. 이 과정에서 PyTorch는 모든 연산을 연산 그래프에 기록해 두고, 나중에 역전파가 기울기를 계산할 수 있게 해. 직접 작성한 forward() 메서드가 정확히 해야 할 일은 이것뿐이야.

forward()model(x)를 실행하면 자동으로 호출돼. 절대 model.forward(x)를 직접 호출하지 마. 정규화 모드, 기울기 추적, DDP 동기화 같은 훅을 건너뛰게 돼.

팁: forward()를 작성할 때는 모든 중간 텐서의 형태를 해당 줄 옆에 적어 둬. 나중의 나와 이 모델을 디버깅할 다음 사람이 고마워할 거야.

학습 모드와 평가 모드

일부 층은 학습할 때와 평가할 때 다르게 동작해. 드롭아웃은 학습 중에는 활성화되고 평가 중에는 입력을 그대로 통과시켜. 배치 정규화는 학습 중에는 배치 통계를, 평가 중에는 누적 통계를 사용해. model.train()model.eval()로 두 모드를 전환할 수 있어. 검증할 때 eval()을 잊으면 지표에 잡음이 생기는 유명한 버그가 발생해. 학습 루프를 살펴볼 때 다시 다룰 거야.

기울기가 필요 없으면 기록도 멈춰

추론하거나 전이 학습에서 백본을 동결했다면 순전파 호출을 torch.no_grad()로 감싸 줘. 현재 가장 빠른 경로인 torch.inference_mode()를 사용해도 돼. 그러면 PyTorch가 연산 그래프를 만들지 않아서 그래프에 묶일 메모리도 아낄 수 있어.

원칙: 순전파에서 기억할 건 3가지야. .forward()를 직접 부르지 말고 모델을 호출해. 추론할 때는 eval()로 전환하고, 기울기가 필요 없을 때는 inference_mode()를 사용해.

Code

텐서 크기를 명시한 전체 순전파·python
import torch, torch.nn as nn

class TinyVisionMLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.fc1 = nn.Linear(28 * 28, 256)
        self.act = nn.ReLU()
        self.dropout = nn.Dropout(p=0.1)
        self.fc2 = nn.Linear(256, 10)
    def forward(self, x):              # x:    [B, 1, 28, 28]
        x = self.flatten(x)            # x:    [B, 784]
        x = self.act(self.fc1(x))      # x:    [B, 256]
        x = self.dropout(x)            # x:    [B, 256]
        return self.fc2(x)             # logits: [B, 10]

model = TinyVisionMLP()
batch = torch.randn(32, 1, 28, 28)

model.train()
logits_train = model(batch)

model.eval()
with torch.inference_mode():
    logits_eval = model(batch)

print(logits_train.shape, logits_eval.shape)

External links

Exercise

CIFAR-10을 분류하는 3층 MLP의 순전파를 작성해. 입력 형태는 [B, 3, 32, 32], 출력 형태는 [B, 10]이어야 해. 모든 중간 텐서의 형태를 주석에 표시해. 모델을 학습 모드와 평가 모드로 전환하면서 드롭아웃이 모드에 따라 다르게 동작하는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.