Skip to main content
Summary

이 장에서 배울 것

이번 장에서는 지금까지 배운 내용을 하나의 작은 프로젝트로 묶는다. 신경망 구조를 설명하고, 손실을 계산하고, 역전파로 가중치를 업데이트하는 것만으로는 아직 충분하지 않다. 딥러닝을 이해했다는 가장 좋은 증거는 작은 문제를 끝까지 해결해 보는 것이다.

이 장의 목표는 다음과 같다.

  • 문제 정의서를 작성한다.

  • 데이터를 학습·검증·테스트로 나눈다.

  • 베이스라인 모델과 딥러닝 모델을 비교한다.

  • PyTorch 학습 루프를 재사용한다.

  • 정확도뿐 아니라 오류 사례를 분석한다.

  • 실행 가능한 노트북과 짧은 리포트를 완성한다.

프로젝트는 작아야 한다. 작아야 끝낼 수 있고, 끝내야 배운 것이 남는다.

딥러닝 미니 프로젝트

왜 이 주제가 중요한가

딥러닝 프로젝트는 "모델을 하나 학습시켰다"에서 끝나지 않는다. 실제 흐름은 문제 정의, 데이터 준비, 모델 선택, 학습, 평가, 오류 분석, 개선, 기록으로 이어진다. 구글의 ML 개발 단계 설명에서도 ML 프로젝트는 아이디어와 계획, 실험, 파이프라인 구축, 생산화처럼 여러 단계로 나뉜다고 설명한다1. 입문 단계에서는 생산화까지 깊게 다루지 않지만, 최소한 실험이 재현 가능해야 한다.

재현 가능하다는 말은 같은 코드와 같은 데이터, 같은 설정으로 다시 실행했을 때 비슷한 결과가 나온다는 뜻이다. 딥러닝은 무작위 초기화, 데이터 섞기, GPU 연산 차이 때문에 결과가 조금씩 달라질 수 있다. 그래서 시드, 데이터 분할 방식, 모델 구조, 학습률, 배치 크기, 에폭 수를 기록해야 한다.

이번 장에서 중요한 것은 최고 정확도가 아니다. 더 중요한 것은 "왜 이 문제를 골랐는가", "어떤 기준으로 성공을 판단했는가", "모델이 어디서 틀렸는가", "다음 실험은 무엇인가"를 설명하는 능력이다.

핵심 개념 설명

1. 주제는 작고 완결 가능하게 고른다

초보자에게 적합한 주제는 다음 네 가지다.

주제입력예측 대상추천 모델
MNIST 숫자 분류손글씨 숫자 이미지0~9 숫자MLP 또는 CNN
FashionMNIST 분류의류 이미지10개 의류 클래스CNN
CIFAR-10 분류작은 컬러 이미지10개 사물 클래스CNN
한국어 감성 분류리뷰 문장긍정/부정간단한 RNN 또는 사전학습 모델 활용

초보자용 PyTorch 프로젝트 목록에서도 MNIST, CIFAR-10, 전이학습, 감성 분류 같은 작고 명확한 과제가 반복적으로 추천된다2. 생성 모델, 객체 탐지, 대형 Transformer 학습은 흥미롭지만 이번 미니 프로젝트의 범위를 넘기 쉽다. 이 장에서는 "끝까지 완성"을 우선한다.

2. 문제 정의서부터 쓴다

코드를 쓰기 전에 아래 네 문장을 채운다.

내 프로젝트는 ________ 데이터를 입력으로 받아 ________을 예측한다.
이 문제는 ________ 분류/회귀 문제다.
성공 기준은 검증 또는 테스트 데이터에서 ________ 지표가 ________ 이상/이하인 것이다.
모델이 틀린 사례를 최소 ________개 이상 확인하고 원인을 분류한다.

예를 들어 FashionMNIST 프로젝트라면 이렇게 쓸 수 있다.

