🤖 AI/ML

Autoencoder

오토인코더

입력을 압축했다 복원하는 신경망. 차원 축소, 이상 탐지, 생성 모델에 활용.

📖 상세 설명

Autoencoder(오토인코더)는 입력 데이터를 저차원 잠재 공간(latent space)으로 압축한 뒤 다시 원본으로 복원하도록 학습하는 비지도 학습 신경망입니다. 인코더가 입력을 압축하고, 디코더가 이를 복원하는 대칭 구조를 가집니다.

1986년 Rumelhart가 처음 제안했으며, 2006년 Hinton의 Deep Belief Networks 연구와 함께 딥러닝 부활의 핵심 기술로 주목받았습니다. 이후 VAE(2013), NVAE(2020) 등 다양한 변형이 생성 모델 분야를 발전시켰습니다.

핵심 원리는 병목(bottleneck) 구조입니다. 잠재 공간의 차원이 입력보다 작으므로 네트워크는 데이터의 본질적인 특성만 보존하도록 학습합니다. 복원 오차(reconstruction loss)를 최소화하는 방향으로 훈련되며, 이 과정에서 의미 있는 표현을 자동으로 학습합니다.

실무에서는 이상 탐지(정상 데이터로만 학습 후 복원 오차가 큰 샘플을 이상치로 판별), 노이즈 제거(Denoising AE), 차원 축소(PCA의 비선형 확장), 생성 모델(VAE)에 광범위하게 활용됩니다. 제조업 불량 탐지부터 금융 사기 탐지까지 적용 범위가 넓습니다.

💻 코드 예제

# PyTorch로 이상 탐지용 Autoencoder 구현
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset

class Autoencoder(nn.Module):
    def __init__(self, input_dim, latent_dim=32):
        super().__init__()
        # 인코더: 입력 -> 잠재 공간
        self.encoder = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.ReLU(),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.Linear(64, latent_dim)
        )
        # 디코더: 잠재 공간 -> 복원
        self.decoder = nn.Sequential(
            nn.Linear(latent_dim, 64),
            nn.ReLU(),
            nn.Linear(64, 128),
            nn.ReLU(),
            nn.Linear(128, input_dim)
        )

    def forward(self, x):
        latent = self.encoder(x)
        reconstructed = self.decoder(latent)
        return reconstructed

# 학습 함수
def train_autoencoder(model, data, epochs=100, lr=1e-3):
    optimizer = torch.optim.Adam(model.parameters(), lr=lr)
    criterion = nn.MSELoss()

    for epoch in range(epochs):
        for batch in data:
            x = batch[0]
            x_recon = model(x)
            loss = criterion(x_recon, x)

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        if (epoch + 1) % 20 == 0:
            print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")

# 이상 탐지: 복원 오차 기반
def detect_anomaly(model, x, threshold):
    model.eval()
    with torch.no_grad():
        x_recon = model(x)
        errors = torch.mean((x - x_recon) ** 2, dim=1)
    return errors > threshold

🗣️ 실무 대화 예시

제조업 이상탐지 프로젝트 킥오프에서

"불량 샘플이 전체의 0.1%밖에 안 되니까 지도학습은 어렵습니다. Autoencoder로 정상 데이터만 학습시키고, 복원 오차가 95 percentile을 넘는 샘플을 이상치로 분류하는 방식을 제안드립니다."

시니어 엔지니어와 아키텍처 논의 중

"Latent dimension을 너무 작게 잡으면 정보 손실이 크고, 너무 크면 이상치도 잘 복원해버려요. 우리 센서 데이터는 100차원인데, 32 정도에서 시작해서 복원 품질과 이상탐지 성능을 보면서 조절해봅시다."

기술 면접에서

"VAE와 일반 Autoencoder의 가장 큰 차이는 잠재 공간의 구조입니다. VAE는 잠재 변수가 정규분포를 따르도록 KL divergence로 제약을 주기 때문에 잠재 공간에서 샘플링해서 새로운 데이터를 생성할 수 있습니다."

⚠️ 주의사항

1
정체성 함수 학습 위험

잠재 차원이 입력과 같거나 크면 네트워크가 단순히 입력을 복사하는 정체성 함수를 학습합니다. 반드시 병목 구조를 유지하거나 Sparse/Denoising 제약을 추가하세요.

2
이상탐지 임계값 설정

복원 오차 임계값을 검증 데이터 없이 임의로 설정하면 안 됩니다. 정상 데이터의 복원 오차 분포를 분석하고, 비즈니스 요구사항(재현율 vs 정밀도)에 맞게 결정하세요.

3
학습 데이터 오염

이상탐지용 AE는 정상 데이터만으로 학습해야 합니다. 학습 세트에 이상치가 섞이면 그것도 잘 복원하게 되어 탐지 성능이 저하됩니다.

🔗 관련 용어

📚 더 배우기