데이터과학 삼학년

Autoencoder 를 이용한 차원 축소 (latent representation) 본문

Machine Learning

Autoencoder 를 이용한 차원 축소 (latent representation)

Dan-k 2021. 3. 3. 20:00
반응형

차원축소

고차원의 데이터를 이용해 어떤 문제를 푼다고 할때,

실제로 우리는 모든 feature를 사용할 수 있지만, 굳이 많은 feature를 사용하지 않고, 문제를 풀 수 있는 충분한 양의 feature만을 선택해 풀 수 있다.

즉, 실제 공간(observation space) 보다 관찰대상을 잘 설명할 수 있는 잠재 공간(latent space)를 알아낼 수 있고, 잠재공간을 아는 것을 차원 축소라고 볼 수 도 있다.

> 이러한 잠재 공간을 latent representation or coding 이라 부른다

 

Autoencoder를 이용한 latent representation 찾기

Autoencoder는 데이터를 잠재공간으로 압축하는 encoder (recognition network)와 잠재공간을 이용해 원래의 데이터로 복원시키는 decoder (generative network)로 구성되어 있다.

오토인코더는 단순히 입력을 출력으로 복사하는 방법으로 보여 간단한 작업처럼 보이기도 한다.

하지만, 이 모델은 다양한 방법으로 네트워크에 제약을 가해 해당 작업을 어렵게 만들고, 이러한 제약들을 통해 모델을 고도화 할수 있다.

Autoencoder는 입력을 재구성하기 때문에 출력을 종종 reconstruction이라고 부르고, 입력과 출력의 차이를 reconstruction error 라고 한다.

 

Autoencoder를 이용한 차원 축소

1. encoder와 decoder 두 개의 컴포넌트로 오토인코더 모델을 구성

2. 모델 학습

3. 학습된 encoder 모델을 통해 예측

 

- 데이터 생성

import numpy as np
import matplotlib.pyplot as plt

import tensorflow as tf
from tensorflow import keras

np.random.seed(4)

def generate_3d_data(m, w1=0.1, w2=0.3, noise=0.1):
    angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5
    data = np.empty((m, 3))
    data[:, 0] = np.cos(angles) + np.sin(angles)/2 + noise * np.random.randn(m) / 2
    data[:, 1] = np.sin(angles) * 0.7 + noise * np.random.randn(m) / 2
    data[:, 2] = data[:, 0] * w1 + data[:, 1] * w2 + noise * np.random.randn(m)
    return data

X_train = generate_3d_data(60)
X_train = X_train - X_train.mean(axis=0, keepdims=0)

- 모델 학습

np.random.seed(42)
tf.random.set_seed(42)

encoder = keras.models.Sequential([keras.layers.Dense(2, input_shape=[3])])
decoder = keras.models.Sequential([keras.layers.Dense(3, input_shape=[2])])
autoencoder = keras.models.Sequential([encoder, decoder])

autoencoder.compile(loss="mse", optimizer=keras.optimizers.SGD(lr=1.5))
history = autoencoder.fit(X_train, X_train, epochs=20)

- 차원축소

codings = encoder.predict(X_train)

- 원데이터 vs 차원축소 비교

from mpl_toolkits.mplot3d import Axes3D

# 데이터
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(111, projection='3d') # Axe3D object
ax.scatter(X_train[:,0], X_train[:,1], X_train[:,2], c=X_train[:,2], s= 25, alpha=0.7, cmap=plt.cm.Greens)
plt.show()

# 차원축소
fig = plt.figure(figsize=(10,5))
plt.plot(codings[:,0], codings[:, 1], "b.")
plt.xlabel("$z_1$", fontsize=18)
plt.ylabel("$z_2$", fontsize=18, rotation=0)
plt.grid(True)
plt.show()

 > 원래 데이터

> 차원 축소 데이터 (latent representation)

728x90
반응형
LIST
Comments