딥러닝 파이토치 강좌, 지도 학습

딥러닝은 인공지능(AI)의 한 분야로, 다층 신경망을 사용하여 데이터로부터 패턴을 학습하는 기술입니다.
오늘은 이러한 딥러닝에서 가장 많이 사용되는 두 가지 학습 방법 중 하나인 지도 학습(Supervised Learning)에 대해 깊이 있는 강좌를 진행하겠습니다.

1. 지도 학습이란?

지도 학습은 주어진 데이터에 기반하여 예측 모델을 학습하는 방법입니다.
여기서 ‘지도’란 레이블이 있는 학습 데이터를 의미합니다.
지도 학습에서는 입력 데이터와 출력 레이블 간의 관계를 학습하여
새로운 데이터에 대한 예측을 할 수 있는 모델을 만들게 됩니다.

1.1 지도 학습의 유형

지도 학습은 크게 두 가지 유형으로 나눌 수 있습니다: 분류(Classification)와 회귀(Regression).

  • 분류(Classification): 주어진 입력 데이터가 특정 클래스에 속하는지를 예측합니다.
    예를 들어, 이메일이 스팸인지 아닌지 분류하는 작업이 이에 해당합니다.
  • 회귀(Regression): 입력 데이터에 대해 연속적인 수치 값을 예측합니다.
    예를 들어, 주택의 면적에 따라 가격을 예측하는 작업이 여기에 해당합니다.

2. PyTorch 소개

PyTorch는 페이스북이 개발한 오픈 소스 머신러닝 라이브러리로, 딥러닝 연구자와 개발자에게 유용한 다양한 기능을 제공합니다.
특히, 동적 계산 그래프(dynamic computation graph)를 지원하여,
모델을 쉽게 디버깅하고 수정할 수 있는 장점이 있습니다.

2.1 PyTorch 설치

PyTorch를 설치하려면 다음의 명령어를 사용할 수 있습니다.
아래 명령어는 pip를 이용하여 PyTorch를 설치하는 방법입니다:

pip install torch torchvision torchaudio

3. 딥러닝 모델 만들기

이제 PyTorch를 사용하여 간단한 딥러닝 모델을 만들어 보겠습니다.
이번 예제는 분류 문제를 다루며, 유명한 MNIST 데이터셋을 사용하여 손글씨 숫자를 분류하는 모델을 구축할 것입니다.
MNIST 데이터셋은 0부터 9까지의 숫자 이미지로 구성된 데이터셋입니다.

3.1 데이터셋 로딩

먼저 MNIST 데이터셋을 로딩하고, 이를 학습 및 테스트 데이터로 나누겠습니다.

import torch
from torchvision import datasets, transforms

# 데이터 변환 (정규화)
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))  # 평균 0.5, 표준편차 0.5로 정규화
])

# MNIST 데이터셋 다운로드 및 로딩
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)

train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

3.2 모델 정의

딥러닝 모델은 nn.Module을 상속받아 정의합니다. 여기서 간단한 신경망 모델을 정의해보겠습니다.

import torch.nn as nn
import torch.nn.functional as F

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)  # 첫 번째 층
        self.fc2 = nn.Linear(128, 64)       # 두 번째 층
        self.fc3 = nn.Linear(64, 10)        # 출력 층

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 2D 이미지를 1D 벡터로 변환
        x = F.relu(self.fc1(x))  # 활성화 함수 ReLU 적용
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 모델 인스턴스 생성
model = SimpleNN()

3.3 손실 함수 및 최적화기 정의

이제 손실 함수와 최적화기를 정의하겠습니다. 우리는 교차 엔트로피 손실 함수와 Adam 최적화기를 사용하겠습니다.

import torch.optim as optim

# 손실 함수
criterion = nn.CrossEntropyLoss()
# 최적화기
optimizer = optim.Adam(model.parameters(), lr=0.001)

3.4 모델 훈련

이제 모델을 학습시킬 시간입니다. 각 에폭(epoch)마다 데이터를 반복적으로 모델에 통과시키고,
손실을 계산하여 가중치를 업데이트합니다.

num_epochs = 5

for epoch in range(num_epochs):
    for images, labels in train_loader:
        # 기울기 초기화
        optimizer.zero_grad()
        # 모델에 이미지 통과
        outputs = model(images)
        # 손실 계산
        loss = criterion(outputs, labels)
        # 역전파
        loss.backward()
        # 가중치 업데이트
        optimizer.step()
    
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

3.5 모델 평가

학습이 완료되면, 테스트 데이터를 사용하여 모델을 평가해보겠습니다.

correct = 0
total = 0

with torch.no_grad():  # 기울기 계산 비활성화
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)  # 가장 큰 값의 인덱스 추출
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the model on the test images: {100 * correct / total:.2f}%')

4. 결론

이번 강좌에서는 PyTorch를 사용하여 기본적인 딥러닝 모델을 구축하고,
MNIST 데이터셋을 통해 분류 문제를 해결하는 방법을 배웠습니다.
지도 학습을 활용한 이 접근법은 다양한 응용 분야에 응용될 수 있으며,
더 복잡한 모델로 발전시킬 수 있습니다.

4.1 추가 학습 자료

더 깊이 있는 딥러닝을 배우고 싶다면 다음의 자료를 참고해 보세요:

딥러닝은 방대한 연구 분야로, 지속적인 학습이 필요합니다.
여러분의 딥러닝 여정에 도움이 되길 바랍니다!