Auto Encoder
Auto-Encoder는 위 그림과 같이 Input과 Output이 같은 딥러닝 모형이다. 이러한 AE는 학습하는 과정에서 입력 데이터에 대한 명시적인 Target이 없기 때문에 Unsupervised Learning으로 분류된다.
이중 Encoder 과정은 Input을 통해 입력된 정보가 히든 레이어들을 거치며, 핵심 정보만을 Code에 남기는 암호화 작업을 말한다. 이로써 Code에는 데이터의 핵심이 되는 부분만 기록된다.
Decoder 과정은 Code에 있는 핵심 내용을 가지고 히든 레이어들을 거치며 Output을 내보내는 복호화 작업을 말한다.
AE는 데이터를 압축한다는 면에서 통계학에서 말하는 PCA의 비선형 version이라고 할 수 있다.
PCA
PCA(Principal Component Analysis)는 다차원 변수의 상관관계를 이용하여 차원을 축소하는 방법이다.
쉽게 말해 위 그림에서 보았을 때 X,Y축으로 이루어진 2차원 데이터에서 값들의 분포를 PCA1, PCA2로 사영할 때 같은 데이터를 1차원 데이터의 분포로 만드는 것이다.
이때 PCA1, PCA2로 나타난 부분 중, 방향에 해당하는 요소를 Eigen Vector라고 하고 값에 해당하는 요소를 Eigen Value라고 한다. 이 과정을 수식으로 살펴보면 다음과 같다.
$$X\sim(\mu, \sum)$$
위 식은 확률 변수 $X$의 평균 $\mu$와 공분산 행렬 $\sum$이 주어진 분포를 의미한다.
$$\sum = \Gamma \cdot D_\lambda \cdot \Gamma'$$
위 식은 요인을 분해하는 고유값 분류(Eigen Value Decomposition)를 나타낸 것이다.
여기서 $\sum$은 대칭행렬인 공분산 행렬을 나타내며, $\Gamma$는 공분산 행렬의 고유벡터(Eigen Vector)를 열로 가지는 행렬이다. $D_\lambda$는 공분산 행렬의 고유값(Eigen Value)를 대각선에 가지는 대각행렬이다.
따라서 앞서 말한 것처럼 위 수식은 고유값 분해를 통해 공분산 행렬을 고유벡터와 고유값으로 분해하는 과정을 나타낸다.
$$PCA' = \Gamma \cdot X'$$
위 수식은 $PCA'$가 입력 데이터 $X$를 주성분 공간으로 사영한 결과를 나타내며, 이를 통해 차원이 축소된 데이터를 얻을 수 있다. 이 과정에서 X에 선형 변환을 시켰다고도 할 수 있다.
PCA 구현
# PCA.ipynb
import numpy as np
from sklearn.decomposition import PCA
def standardScaler(X):
return (X - np.mean(X, axis = 0)) / np.std(X, ddof = 1, axis = 0)
x = np.array([[1, 2, 3], [2, 4, 5], [3, 7, 6], [4, 7, 7]])
x_norm = standardScaler(x)
pca = PCA(n_components=3)
proj = pca.fit_transform(x_norm) # PCA Score
diag = np.diag(pca.explained_variance_) # eigen values
eVector = pca.components_.T # eigen vectors
cov = np.dot(np.dot(eVector, diag), eVector.T) # covariance 복원 확인
위 코드는 파이썬으로 PCA를 구현한 것이다.
입력 자료를 표준화한 후 PCA를 수행하면 Eigen Vector의 합이 곧 차원의 수가 됨을 볼 수 있다.
from sklearn.datasets import load_digits
from matplotlib import pyplot as plt
digits = load_digits()
print(digits.data.shape) # digits는 (1797, 64) 데이터로 8*8 숫자 이미지다.
fig = plt.figure(figsize=(6, 6)) # figure size in inches
for i in range(64):
ax = fig.add_subplot(8, 8, i + 1, xticks=[], yticks=[])
ax.imshow(digits.images[i], cmap=plt.cm.binary, interpolation='nearest')
from sklearn.decomposition import PCA
pca = PCA(n_components=3)
proj = pca.fit_transform(digits.data) # PCA Score
proj.shape # proj는 PCA를 통해 (1797,3) 데이터로 64개의 차원을 3차원으로 줄인 데이터다.
plt.scatter(proj[:, 0], proj[:, 1], c=digits.target)
plt.colorbar()
위 코드는 8by8 이미지를 PCA를 통해 3개의 차원으로 축소하는 코드이다.
위 그림은 8by8 이미지 데이터와 이 이미지 데이터를 3차원으로 압축한 결과들을 나타낸 모습이다.
64차원에 해당하는 입력 데이터를 PCA를 통해 3차원 데이터로 압축하더라도 같은 숫자 끼리는 군집화된 모습을 볼 수 있다. 이를 통해 차원을 줄임으로 데이터를 압축하더라도 인식이 가능함을 알 수 있다.
Noise Reduction
Noise Reduction은 PCA를 이용하여 차원을 축소하는 과정에서 뚜렷하지 않은 특징은 사라져버리는 원리를 이용한 Auto Encoder 기술이다. 위 그림은 이러한 Noise Reduction의 결과이다.
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras import datasets
from tensorflow.keras.utils import to_categorical
(train_images, _), (test_images, _) = datasets.mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))
# 픽셀 값을 0~1 사이로 정규화합니다.
train_images, test_images = train_images / 255.0, test_images / 255.0
noise_factor = 0.2
train_images_noisy = train_images + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=train_images.shape)
test_images_noisy = test_images + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=test_images.shape)
train_images_noisy = np.clip(train_images_noisy, 0., 1.)
test_images_noisy = np.clip(test_images_noisy, 0., 1.)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2), padding='same'))
model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2), padding='same'))
model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(layers.UpSampling2D((2, 2)))
model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(layers.UpSampling2D((2, 2)))
model.add(layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same'))
model.summary()
model.compile(optimizer='adadelta', loss='binary_crossentropy')
model.fit(train_images_noisy, train_images,
epochs=100,
batch_size=128,
shuffle=True,
verbose = 2)
decoded_imgs = model.predict(test_images_noisy)
import matplotlib.pyplot as plt
n = 10 # how many digits we will display
plt.figure(figsize=(20, 4))
for i in range(n):
# display original
ax = plt.subplot(2, n, i + 1)
plt.imshow(test_images_noisy[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# display reconstruction
ax = plt.subplot(2, n, i + 1 + n)
plt.imshow(decoded_imgs[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
위 코드는 Flatten 형태와 Convolution 층을 이용한 Auto Encoder라고 한다.
Anomaly Detection
Anomaly Detection 또한 Auto Encoder를 이용하여 그동안 학습한 정보들과 많이 다를 때 이상 신호가 발생한다는 점을 응용한 기술이다.
위 그림은 Anomaly Detection의 원리에 대한 예시로 숫자에 대한 데이터들만 학습했을 때, 'A'를 입력했을 때 'A'와 가장 비슷한 숫자인 '8'로 복원하는 모습을 볼 수 있다.
학습한 적이 없던 데이터가 입력될 때 복원률이 떨어지는 형상을 통해 비정상 신호가 입력되었음을 파악할 수 있다. 이러한 원리를 이용하여 비정상 신호를 탐지하는 지능형 시스템이 곧 Anomaly Detection이다.
Colorization
Colorization은 Auto Encoder를 이용하여 흑백사진으로부터 색을 추정하여 입히는 기술이다.
Image Search
Image Search는 Auto Encoder를 이용하여 입력된 이미지와 유사한 이미지를 찾는 기술이다.
정상적인 AE 구조를 통해 학습하고, 위와 같이 Encoder만 존재하는 모형을 이용하여 찾고자 하는 이미지의 Encoded Vector를 제작한 후 kNN 기법으로 유사도를 측정하여 가장 유사한 이미지를 찾는 방법이다.
CiFAR10 데이터를 통해 학습한 모델에 위와 같은 초록색 개구리 사진을 입력했더니, 개구리 뿐 아니라 사진 내에 초록색이 많이 분포하고 있는 사슴 사진도 검색되었다.
이러한 상황에서 검색 정확도를 높일 수 있는 방안에는 색 정보를 배제하는 방법이 있을 것이다.
'대학교 공부 > 데이터마이닝 (2023)' 카테고리의 다른 글
13주차 - 시계열 분석, RNN, LSTM, BiLSTM, Stacked RNN (0) | 2023.06.18 |
---|---|
11주차 - Batch Normalization, Kernal Regularization, Transfer Learning (0) | 2023.06.18 |
10주차 - Convolutional Layer, Fashion Mnist Data, Cifar10 Data (0) | 2023.06.18 |
8주차 - CNN 실습, 파라미터 수 계산 (0) | 2023.06.18 |
7주차 - CNN, Convolution Layer, Zero Padding (0) | 2023.05.23 |