🤖 AI/ML

Deep Learning

딥러닝

다층 신경망 기반 머신러닝. CNN, RNN, Transformer가 대표적 아키텍처.

📖 상세 설명

딥러닝(Deep Learning)은 여러 층(layer)의 인공 신경망을 사용하여 데이터에서 복잡한 패턴을 학습하는 머신러닝의 한 분야입니다. "Deep"은 신경망의 깊이, 즉 은닉층(hidden layer)의 개수가 많다는 것을 의미하며, 일반적으로 3개 이상의 층을 가진 네트워크를 딥러닝이라 부릅니다.

딥러닝의 개념은 1940년대부터 존재했지만, 2012년 AlexNet이 ImageNet 대회에서 압도적인 성능을 보이면서 본격적인 부흥기를 맞이했습니다. GPU 연산 능력 향상, 빅데이터 확보, ReLU/Dropout 같은 학습 기법의 발전이 이를 가능하게 했습니다.

딥러닝은 입력층에서 받은 데이터를 여러 은닉층을 거치면서 점점 더 추상적인 특징(feature)으로 변환합니다. 각 층의 뉴런은 가중치(weight)와 활성화 함수를 통해 연산하고, 역전파(backpropagation) 알고리즘으로 오차를 최소화하는 방향으로 가중치를 업데이트합니다.

현재 딥러닝은 이미지 분류(CNN), 자연어 처리(Transformer), 음성 인식, 자율주행, 신약 개발 등 거의 모든 AI 분야의 핵심 기술입니다. GPT-4, Stable Diffusion, AlphaFold 같은 혁신적인 모델들이 모두 딥러닝 기반입니다.

💻 코드 예제

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# 간단한 딥러닝 모델 (3개의 은닉층)
class DeepNeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.layers = nn.Sequential(
            nn.Linear(28*28, 512),   # 입력층 → 은닉층1
            nn.ReLU(),
            nn.Dropout(0.2),
            nn.Linear(512, 256),      # 은닉층1 → 은닉층2
            nn.ReLU(),
            nn.Dropout(0.2),
            nn.Linear(256, 128),      # 은닉층2 → 은닉층3
            nn.ReLU(),
            nn.Linear(128, 10)        # 은닉층3 → 출력층
        )

    def forward(self, x):
        x = self.flatten(x)
        return self.layers(x)

# 데이터 로드 (MNIST)
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])
train_data = datasets.MNIST('./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)

# 모델, 손실함수, 옵티마이저 설정
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = DeepNeuralNetwork().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 학습 루프
for epoch in range(5):
    model.train()
    total_loss = 0
    for batch_x, batch_y in train_loader:
        batch_x, batch_y = batch_x.to(device), batch_y.to(device)

        optimizer.zero_grad()
        output = model(batch_x)
        loss = criterion(output, batch_y)
        loss.backward()          # 역전파
        optimizer.step()         # 가중치 업데이트
        total_loss += loss.item()

    print(f"Epoch {epoch+1}, Loss: {total_loss/len(train_loader):.4f}")

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"이 문제는 전통적인 ML로는 한계가 있습니다. 이미지에서 복잡한 패턴을 추출해야 하니까 CNN 기반 딥러닝 모델을 쓰고, 데이터가 부족하면 pretrained 모델로 transfer learning을 적용하죠."
💬 면접에서
"딥러닝은 feature engineering이 자동화된다는 점에서 전통적 ML과 차별됩니다. 하지만 데이터와 컴퓨팅 리소스가 많이 필요하고, 해석 가능성(interpretability)이 낮다는 단점이 있습니다."
💬 기술 토론에서
"요즘은 CNN이나 RNN보다 Transformer가 대세예요. 이미지도 ViT로 처리하고, 멀티모달도 Transformer 기반이죠. 다만 연산량이 많아서 FlashAttention 같은 최적화 기법이 필수입니다."

⚠️ 흔한 실수 & 주의사항

모든 문제에 딥러닝 적용

데이터가 1만 개 미만이거나, 테이블 데이터라면 XGBoost나 LightGBM이 더 좋은 성능을 낼 수 있습니다. 딥러닝은 만능이 아닙니다.

과적합(Overfitting) 무시

딥러닝은 파라미터가 많아 과적합에 취약합니다. Dropout, Early Stopping, Data Augmentation, Regularization을 반드시 적용하세요.

올바른 접근법

문제 정의 → 베이스라인(간단한 ML) → 딥러닝 순으로 진행하세요. Transfer Learning을 적극 활용하고, validation loss를 모니터링하여 과적합을 조기에 탐지하세요.

🔗 관련 용어

📚 더 배우기