내 프로젝트는 28×28 흑백 의류 이미지를 입력으로 받아 10개 의류 클래스를 예측한다.
이 문제는 다중 클래스 분류 문제다.
성공 기준은 테스트 정확도 88% 이상이며, 클래스별 성능을 함께 확인한다.
모델이 틀린 이미지 30개 이상을 확인하고 비슷한 의류끼리 혼동하는지 분석한다.

좋은 문제 정의는 이후 결정을 쉽게 만든다. 손실 함수는 CrossEntropyLoss를 쓰면 되고, 평가지표는 정확도와 클래스별 성능을 보면 된다. 출력층의 뉴런 수는 클래스 수인 10개가 된다.

3. 베이스라인을 먼저 만든다

베이스라인은 비교 기준이 되는 단순한 모델이다. 예를 들어 이미지 분류에서는 다음 순서가 좋다.

  1. 무작위 예측 또는 가장 많은 클래스만 예측하는 기준

  2. 전통 ML 모델: 로지스틱 회귀, 랜덤 포레스트 등

  3. 간단한 MLP

  4. 간단한 CNN

딥러닝 모델이 전통 ML보다 항상 좋은 것은 아니다. 데이터가 작거나 특성이 단순하면 전통 ML이 더 빠르고 충분히 좋을 수 있다. 반대로 이미지처럼 공간 패턴이 중요한 데이터에서는 CNN이 더 좋은 결과를 내는 경우가 많다.

4. 실험 기록표를 남긴다

실험은 기억에 의존하면 안 된다. 아래 표를 노트북이나 리포트에 남긴다.

실험모델주요 설정검증 성능테스트 성능관찰
1MLPlr=0.001, epoch=50.860.85신발/샌들 혼동
2CNNlr=0.001, epoch=50.900.89전체 개선
3CNN+Dropoutp=0.3, epoch=80.910.90과적합 감소

실험은 3~5회면 충분하다. 너무 많은 실험을 하면 분석보다 숫자 맞추기에 빠진다.

쉬운 비유 또는 사례

딥러닝 미니 프로젝트는 요리 대회가 아니라 조리 실습에 가깝다. 처음부터 새로운 요리를 발명할 필요는 없다. 정해진 재료를 준비하고, 조리 순서를 지키고, 맛을 보고, 어디가 부족했는지 기록하면 된다.

여기서 데이터는 재료다. 모델은 조리법이다. 손실 함수는 맛을 평가하는 기준이다. 옵티마이저는 다음 조리에서 소금과 불 조절을 바꾸는 과정이다. 평가와 오류 분석은 완성된 음식을 먹어 보고 "왜 짰는지", "왜 덜 익었는지"를 찾는 일이다.

좋은 프로젝트는 화려한 모델보다 이 흐름이 분명하다.

직접 해보는 실습

아래는 FashionMNIST 또는 CIFAR-10 이미지 분류 프로젝트를 기준으로 한 진행 순서다. 공개 Colab이나 주피터 노트북처럼 셀 단위 실행 결과가 남는 형태를 권장한다. PyTorch 미니 프로젝트 저장소들도 Colab 노트북 형태로 실험을 제공하는 경우가 많다3.

1단계: 환경과 시드 고정

import random
import numpy as np
import torch

seed = 42
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)

device = "cuda" if torch.cuda.is_available() else "cpu"
print(device)

2단계: Dataset과 DataLoader 준비

from torchvision import datasets, transforms
from torch.utils.data import DataLoader, random_split

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

full_train = datasets.FashionMNIST(
    root="data", train=True, download=True, transform=transform
)
test_ds = datasets.FashionMNIST(
    root="data", train=False, download=True, transform=transform
)

train_size = int(len(full_train) * 0.8)
val_size = len(full_train) - train_size
train_ds, val_ds = random_split(full_train, [train_size, val_size])

