반응형

원본 링크



Autoencoder: Neural Networks For Unsupervised Learning

신경망은 마치 스위스 군용칼 같다. 둘 다 분류와 회귀문제를 해결할 수 있다. 놀랍게도 또한 unsuperviesed 학습에도 기여할 수 있다. 이번 글에서는 unsupervised 학습에 신경망을 적용하는 오토인코더(autoencoder)를 다룬다.


Blowfish as compressed and uncompressed



Roae map

이 글에서 좀 더 복잡한 데이터셋을 다루는 반면 아래 비디오에서는 더 간단한 데이터셋을 다룬다. 오토인코딩 레이어는 2개의 출력을 갖는다. 이런 방법으로 우리는 2차원 그래프로 결과를 볼 수 있다.




Autoencoder Neural Networks

오토인코더는 실제로 전통적인 신경망이지만 오토인코더의 디자인이 오터인코더를 특별하게 만든다.

  • 우선 오토인코더는 입력과 출력 레이어에서 반드시 동일한 수의 노드를 갖는다.
  • 두번째로 히든레이어(hidden layer)는 반드시 중앙기준으로 대칭이어야 한다.
  • 세번째로 히든 레이어의 노드 수는 반드시 왼쪽에서 중앙으로 감소하고 중앙에서 오른쪽으로 증가해야 한다.
    
    Autoencoder Neural Networks
    

키 포인트는 입력 특성이 각각 감소되고 저장돤다는 것이다. 이것을 만약 입력이 출력과 유사하다면 중앙 레이어의 출력값으로 입력이 압축될 수 있다고 한다. 이 압축 연산은 무손실 압축이 아니기 때문에 비슷하다고 할 수 있다.

네트워크의 왼쪽을 오토인코더(autoencoder)라고 부르며 축소(reduction)을 담당한다. 반대로 네트워크의 오른쪽을 오토디코더(autodecoder)라고 부르며 확대(enlargement)를 담당한다.

이 접근법을 손으로 쓴 숫자 데이터셋(MNIST)에 적용해 보자. 비록 훈련과 테스트셋 모두 이미 0에서 9까지로 레이블링 되어있지만 이 레이블을 폐기하고 모르는 것처럼 하자.



Constructing network

먼저 오토인코더 구조를 만들자. MNIST 데이터셋은 28 X 28 픽셀이미지로 구성된 데이터셋이다. 즉, 입력 특성은 (28 X 28) 크기이다.


model = Sequential()
model.add(Dense(128, activation='relu', input_shape=(784,)))
model.add(Dense(32, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(784, activation='sigmoid'))

오토인코더 모델은 입력과 출력 레이어 보두에 784개의 노드를 갖는다. 게다가 각각 128, 32, 128 크기인 3개의 히든 레이어가 있다. 오토인코더 구성 규칙에 따라 중앙 대칭이고 중앙 레이어는 32개의 노드로 구성된다.



Training

입력과 출력 레이어 모두에 대해 훈련셋의 입력 특성을 전달한다.


model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit(x_train, x_train, epochs=3, validation_data=(x_test, x_test))

훈련 오류(train error)와 검증 오류(validation error) 모두 만족스럽다.(loss: 0.0881 – val_loss: 0.0867) 하지만 이것은 실제 예제에 적용되었을 때 구체적일 것이다.



Testing


def test_restoration(model):
    decoded_imgs = model.predict(x_test)
    get_3rd_layer_output = K.function([model.layers[0].input], [model.layers[1].output])

    for i in range(2):
        print("original: ")
        plt.imshow(x_test[i].reshape(28, 28))
        plt.show()
        #-------------------
        print("reconstructed: ")
        plt.imshow(decoded_imgs[i].reshape(28, 28))
        plt.show()
        #-------------------
        print("compressed: ")
        current_compressed = get_3rd_layer_output([x_test[i:i+1]])[0][0]
        plt.imshow(current_compressed.reshape(8, 4))
        plt.show()


Running autoencoder

비록 저장된 것이 좀 흐릿해졌지만 명확하게 읽을 수 있다. 여기서는 압축 표현이 의미가 있다는 것을 의미한다.

더 이상 복원을 표시할 필요는 없다. 아래 표시하는 대신 압축된 버전을 저장하기 위해 아래 코드를 사용할 수 있다.


def autoencode(model):
    decoded_imgs = model.predict(x_test)

    get_3rd_layer_output = K.function([model.layers[0].input], [model.layers[1].output])
    compressed = get_3rd_layer_output([x_test])

    return compressed

com = autoencode(model)

Clustering

입력 특성이 784인 반면 압축된 표현은 32의 크기인 것에 주목하자. 이것은 원본 이미지보다 24배 더 작다는 것을 의미한다. 여기서 복잡한 입력 특성은 k-means 또는 K-NN 같은 전통적인 unsupervised 학습을 강화한다.(enforce) 이 아이디어는 여러분이 오토인코더를 적용하고 입력 특성을 줄이며(reduce) 의미있는 데이터를 먼저 추출해야 한다는 것이다. 그러면 unsupervised 학습을 압축된 표현에 적용할 수 있다. 이런 방법으로 클러스터링 알고리즘(clustering algorithms)이 고성능으로 동작하지만 좀더 의미있는 결과를 만든다.


unsupervised_model = tf.contrib.learn.KMeansClustering(10 
    , distance_metric = clustering_ops.SQUARED_EUCLIDEAN_DISTANCE
    , initial_clusters=tf.contrib.learn.KMeansClustering.RANDOM_INIT)

def train_input_fn():
    data = tf.constant(com[0], tf.float32)
    return (data, None)

unsupervised_model.fit(input_fn=train_input_fn, steps=5000)
clusters = unsupervised_model.predict(input_fn=train_input_fn)

index = 0
for i in clusters:
    current_cluster = i['cluster_idx']
    features = x_test[index]
    index = index + 1

놀랍게도 이러한 접근법은 동일한 군집(cluster)에 아래와 같은 이미지를 놓는다. 클러스터링은 그것의 신분(identity) 대신 일반적인 숫자의 모양에 따르는 것 같아 보인다.


Items of Cluster 4

Items of Cluster 1

이 글에서는 unsupervised 학습에서 신경망을 어떻게 적용하는지에 대해 알아보았다. 오토인코더는 supervised 학습 알고리즘의 대체가 아니다. 오늘날 우리가 가지고 있는 대부분의 데이터는 픽셀기반이고 레이블링 되어 있지 않다. Mechanical turk 같은 몇몇 방법(mechanism)은 이러한 레이블링되지 않은 데이터를 레이블링 하기 위한 서비스를 제공한다. 이러한 접근 방법은 레이블링 되지 않은 데이터 프로세스를 레이블링하는데 도움이 될 수 있다.

이 글에서 사용된 소스코드는 여기에서 찾을 수 있다.

반응형

+ Recent posts