VAE와 그래프 신경망으로 설계하는 고급 이상 탐지
VAE 기반 이상 점수화와 그래프 이상 탐지의 모델 구조, 임계값 설정, 드리프트 관리와 운영 트레이드오프를 정리한다.
2026-08-14 · 최초 발행 2024-04-29
개별 관측치와 관계 구조에서 이상을 찾는 방식
규칙 기반 탐지만으로는 고차원 시계열·이벤트 데이터와 복잡한 관계형 데이터의 비정상 패턴을 충분히 포착하기 어렵다. VAE 기반 이상 탐지는 정상 데이터의 분포와 재구성 실패를 활용하고, 그래프 이상 탐지는 노드·엣지·서브그래프에 나타나는 구조적·속성 기반 이상을 다룬다.
이상 탐지는 정상 패턴에서 통계적으로 유의미하게 벗어나는 관측치를 찾는 과업이다. 비지도·준지도·자기지도 방식을 적용할 수 있다.
VAE 기반 접근에서는 Variational Autoencoder가 정상 분포를 학습한다. 재구성 오차, 음의 ELBO, 잠재분포 밀도, 사후 예측 확률을 이상 점수로 사용할 수 있다. 그래프 접근은 GNN, GAE, Graph Contrastive Learning을 바탕으로 관계망 자체의 비정상성을 함께 고려한다.
데이터가 모델에 들어가기 전 결정되는 것들
입력 데이터에는 정규화·스케일링, 시계열 윈도잉, 범주형 임베딩, 스파스 처리가 필요하다. 누락값과 이상치를 사전에 처리하지 않으면 모델이 과적합될 수 있다.
그래프를 구성할 때는 노드와 엣지 타입, 방향성, 다중 엣지를 포함하는 스키마를 먼저 정하고 정합성을 검증한다. 오탐을 낮추려면 관측값만이 아니라 상황을 반영하는 컨텍스트 피처도 설계해야 한다.
정상 상태를 압축하고 복원하는 VAE
VAE는 확률 인코딩을 수행하는 인코더, 잠재변수 z ~ q(z|x), 그리고 p(x|z)로 복원하는 디코더로 구성된다. 학습은 재구성 손실과 KL 발산을 함께 최소화하는 방식이다.
재구성 오차는 MSE 또는 CE로 산출할 수 있으며, 음의 ELBO, q(z|x)의 밀도 기반 스코어, 사후 예측 확률도 점수 후보가 된다. 단일 점수에만 의존하기보다 여러 점수를 앙상블하는 방식을 고려할 수 있다.
그래프가 드러내는 비정상 관계
GAE와 VGAE는 노드 임베딩을 이용해 인접행렬과 속성을 복원한다. 복원이 실패하는 영역은 이상 후보가 된다.
GNN 기반 자기지도 방식에서는 DGI·GRACE 같은 대비학습, 서브그래프 예측, 마스킹 복원으로 정상 구조를 학습한다. 이때 구조적 불일치와 속성 불일치 점수를 결합해 판단한다.
제조 설비의 다변량 센서 데이터에서는 VAE로 정상 상태를 학습하고 공정 단계별로 임계값을 분리할 수 있다. 금융 거래와 페이먼트에서는 계정·디바이스·상점 관계 그래프를 바탕으로 계정 합성이나 머니뮬 네트워크의 서브그래프를 탐지한다. 인증과 네트워크 플로우 그래프에서는 GAE가 희소 커뮤니케이션 이상을 찾는 데 쓰일 수 있다.
사용자-아이템 이분 그래프에서는 봇 활동과 리뷰 조작을 속성-구조 불일치로 다룰 수 있다. AIOps와 로그 분석에서는 로그 이벤트 시퀀스 VAE 및 서비스 호출 그래프 탐지를 병행해 장애 전조 신호를 경보로 연결한다.
VAE와 그래프 모델의 운영상 차이
| 항목 | VAE 기반 이상 탐지 | 그래프 기반 이상 탐지 |
|---|---|---|
| 성능 | 고차원 독립 샘플 재구성에 적합하며 시계열·이미지·로그에 우수 | 관계·전파 패턴 이상에 우수하며 구조·속성 결합 시 강점 |
| 확장성 | 미니배치 병렬 처리와 데이터 증분 처리가 용이 | 대규모 그래프에는 Neighbor Sampling, Cluster-GCN 같은 분산 샘플링 필요 |
| 일관성 | 피처 분포가 안정적이면 안정적 성능 | 그래프 진화와 토폴로지 변화에 민감해 주기적 재학습 필요 |
| 안정성 | 노이즈에 비교적 강인하지만 과도한 압축은 정보 손실 위험 | 허위 엣지와 스팸 노드에 취약해 정화와 신뢰 점수 필요 |
| 운영 편의 | 피처 엔지니어링 중심으로 배포가 단순 | 그래프 스토리지, 피처 서빙, 샘플링 파이프라인 필요 |
점수에서 경보와 재학습으로 이어지는 흐름
비지도 환경에서는 IQR/MAD 또는 EVT(POT) 기반 동적 임계값을 적용할 수 있다. 계절성과 성장 추세가 있는 데이터는 윈도별 캘리브레이션이 필요하다.
레이블이 부족한 경우 ROC-AUC, PR-AUC, Top-k 정밀·재현, 평균 검출 지연(ADL)을 평가에 활용한다. 시계열에서는 시점 단위 이벤트 매칭 기준도 정의해야 한다.
VAE로 이상 점수 계산하기
전제조건: Python 3.10+, PyTorch 2.x, PyTorch Geometric 2.x(그래프 예시), CUDA 선택.
# pip install torch torchvision
import torch, torch.nn as nn, torch.nn.functional as F
class VAE(nn.Module):
def __init__(self, in_dim=50, z_dim=8):
super().__init__()
self.enc = nn.Sequential(nn.Linear(in_dim, 64), nn.ReLU(), nn.Linear(64, 32), nn.ReLU())
self.mu = nn.Linear(32, z_dim)
self.logvar = nn.Linear(32, z_dim)
self.dec = nn.Sequential(nn.Linear(z_dim, 32), nn.ReLU(), nn.Linear(32, in_dim))
def encode(self, x):
h = self.enc(x)
return self.mu(h), self.logvar(h)
def reparam(self, mu, logvar):
eps = torch.randn_like(mu)
return mu + eps * torch.exp(0.5*logvar)
def forward(self, x):
mu, logvar = self.encode(x)
z = self.reparam(mu, logvar)
x_hat = self.dec(z)
return x_hat, mu, logvar
def elbo_loss(x, x_hat, mu, logvar):
recon = F.mse_loss(x_hat, x, reduction='none').sum(dim=1) # 샘플별
kld = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp(), dim=1)
return (recon + kld).mean(), recon.detach(), kld.detach()
# 더미 학습
model = VAE(in_dim=50, z_dim=8)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
X = torch.randn(1024, 50) # 정상 데이터 가정
for _ in range(50):
x_hat, mu, logvar = model(X)
loss, _, _ = elbo_loss(X, x_hat, mu, logvar)
opt.zero_grad(); loss.backward(); opt.step()
# 이상 점수: 재구성 + KLD (음의 ELBO)
with torch.no_grad():
x_hat, mu, logvar = model(X)
_, recon, kld = elbo_loss(X, x_hat, mu, logvar)
anomaly_score = (recon + kld) # 값이 클수록 이상
threshold = anomaly_score.quantile(0.99)
alerts = anomaly_score > threshold
그래프 오토인코더로 노드 이상 점수 계산하기
# pip install torch torch-geometric torch-sparse torch-scatter
import torch, torch.nn as nn, torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root='/tmp/Cora', name='Cora')
data = dataset[0]
class GCNEncoder(nn.Module):
def __init__(self, in_ch, hid=64, out=16):
super().__init__()
self.c1, self.c2 = GCNConv(in_ch, hid), GCNConv(hid, out)
def forward(self, x, edge_index):
x = F.relu(self.c1(x, edge_index))
z = self.c2(x, edge_index)
return z
enc = GCNEncoder(dataset.num_node_features)
dec = lambda z: torch.sigmoid(z @ z.t()) # 인접 복원
opt = torch.optim.Adam(enc.parameters(), lr=1e-2, weight_decay=5e-4)
for _ in range(200):
enc.train()
z = enc(data.x, data.edge_index)
A_hat = dec(z)
# 관측된 엣지(1)와 비관측(0)의 BCE 손실 근사
A = torch.zeros_like(A_hat); A[data.edge_index[0], data.edge_index[1]] = 1.0
loss = F.binary_cross_entropy(A_hat, A)
opt.zero_grad(); loss.backward(); opt.step()
enc.eval()
with torch.no_grad():
z = enc(data.x, data.edge_index)
A_hat = dec(z)
# 노드별 이상 점수: 인접 벡터 재구성 오차
A = torch.zeros_like(A_hat); A[data.edge_index[0], data.edge_index[1]] = 1.0
node_score = F.mse_loss(A_hat, A, reduction='none').mean(dim=1)
thr = node_score.quantile(0.99)
node_alerts = node_score > thr
경보 민감도와 운영 복잡도 사이
EVT 기반 동적 임계값, 계절성 분리 캘리브레이션, 다중 점수 스태킹은 임계값을 다루는 방법이다. 다만 민감도를 높이면 FP가 증가하고, 경보 피로가 누적될 수 있다.
β-VAE로 잠재변수의 독립성을 강화하고 재구성 기여도나 서브그래프 중요도를 제공하면 해석성을 보완할 수 있다. 반면 복잡한 GNN은 과적합과 탈해석성을 키우며 규제 준수 환경에서는 제한이 발생할 수 있다.
그래프 정화, 스팸 엣지 필터, 피처 허용목록, 데이터 혈통과 감사 로깅은 데이터 품질과 보안을 위한 수단이다. 필터링이 과도하면 검출 민감도는 낮아지고 데이터 지연은 늘어난다.
온라인 스코어링, 중요 샘플 재학습, Neighbor/Cluster 그래프 샘플링은 확장성을 위한 선택지다. 그 대가로 분산 GNN 인프라 비용과 피처 서빙 복잡도가 증가한다.
운영에 남겨야 할 점검 항목
피처 사양서와 그래프 스키마를 정리하고 드리프트 모니터링 지표를 정의한다. VAE·GAE 아키텍처, 손실 구성, 잠재차원·β·GNN 레이어 수 같은 하이퍼파라미터도 관리 대상이다.
다중 점수 결합, 윈도별 임계값, 휴지기·합성 규칙 같은 경보 억제 규칙을 점수화 단계에 포함한다. 운영 단계에서는 A/B 검증, 주기적 재학습 파이프라인, 설명 리포트와 플레이북 자동화를 함께 둔다.
데이터셋과 업무 임계 정의에 따라 오탐률 3050% 감소, 탐지 지연 3060% 단축, 운영 비용 20~40% 절감을 추정할 수 있다. 신규 패턴을 포착하는 능력, 관계적 이상 검출 역량, 감사와 설명 가능성은 신뢰성 강화로 이어진다.
VAE는 고차원 개별 샘플의 정상 분포를 학습하는 데 강점이 있고, 그래프 이상 탐지는 관계 구조의 비정상성을 포착하는 데 적합하다. 두 접근을 병행하고 다중 점수 앙상블, 동적 임계값, 드리프트 관리 체계를 결합할 때 파일럿에서 운영으로 점진적으로 이행할 수 있다.