train_loader = DataLoader(train_ds, batch_size=64, shuffle=True)
val_loader = DataLoader(val_ds, batch_size=64, shuffle=False)
test_loader = DataLoader(test_ds, batch_size=64, shuffle=False)

3단계: 간단한 CNN 정의

import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super().__init__()
        self.features = nn.Sequential(
            nn.Conv2d(1, 16, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Conv2d(16, 32, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
        )
        self.classifier = nn.Sequential(
            nn.Flatten(),
            nn.Linear(32 * 7 * 7, 128),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(128, 10)
        )

    def forward(self, x):
        x = self.features(x)
        return self.classifier(x)

4단계: 학습 루프 작성

model = SimpleCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

for epoch in range(5):
    model.train()
    train_loss = 0

    for x, y in train_loader:
        x, y = x.to(device), y.to(device)

        optimizer.zero_grad()
        pred = model(x)
        loss = criterion(pred, y)
        loss.backward()
        optimizer.step()

        train_loss += loss.item()

    model.eval()
    correct, total = 0, 0
    with torch.no_grad():
        for x, y in val_loader:
            x, y = x.to(device), y.to(device)
            pred = model(x)
            label = pred.argmax(dim=1)
            correct += (label == y).sum().item()
            total += y.size(0)

    val_acc = correct / total
    print(f"epoch={epoch+1}, loss={train_loss/len(train_loader):.4f}, val_acc={val_acc:.4f}")

이 코드는 이 책에서 배운 핵심 흐름을 모두 포함한다. 입력 텐서가 모델을 통과하고, 손실이 계산되고, backward()로 기울기가 구해지고, optimizer.step()으로 가중치가 업데이트된다.

흔한 실수와 오류 분석

실수 1. 테스트 세트를 여러 번 보며 모델을 고른다

테스트 세트는 최종 확인용이다. 모델 선택과 하이퍼파라미터 조정은 검증 세트로 해야 한다. 테스트 세트를 계속 보면 모델이 테스트 세트에 맞춰진다. 그러면 실제 새 데이터에서 성능이 떨어질 수 있다.

실수 2. 정확도 하나만 보고 끝낸다

정확도는 전체 정답 비율이다. 하지만 어떤 클래스에서 틀리는지 알려 주지는 않는다. 그래서 confusion matrix, 클래스별 precision·recall, 오분류 사례를 함께 봐야 한다.

예를 들어 FashionMNIST에서 셔츠와 티셔츠를 자주 혼동한다면 모델 문제가 아니라 데이터 자체가 어려운 것일 수 있다. CIFAR-10에서 고양이와 개를 자주 혼동한다면 배경, 자세, 해상도가 영향을 줄 수 있다.

실수 3. 오류 사례를 직접 보지 않는다

오류 분석은 모델이 틀린 샘플을 직접 확인하고 원인을 분류하는 과정이다. 작은 프로젝트에서는 오분류 30~100개만 봐도 다음 개선 방향이 보인다. 오류 원인이 "라벨 오류", "이미지가 흐림", "클래스가 서로 비슷함", "데이터가 부족함" 중 어디에 가까운지 표시한다. 이런 수작업 분석은 다음 실험의 우선순위를 정하는 데 도움이 된다4.

오류 분석표는 다음처럼 작성한다.

번호실제예측원인 추정조치
1ShirtT-shirt클래스 유사더 많은 예시 확인
2SneakerSandal이미지 흐림전처리 검토
3CoatPullover라벨 애매함라벨 오류 후보

실수 4. 너무 큰 주제를 고른다

"나만의 챗봇 만들기", "의료 영상 진단 시스템", "자율주행 객체 탐지"는 좋은 주제처럼 보이지만 입문 미니 프로젝트로는 크다. 데이터 확보, 평가, 윤리, 배포까지 난도가 급격히 올라간다. 이번 프로젝트에서는 작은 공개 데이터와 단순한 모델로 제한한다.

최종 산출물

프로젝트 제출물은 다음 다섯 가지로 구성한다.

  1. 실행 가능한 코드 노트북
    위에서 아래로 실행했을 때 데이터 준비, 학습, 평가가 재현되어야 한다.

  2. 문제 정의서
    입력, 예측 대상, 문제 유형, 성공 기준, 평가 지표를 명시한다.

  3. 실험 결과표
    최소 3회, 최대 5회 정도의 실험을 기록한다.

  4. 오류 분석 리포트
    confusion matrix, 클래스별 성능, 오분류 사례를 포함한다.

  5. 재현 방법과 AI 사용 로그
    실행 환경, 주요 라이브러리 버전, 시드, 데이터 출처, AI 도구를 사용했다면 어떤 도움을 받았고 어떻게 검증했는지 적는다.

AI 도구를 사용해도 된다. 다만 코드를 그대로 믿으면 안 된다. 오류 메시지를 확인하고, 출력 shape을 점검하고, 학습 곡선이 이상하지 않은지 직접 검증해야 한다.

요약

딥러닝 미니 프로젝트의 핵심은 작게 시작해 끝까지 완성하는 것이다. 문제를 명확히 정의하고, 데이터를 나누고, 베이스라인을 세우고, PyTorch 학습 루프를 구현한다. 그다음 정확도만 보지 말고 모델이 틀린 사례를 직접 확인한다.

좋은 프로젝트는 높은 숫자 하나로 설명되지 않는다. 문제 정의부터 실험 기록, 오류 분석, 회고까지 일관된 흐름이 있어야 한다. 이 흐름을 경험하면 이후 더 큰 딥러닝 문제를 만났을 때도 어디서부터 시작해야 할지 알 수 있다.

퀴즈

  1. 딥러닝 미니 프로젝트에서 문제 정의서에 반드시 들어가야 할 네 가지는 무엇인가?

  2. 검증 세트와 테스트 세트의 역할은 어떻게 다른가?

  3. 베이스라인 모델을 먼저 만드는 이유는 무엇인가?

  4. 정확도만으로 모델을 평가하면 놓칠 수 있는 문제는 무엇인가?

  5. 오류 분석에서 오분류 사례를 직접 확인해야 하는 이유는 무엇인가?

체크리스트

  • 프로젝트 주제를 작고 명확하게 정했다.

  • 입력 데이터, 예측 대상, 성공 기준, 평가 지표를 적었다.

  • 학습·검증·테스트 데이터를 분리했다.

  • 무작위 시드와 실행 환경을 기록했다.

  • 베이스라인 모델과 딥러닝 모델을 비교했다.

  • 학습 곡선과 검증 성능을 확인했다.

  • confusion matrix 또는 클래스별 성능을 확인했다.

  • 오분류 사례를 직접 보고 원인을 분류했다.

  • 실험 결과표와 짧은 회고를 작성했다.

  • 코드 노트북이 처음부터 끝까지 다시 실행된다.

다음 권 연결

이번 권에서는 신경망, CNN, 시퀀스 모델, Attention, Transformer, 전이학습과 생성모델의 기본 흐름을 배웠다. 마지막으로 미니 프로젝트를 통해 이 지식을 하나의 실험으로 묶었다.

다음 권에서는 더 큰 데이터와 더 복잡한 모델을 다룰 준비를 한다. 단순히 모델을 학습하는 것을 넘어, 실험을 관리하고, 성능을 안정적으로 개선하고, 실제 서비스 환경에서 모델을 어떻게 다루는지 살펴보게 된다. 그때도 출발점은 같다. 문제를 작게 정의하고, 데이터를 확인하고, 실험을 기록하는 것이다.

참고

1Google Developers - ML 개발 단계

2Best PyTorch Project Ideas for Beginners

4ML Strategy 2-1 (Error Analysis, Data mismatched)

책 목록

AI 교육 3권 : 딥러닝 핵심: 입력에서 업데이트까지, 신경망을 제대로 이해하는 법

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기