Ch.8 PyTorch로 나만의 AI 만들기
nn.Module — 모델 설계도
모든 PyTorch 모델은 nn.Module로 시작한다
GPT도, BERT도, Llama도 — 내부적으로 nn.Module을 상속합니다. 이것이 PyTorch 모델의 '설계도' 패턴입니다.
모델의 '구조 정의'와 '실행'은 어떻게 분리되는가?
nn.Module — __init__에서 구조를 정의하고, forward에서 데이터 흐름을 구현합니다.
핵심 내용
__init__에서 부품을 등록하고 forward에서 조립합니다
nn.Module 패턴: class MyModel(nn.Module): def __init__(self): super().__init__() self.layer1 = nn.Linear(...) # 부품 등록 self.layer2 = nn.Linear(...) def forward(self, x): x = self.layer1(x) # 데이터 흐름 x = self.layer2(x) return x
nn.Module, nn.Linear, nn.Embedding, forward()
가장 간단한 nn.Module 모델을 만들어봅시다
💡 PyTorch는 로컬 환경에서 실행하세요 (pip install torch)
import torch
import torch.nn as nn
# === 간단한 모델 정의 ===
class SimpleModel(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super().__init__()
self.layer1 = nn.Linear(input_dim, hidden_dim)
self.relu = nn.ReLU()
self.layer2 = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
x = self.layer1(x) # 입력 → 은닉층
x = self.relu(x) # 활성화
x = self.layer2(x) # 은닉층 → 출력
return x
# 모델 생성
model = SimpleModel(input_dim=4, hidden_dim=8, output_dim=3)
# 파라미터 수 확인
total = sum(p.numel() for p in model.parameters())
print(f"모델 구조:\n{model}\n")
print(f"총 파라미터 수: {total:,}")
# 테스트 입력
x = torch.randn(2, 4) # 배치 2, 입력 4차원
output = model(x) # forward() 자동 호출
print(f"\n입력 크기: {x.shape}")
print(f"출력 크기: {output.shape}")실행 결과
PyTorch 없이 nn.Module 패턴을 순수 파이썬으로 만들어봅시다
import random
import math
# === 순수 파이썬 nn.Module 패턴 ===
class Linear:
"""nn.Linear 구현: y = x @ W + b"""
def __init__(self, in_f, out_f):
# 가중치 랜덤 초기화
self.W = [[random.gauss(0, 0.5) for _ in range(out_f)]
for _ in range(in_f)]
self.b = [0.0] * out_f
self.params = in_f * out_f + out_f
def forward(self, x):
out = [0.0] * len(self.W[0])
for j in range(len(out)):
for i in range(len(x)):
out[j] += x[i] * self.W[i][j]
out[j] += self.b[j]
return out
def relu(x):
return [max(0, v) for v in x]
class SimpleModel:
"""nn.Module 패턴: __init__ + forward"""
def __init__(self):
# __init__: 층 등록
self.layer1 = Linear(4, 8)
self.layer2 = Linear(8, 3)
def forward(self, x):
# forward: 데이터 흐름 정의
x = self.layer1.forward(x)
x = relu(x)
x = self.layer2.forward(x)
return x
def count_params(self):
return self.layer1.params + self.layer2.params
# 모델 생성 및 순전파
model = SimpleModel()
x = [1.0, 0.5, -0.3, 0.8] # 입력 (4차원)
output = model.forward(x)
print(f"입력: {x}")
print(f"출력 (3클래스): {[round(v, 4) for v in output]}")
print(f"파라미터 수: {model.count_params()}개")nn.Module(클래스)에서 데이터가 층을 통과하는 흐름을 정의하는 메서드는?
model(x)를 호출하면 forward(x)가 자동으로 실행된다.
nn.Linear(4, 8)의 파라미터 수는 총 몇 개인가요? (편향 포함)
다음 코드의 빈칸을 채우세요. class MyModel(nn.___): def __init__(self): super().__init__()
class MyModel(nn.___):
nn.Module에서 __init__()에 등록하지 않은 층은 model.parameters()에 포함되지 않는다.
nn.Module 마스터!
핵심 용어
**nn.Embedding**(vocab, dim)
토큰 ID → 벡터 (Ch3 임베딩)
**nn.Linear**(in, out)
행렬 곱 + 편향 (Ch4 행렬 연산)
**nn.ReLU**()
활성화 함수 (음수 → 0)
**nn.Softmax**()
확률 분포 변환 (소프트맥스)
정리 노트
nn.Module — PyTorch 모델의 설계도 패턴
nn.Module 구조
- __init__()
- 부품(층)을 등록하는 곳 — nn.Linear, nn.Embedding 등
- forward()
- 데이터가 층을 통과하는 흐름 정의 — 입력 → 출력
- model(x)
- 호출 시 forward(x)가 자동 실행 (__call__ 매직)
핵심 레이어
- nn.Embedding
- 토큰 ID → 벡터 변환 (어휘 크기 × 임베딩 차원)
- nn.Linear
- 행렬 곱 + 편향 — 파라미터 수 = in×out + out
- nn.ReLU
- 활성화 함수 — 음수를 0으로 변환하여 비선형성 추가
- nn.Softmax
- 출력을 확률 분포로 변환 (합=1)
GPT, BERT, Llama 모두 nn.Module을 상속하여 만든다 — 모든 PyTorch 모델의 기본 패턴
시각 자료
핵심 정리
- 1nn.Module = PyTorch 모델의 기본 설계도
- 2__init__에서 부품(층) 등록, forward에서 데이터 흐름 정의
- 3model(x) 호출 시 forward(x)가 자동 실행
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작