일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Deep learning
- LSTM
- 차원 축소
- CNN
- 딥러닝
- 인공 신경망
- 머신러닝
- 신경망
- 지도 학습
- 교차 검증
- 데이터 전처리
- Q-Learning
- Machine Learning
- GRU
- 강화 학습
- 자연어 처리
- 손실 함수
- AI
- 정규화
- 최적화
- 머신 러닝
- 인공지능
- 회귀
- q-러닝
- reinforcement learning
- 과적합
- 활성화 함수
- rnn
- 강화학습
- python
- Today
- Total
move84
딥러닝: Variational Autoencoders (VAE) 기본 사항 본문
Variational Autoencoders (VAE, 변분 오토인코더)는 딥러닝 분야에서 널리 사용되는 생성 모델 중 하나이다. VAE는 데이터의 잠재 공간을 학습하여 새로운 데이터를 생성하는 데 사용된다. 이 글에서는 VAE의 기본적인 개념과 작동 원리를 살펴보고, 간단한 예제 코드를 통해 이해를 돕는다.
💡 VAE의 핵심 개념: 잠재 공간 (Latent Space)
VAE의 가장 중요한 특징은 잠재 공간을 활용한다는 것이다. 잠재 공간은 데이터의 압축된 표현으로, VAE는 입력 데이터를 잠재 공간에 매핑하고, 이 잠재 공간에서 데이터를 다시 생성하는 방식으로 작동한다. 잠재 공간은 일반적으로 저차원의 벡터로 표현되며, 데이터의 주요 특징을 담고 있다. VAE는 잠재 공간을 정규 분포(Normal Distribution, 정규 분포)와 같은 확률 분포로 모델링하여, 잠재 공간에서 샘플링한 후 새로운 데이터를 생성할 수 있도록 한다.
✨ VAE의 구조
VAE는 인코더 (Encoder, 인코더)와 디코더 (Decoder, 디코더)로 구성된다.
- 인코더 (Encoder)
- 입력 데이터를 잠재 공간으로 매핑한다.
- 입력 데이터를 받아 평균(mean)과 표준편차(standard deviation)를 출력한다. 이들은 잠재 공간 내에서의 정규 분포를 정의하는 파라미터이다.
- 디코더 (Decoder)
- 잠재 공간의 벡터를 입력으로 받아 원본 데이터와 유사한 데이터를 생성한다.
- 인코더가 생성한 평균과 표준편차를 이용하여 잠재 공간에서 샘플링하고, 이 샘플을 기반으로 데이터를 생성한다.
📚 VAE의 작동 원리: KL 발산 (KL Divergence)과 재구성 손실 (Reconstruction Loss)
VAE는 두 가지 주요 손실 함수를 사용하여 학습된다.
- 재구성 손실 (Reconstruction Loss)
- 디코더가 생성한 데이터와 원본 데이터 간의 차이를 측정한다.
- 일반적으로 평균 제곱 오차 (Mean Squared Error, MSE) 또는 이진 교차 엔트로피 (Binary Cross-Entropy, BCE)를 사용한다.
- 재구성 손실은 디코더가 입력 데이터를 얼마나 잘 재구성하는지를 나타낸다.
- KL 발산 (KL Divergence)
- 잠재 공간의 분포가 사전 정의된 분포(일반적으로 표준 정규 분포)에서 얼마나 벗어나는지를 측정한다.
- KL 발산은 잠재 공간의 분포를 정규 분포에 가깝게 유지하도록 돕는다.
- KL 발산은 잠재 공간이 너무 복잡해지는 것을 방지하고, 잠재 공간이 의미 있는 정보를 담도록 유도한다.
VAE의 전체 손실 함수는 재구성 손실과 KL 발산의 가중치 합으로 구성된다. 가중치는 KL 발산의 중요도를 조절하는 데 사용된다.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# 인코더 모델
def build_encoder(latent_dim=2):
encoder_inputs = keras.Input(shape=(28, 28, 1))
x = layers.Conv2D(32, 3, activation="relu", strides=2, padding="same")(encoder_inputs)
x = layers.Conv2D(64, 3, activation="relu", strides=2, padding="same")(x)
x = layers.Flatten()(x)
x = layers.Dense(16, activation="relu")(x)
z_mean = layers.Dense(latent_dim, name="z_mean")(x)
z_log_var = layers.Dense(latent_dim, name="z_log_var")(x)
return keras.Model(encoder_inputs, [z_mean, z_log_var], name="encoder")
# 잠재 공간에서 샘플링하는 함수
def sampling(z_mean, z_log_var):
batch = tf.shape(z_mean)[0]
dim = tf.shape(z_mean)[1]
epsilon = tf.keras.backend.random_normal(shape=(batch, dim))
return z_mean + tf.exp(0.5 * z_log_var) * epsilon
# 디코더 모델
def build_decoder(latent_dim=2):
latent_inputs = keras.Input(shape=(latent_dim,))
x = layers.Dense(7 * 7 * 64, activation="relu")(latent_inputs)
x = layers.Reshape((7, 7, 64))(x)
x = layers.Conv2DTranspose(64, 3, activation="relu", strides=2, padding="same")(x)
x = layers.Conv2DTranspose(32, 3, activation="relu", strides=2, padding="same")(x)
decoder_outputs = layers.Conv2DTranspose(1, 3, activation="sigmoid", padding="same")(x)
return keras.Model(latent_inputs, decoder_outputs, name="decoder")
# VAE 모델 (인코더와 디코더를 결합)
class VAE(keras.Model):
def __init__(self, encoder, decoder, **kwargs):
super().__init__(**kwargs)
self.encoder = encoder
self.decoder = decoder
self.total_loss_tracker = keras.metrics.Mean(name="total_loss")
self.reconstruction_loss_tracker = keras.metrics.Mean(name="reconstruction_loss")
self.kl_loss_tracker = keras.metrics.Mean(name="kl_loss")
@property
def metrics(self):
return [
self.total_loss_tracker,
self.reconstruction_loss_tracker,
self.kl_loss_tracker,
]
def train_step(self, data):
with tf.GradientTape() as tape:
z_mean, z_log_var = self.encoder(data)
z = sampling(z_mean, z_log_var)
reconstruction = self.decoder(z)
reconstruction_loss = tf.reduce_mean(
tf.keras.losses.binary_crossentropy(data, reconstruction)
)
kl_loss = -0.5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var))
kl_loss = tf.reduce_mean(tf.reduce_sum(kl_loss, axis=1))
total_loss = reconstruction_loss + kl_loss
grads = tape.gradient(total_loss, self.trainable_weights)
self.optimizer.apply_gradients(zip(grads, self.trainable_weights))
self.total_loss_tracker.update_state(total_loss)
self.reconstruction_loss_tracker.update_state(reconstruction_loss)
self.kl_loss_tracker.update_state(kl_loss)
return {
"loss": self.total_loss_tracker.result(),
"reconstruction_loss": self.reconstruction_loss_tracker.result(),
"kl_loss": self.kl_loss_tracker.result(),
}
# 모델 생성 및 컴파일
latent_dim = 2
encoder = build_encoder(latent_dim)
decoder = build_decoder(latent_dim)
vae = VAE(encoder, decoder)
vae.compile(optimizer=keras.optimizers.Adam())
# MNIST 데이터 로드 및 정규화
(x_train, _), (x_test, _) = keras.datasets.mnist.load_data()
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
# 모델 학습
vae.fit(x_train, epochs=3, batch_size=128)
# 샘플 생성
import numpy as np
z = np.random.normal(0, 1, size=(1, latent_dim))
generated_image = decoder.predict(z)
🔑 VAE의 장점 및 활용 분야
VAE는 다음과 같은 장점을 가지고 있다.
- 생성 능력: 새로운 데이터를 생성할 수 있다.
- 잠재 공간 학습: 데이터의 잠재적인 특징을 학습하여, 데이터 이해에 도움을 준다.
- 연속적인 잠재 공간: 잠재 공간이 연속적이므로, 잠재 공간에서 샘플링하여 새로운 데이터를 생성할 때 부드러운 변화를 보인다.
VAE는 다양한 분야에서 활용된다.
- 이미지 생성: 새로운 이미지를 생성하고, 이미지 스타일을 변환한다.
- 이상 감지: 정상 데이터의 잠재 공간을 학습하고, 이상 데이터를 감지한다.
- 추천 시스템: 사용자의 선호도를 나타내는 잠재 공간을 학습하여, 추천 시스템을 개선한다.
📝 요약
- Variational Autoencoders (VAE)는 딥러닝 기반의 생성 모델이다.
- 잠재 공간 (Latent Space)을 사용하여 데이터를 압축하고, 새로운 데이터를 생성한다.
- 인코더 (Encoder)는 입력 데이터를 잠재 공간으로 매핑한다.
- 디코더 (Decoder)는 잠재 공간의 벡터를 기반으로 데이터를 생성한다.
- 재구성 손실 (Reconstruction Loss)은 디코더의 성능을 측정한다.
- KL 발산 (KL Divergence)은 잠재 공간의 분포를 정규 분포에 가깝게 유지한다.
- VAE는 이미지 생성, 이상 감지, 추천 시스템 등 다양한 분야에서 활용된다.
'딥러닝' 카테고리의 다른 글
이미지 생성을 위한 딥러닝: GANs (생성적 적대 신경망) (0) | 2025.03.26 |
---|---|
딥러닝: 생성적 적대 신경망 (GAN) 이론 (0) | 2025.03.26 |
딥러닝: 노이즈 제거 오토인코더 기술 (0) | 2025.03.26 |
딥러닝: 특징 학습을 위한 딥 오토인코더 (0) | 2025.03.26 |
딥러닝: 양방향 RNN (Bidirectional RNN)의 활용 (0) | 2025.03.26 |