Training
훈련 / 학습
모델이 데이터에서 학습하는 과정. 추론(Inference)과 대비되며, AI 개발의 핵심 단계입니다.
훈련 / 학습
모델이 데이터에서 학습하는 과정. 추론(Inference)과 대비되며, AI 개발의 핵심 단계입니다.
Training(훈련)은 머신러닝 모델이 데이터로부터 패턴을 학습하여 가중치(weight)를 조정하는 과정입니다. 모델은 입력 데이터와 정답(레이블)을 비교하며 손실(loss)을 최소화하는 방향으로 파라미터를 업데이트합니다. 이는 추론(Inference) 단계와 대비되는 개념입니다.
딥러닝 훈련은 역전파(Backpropagation) 알고리즘을 통해 이루어집니다. 1986년 Rumelhart, Hinton, Williams가 제안한 이 방법은 출력층에서 입력층 방향으로 오차를 전파하며 각 가중치의 기울기를 계산합니다. 이후 SGD, Adam 등의 옵티마이저가 이 기울기를 활용해 가중치를 업데이트합니다.
훈련은 Pre-training(사전 학습)과 Fine-tuning(미세 조정)으로 나뉩니다. GPT, BERT 같은 대형 모델은 먼저 대규모 데이터로 사전 학습을 진행한 후, 특정 태스크에 맞게 미세 조정합니다. 이러한 2단계 접근법이 현대 AI의 표준이 되었습니다.
실무에서 훈련은 GPU/TPU 같은 하드웨어 자원, 대규모 데이터셋, 하이퍼파라미터 튜닝 등 복합적인 요소를 고려해야 합니다. GPT-4 수준의 모델 훈련에는 수천 개의 GPU와 수백만 달러의 비용이 소요되며, 이를 효율화하기 위한 분산 학습, 혼합 정밀도 학습 등의 기법이 활발히 연구되고 있습니다.
PyTorch를 사용한 기본 Training Loop 예제입니다.
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
# 간단한 신경망 정의
class SimpleNN(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(hidden_dim, output_dim)
)
def forward(self, x):
return self.layers(x)
# 데이터 준비 (예시)
X = torch.randn(1000, 10) # 1000개 샘플, 10개 특성
y = torch.randint(0, 2, (1000,)) # 이진 분류
dataset = TensorDataset(X, y)
train_loader = DataLoader(dataset, batch_size=32, shuffle=True)
# 모델, 손실함수, 옵티마이저 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleNN(input_dim=10, hidden_dim=64, output_dim=2).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# Training Loop
num_epochs = 10
for epoch in range(num_epochs):
model.train() # 훈련 모드
total_loss = 0
correct = 0
for batch_X, batch_y in train_loader:
batch_X, batch_y = batch_X.to(device), batch_y.to(device)
# Forward pass
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
# Backward pass
optimizer.zero_grad() # 기울기 초기화
loss.backward() # 역전파
optimizer.step() # 가중치 업데이트
total_loss += loss.item()
correct += (outputs.argmax(dim=1) == batch_y).sum().item()
accuracy = correct / len(dataset) * 100
print(f"Epoch [{epoch+1}/{num_epochs}] "
f"Loss: {total_loss/len(train_loader):.4f} "
f"Accuracy: {accuracy:.2f}%")
# 모델 저장
torch.save(model.state_dict(), "model.pth")
print("Training complete! Model saved.")
Training loss만 낮아지고 Validation loss가 올라가는 신호를 무시하면 일반화 성능이 떨어집니다. Early stopping을 사용하세요.
너무 크면 발산하고, 너무 작으면 수렴이 느립니다. Learning rate scheduler나 warmup을 활용하세요.
Train/Val/Test 분리, 체크포인트 저장, 실험 로깅(WandB, TensorBoard), 재현성을 위한 시드 고정을 기본으로 하세요.