Ch.8 PyTorch로 나만의 AI 만들기

nn.Module — 모델 설계도

nn.Module을 상속하여 신경망 모델을 정의한다__init__과 forward 메서드의 역할을 이해한다nn.Embedding과 nn.Linear의 용도를 구분한다

모든 PyTorch 모델은 nn.Module로 시작한다

GPT도, BERT도, Llama도 — 내부적으로 nn.Module을 상속합니다. 이것이 PyTorch 모델의 '설계도' 패턴입니다.

모델의 '구조 정의'와 '실행'은 어떻게 분리되는가?

nn.Module — __init__에서 구조를 정의하고, forward에서 데이터 흐름을 구현합니다.


article

핵심 내용

__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 마스터!

key

핵심 용어

🔤

**nn.Embedding**(vocab, dim)

토큰 ID → 벡터 (Ch3 임베딩)

📐

**nn.Linear**(in, out)

행렬 곱 + 편향 (Ch4 행렬 연산)

**nn.ReLU**()

활성화 함수 (음수 → 0)

📊

**nn.Softmax**()

확률 분포 변환 (소프트맥스)

edit_note

정리 노트

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 모델의 기본 패턴

image

시각 자료

다이어그램: py-scene-nn-module
check_circle

핵심 정리

  • 1nn.Module = PyTorch 모델의 기본 설계도
  • 2__init__에서 부품(층) 등록, forward에서 데이터 흐름 정의
  • 3model(x) 호출 시 forward(x)가 자동 실행

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작