VAE로 정상 데이터만으로 터빈 베어링 고장 감지하기: 무라벨 이상 탐지 실전 가이드

Updated Feb 6, 2026

들어가며

산업 현장에서 설비 고장 데이터를 수집하는 것은 쉽지 않습니다. 터빈이 실제로 고장 나기 전까지는 ‘고장 패턴’을 라벨링할 수 없고, 고장이 발생하면 막대한 손실이 발생하기 때문입니다. Variational Autoencoder(VAE)는 이런 상황에서 빛을 발합니다. 정상 데이터만으로 학습하여 비정상 패턴을 감지할 수 있기 때문입니다.

VAE는 정상 상태의 확률 분포를 학습하여, 정상에서 벗어난 패턴을 자동으로 탐지합니다.

이번 글에서는 VAE의 원리부터 터빈 베어링 이상 탐지 실전 적용까지 다룹니다.


VAE(Variational Autoencoder)란?

기본 구조

VAE는 Encoder-Decoder 구조의 생성 모델입니다. 일반 Autoencoder와 달리 잠재 공간(latent space)에 확률 분포를 가정합니다.

구성 요소 역할
Encoder 입력 데이터를 잠재 변수 zz의 평균 μ\mu, 분산 σ2\sigma^2로 인코딩
Latent Space zN(μ,σ2)z \sim \mathcal{N}(\mu, \sigma^2) 정규 분포를 따르는 잠재 변수
Decoder 잠재 변수 zz로부터 원본 데이터 재구성

손실 함수: ELBO

VAE는 ELBO(Evidence Lower Bound)를 최대화합니다. 손실 함수는 다음과 같이 정의됩니다.

<br/>L=E<em>q(zx)[logp(xz)]D</em>KL(q(zx)p(z))<br/><br /> \mathcal{L} = \mathbb{E}<em>{q(z|x)}[\log p(x|z)] – D</em>{KL}(q(z|x) | p(z))<br />

  • Eq(zx)[logp(xz)]\mathbb{E}_{q(z|x)}[\log p(x|z)]: 재구성 손실(Reconstruction Loss). 디코더가 원본 데이터를 얼마나 잘 복원하는지 측정합니다.
  • DKL(q(zx)p(z))D_{KL}(q(z|x) | p(z)): KL Divergence. 인코더가 학습한 분포 q(zx)q(z|x)와 사전 분포 p(z)=N(0,I)p(z) = \mathcal{N}(0, I) 간의 차이를 측정합니다. 이 항이 잠재 공간을 정규화합니다.

KL Divergence가 잠재 공간을 정규 분포로 유지하여, 새로운 데이터 생성과 이상 탐지가 가능해집니다.


무라벨 이상 탐지 원리

1. 정상 데이터로만 학습

VAE는 정상 운전 상태의 진동 데이터만으로 학습합니다. 모델은 다음을 학습합니다:

  • 정상 패턴의 확률 분포
  • 정상 데이터를 효과적으로 재구성하는 방법

2. 이상 탐지 메커니즘

학습 후 새로운 데이터가 들어오면:

  1. 재구성 오차(Reconstruction Error) 계산
    <br/>Error=xx^2<br/><br /> \text{Error} = |x – \hat{x}|^2<br />
    여기서 xx는 입력 데이터, x^\hat{x}는 VAE가 재구성한 데이터입니다.

  2. 임계값(Threshold) 설정
    – 정상 데이터의 재구성 오차 분포에서 99% 백분위수 등을 임계값으로 설정

  3. 이상 판정
    <br/>Anomaly={<br/>Trueamp;if Errorgt;Threshold\<br/>Falseamp;otherwise<br/><br/><br /> \text{Anomaly} = \begin{cases}<br /> \text{True} &amp; \text{if Error} &gt; \text{Threshold} \<br /> \text{False} &amp; \text{otherwise}<br /> \end{cases}<br />

정상에서 벗어난 패턴은 재구성 오차가 크게 나타나므로, 라벨 없이도 이상을 감지할 수 있습니다.


터빈 베어링 이상 탐지 실전 예제

데이터 준비

import numpy as np
import tensorflow as tf
from tensorflow import keras
from sklearn.preprocessing import StandardScaler

# 정상 운전 진동 데이터 (1000개 샘플, 256 timesteps)
normal_data = np.load('turbine_normal_vibration.npy')  # shape: (1000, 256)

# 정규화
scaler = StandardScaler()
normal_scaled = scaler.fit_transform(normal_data)

VAE 모델 구현

latent_dim = 16
input_dim = 256

# Encoder
inputs = keras.Input(shape=(input_dim,))
h = keras.layers.Dense(128, activation='relu')(inputs)
h = keras.layers.Dense(64, activation='relu')(h)
z_mean = keras.layers.Dense(latent_dim)(h)
z_log_var = keras.layers.Dense(latent_dim)(h)

# Reparameterization Trick
def sampling(args):
    z_mean, z_log_var = args
    epsilon = tf.random.normal(shape=tf.shape(z_mean))
    return z_mean + tf.exp(0.5 * z_log_var) * epsilon

z = keras.layers.Lambda(sampling)([z_mean, z_log_var])

# Decoder
decoder_h = keras.layers.Dense(64, activation='relu')(z)
decoder_h = keras.layers.Dense(128, activation='relu')(decoder_h)
outputs = keras.layers.Dense(input_dim)(decoder_h)

vae = keras.Model(inputs, outputs)

# Loss Function
reconstruction_loss = keras.losses.mse(inputs, outputs) * input_dim
kl_loss = -0.5 * tf.reduce_sum(1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var), axis=1)
vae_loss = tf.reduce_mean(reconstruction_loss + kl_loss)
vae.add_loss(vae_loss)

