본문 바로가기

Deep Learning

비지도 학습 - 오토인코더(Autoencoder)

@markdown



# 비지도 학습 - 오토인코더(Autoencoder)

<br/>


## 비지도 학습(Unsupervised Learning)

____

- 데이터에 대한 레이블(Label) 명시적인 정답이 주어지지 않은 상태에서 컴퓨터를 학습시키는 방법론

- 특정 Input에 대하여 올바른 정답이 없는 데이터 집합이 주어지는 경우의 학습

- 데이터안에서 어떤 관계를 찾아내는데 목적이 있음

<br/>


## 비지도 학습 방법

____

- 데이터의 형태, 분포로 학습을 진행

- 비지도 학습은 데이터의 숨겨진 특징이나 구조를 발견하는데 사용됨

- 예) 주어진 입력과 X와 비슷한 입력들의 군집을 추정해내는 것

- 종류 : Clustering, K means, Expectation maximization

<br/>


## 오토인코더(Autoencoder)

____

- 비지도 학습 방법론에서 주로 사용 되는 구조

- 출력값을 입력값의 근사로 하는 함수를 학습함

- 인코더를 통해 입력 데이터에 대한 특징을 추출하고, 디코더를 통해 원본 데이터를 재구성하는 학습방식


![](https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Autoencoder_structure.png/350px-Autoencoder_structure.png)


- 뉴럴 네트워크 두개를 뒤집어 붙여놓은 형태

- 종류 : Variational Autoencoder, Denoising Autoencoder

<br/>


## 오토 인코더의 원리

____

- 인코딩 과정에서 입력된 데이터의 핵심 Feature 정보만 Hidden Layer에서 학습하고, 나머지 정보는 손실시킴

- 디코딩 과정에서 Hidden Layer의 출력값을 뽑았을 때 완벽한 값 복사가 아닌 입력값의 근사치가 됨 

- 출력값이 입력값과 최대한 같아지도록 튜닝함으로써, Feature를 잘 추출할 수 있게 하는 것이 오토인코더의 원리(입력값과 출력값이 최대한 비슷하게 만드는 가중치를 찾아냄)

<br/>


## 오토 인코더의 학습 과정

____

- 1. 입력값과 Hidden Layer의 가중치를 계산해 Sigmoid 함수를 통과시킨다.

- 2. 1번의 결과물과 출력 레이어의 가중치를 계산해 Sigmoid 함수를 통과시킨다.

- 3. 2번의 값을 이용해 MSE(Mean Squared Error)를 계산한다.

- 4. 3번의 결과로 나온 Loss 값을 SGD로 최적화

- 5. 오류역전파를 사용하여 가중치를 갱신

<br/>


## 오토 인코더 MNIST 예제

____

- MNIST 숫자 손글씨 예제 Autoencoder 구현

<pre><code class="python" style="font-size:15px">import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt


from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)


learning_rate = 0.01

training_epoch = 10

batch_size = 100

n_hidden = 256

n_input = 28*28


# 비지도 학습이므로 Y값이 없다

X = tf.placeholder(tf.float32, [None, n_input]) 


# 인코더

W_encode = tf.Variable(tf.random_normal([n_input, n_hidden]))

b_encode = tf.Variable(tf.random_normal([n_hidden]))

encoder = tf.nn.sigmoid(tf.add(tf.matmul(X, W_encode), b_encode))


# 디코더

W_decode = tf.Variable(tf.random_normal([n_hidden, n_input]))

b_decode = tf.Variable(tf.random_normal([n_input]))

decoder = tf.nn.sigmoid(tf.add(tf.matmul(encoder, W_decode), b_decode))


cost = tf.reduce_mean(tf.pow(X - decoder, 2))

optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)


init = tf.global_variables_initializer() 

sess = tf.Session() 

sess.run(init) 

total_batch = int(mnist.train.num_examples / batch_size) 


for epoch in range(training_epoch): 

total_cost = 0 

for i in range(total_batch): 

batch_xs, batch_ys = mnist.train.next_batch(batch_size)

_, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs}) 

total_cost += cost_val 


print('Epoch: ', '%04d' % (epoch + 1), 'Avg. cost=', '{:4f}'.format(total_cost / total_batch))


sample_size = 5

samples = sess.run(decoder, feed_dict={X: mnist.test.images[:sample_size]})


fig, ax = plt.subplots(2, sample_size, figsize=(sample_size, 2))


for i in range(sample_size):

    ax[0][i].set_axis_off()

    ax[1][i].set_axis_off()

    ax[0][i].imshow(np.reshape(mnist.test.images[i], (28, 28))) # 원본

    ax[1][i].imshow(np.reshape(samples[i], (28, 28))) # 신경망이 생성한 이미지


plt.show()

</code></pre>

<br/>


### 학습 결과

![](https://user-images.githubusercontent.com/12658717/40586199-14749dd4-61fa-11e8-94d9-8118969ab2d2.png)


> 소스 출처 : 3분 딥러닝 텐서플로맛([https://github.com/golbin/TensorFlow-Tutorials/blob/master/08%20-%20Autoencoder/01%20-%20Autoencoder.py](https://github.com/golbin/TensorFlow-Tutorials/blob/master/08%20-%20Autoencoder/01%20-%20Autoencoder.py))


> 그림 출처 : [https://en.wikipedia.org/wiki/Autoencoder](https://en.wikipedia.org/wiki/Autoencoder)