vae.compile(optimizer='adam')

학습 및 임계값 설정

# 학습 (정상 데이터만)
vae.fit(normal_scaled, epochs=100, batch_size=32, verbose=0)

# 재구성 오차 계산
reconstructed = vae.predict(normal_scaled)
errors = np.mean(np.square(normal_scaled - reconstructed), axis=1)

# 임계값: 99% 백분위수
threshold = np.percentile(errors, 99)
print(f"이상 탐지 임계값: {threshold:.4f}")

실시간 모니터링

# 새로운 진동 데이터
test_data = np.load('turbine_test_vibration.npy')  # shape: (100, 256)
test_scaled = scaler.transform(test_data)

# 재구성 오차 계산
test_reconstructed = vae.predict(test_scaled)
test_errors = np.mean(np.square(test_scaled - test_reconstructed), axis=1)

# 이상 감지
anomalies = test_errors > threshold
print(f"이상 감지: {np.sum(anomalies)}건 / {len(test_data)}건")

성능 향상 팁

1. 하이퍼파라미터 튜닝

파라미터 영향 권장 범위
Latent Dim 잠재 공간 크기. 너무 크면 과적합, 작으면 정보 손실 8~32
KL Weight KL 손실 가중치. 재구성과 정규화 균형 조절 0.5~2.0
Threshold 민감도 조절. 낮으면 오탐(false positive) 증가 95~99.5 백분위

2. 시계열 특성 활용

베어링 진동은 시계열 데이터입니다. LSTM 또는 1D CNN 기반 VAE를 사용하면 성능이 향상됩니다.

# LSTM Encoder 예시
inputs = keras.Input(shape=(256, 1))
x = keras.layers.LSTM(64, return_sequences=True)(inputs)
x = keras.layers.LSTM(32)(x)
z_mean = keras.layers.Dense(latent_dim)(x)
z_log_var = keras.layers.Dense(latent_dim)(x)

3. 앙상블 접근

  • 재구성 오차 + KL Divergence 결합
  • 여러 VAE 모델 앙상블로 견고성 향상

실무 적용 시 고려사항

장점

  • 라벨 불필요: 정상 데이터만으로 학습 가능
  • 확률적 해석: 불확실성 정량화 가능
  • 생성 능력: 정상 패턴 시뮬레이션 가능

한계

  • 임계값 설정: 도메인 지식 필요
  • 신규 정상 패턴: 운전 조건 변화 시 재학습 필요
  • 계산 비용: 실시간 추론 시 경량화 필요

개선 방안

문제 해결책
임계값 자동 설정 Isolation Forest, One-Class SVM 등과 결합
Concept Drift Online Learning, 주기적 재학습 파이프라인
추론 속도 모델 경량화(pruning), TensorRT 최적화

마무리

VAE 기반 무라벨 이상 탐지는 정상 데이터만으로 고장 패턴을 감지할 수 있는 강력한 방법입니다. 특히 산업 현장에서 고장 데이터 수집이 어려운 상황에서 빛을 발합니다.

핵심 요약:

  1. VAE는 정상 패턴의 확률 분포를 학습합니다.
  2. 재구성 오차가 임계값을 초과하면 이상으로 판정합니다.
  3. 시계열 특성을 고려한 LSTM/CNN 기반 VAE로 성능 향상 가능합니다.
  4. 실무 적용 시 임계값 설정Concept Drift 대응이 중요합니다.

터빈 베어링 모니터링부터 시작해, 펌프, 모터 등 다양한 회전 기기의 예지정비에 VAE를 적용해보세요. 정상 데이터만으로도 충분히 강력한 이상 탐지 시스템을 구축할 수 있습니다!

Did you find this helpful?

☕ Buy me a coffee

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

TODAY 369 | TOTAL 2,592