본문 바로가기
Deep Learning/Auto-Encoder

Autoencoder (오토인코더)

by YJJo 2020. 1. 14.

이번 포스팅을 시작으로 single autoencoder부터 다양한 autoencoder를 포스팅 할 예정입니다. Autoencoder는 역사적으로도 굉장히 중요한 의미가 있습니다. 다층신경망 학습시 기울기 소실문제와 가중치 초기 값에 영향을 많이 받아 학습이 어려운 문제가 있었는데 G. E. Hinton, 2006에 의해서 Restrited Boltzmann Machine을 이용하여 가중치 초기값을 구축하고, 기울기 강하법을 적용햇더니 학습이 잘 된다는 것이 밝혀져 deep learning의 부흥을 이끌었기 때문입니다. 하지만 사실 현대 딥러닝 생태계에서는 학습방법의 발전으로 과거처럼 RBM으로 초기 값을 지정하진 않습니다. 또한 현대에 이르러선 autoencoder는 처음엔 비지도 학습 (unsupervised learning)으로 불리우다가,  새로운 머신러닝 학습의 범주 self-supervised learning로 분류됩니다. 따라서 이어질 오토인코더 관련 글들은 self-supervised learning의 초점을 맞추어 진행하려고 합니다.

개요

Autoencoder는 데이터를 효율적으로 coding하기위한 딥러닝 architecture중 한 가지입니다. 여기에서 coding이란 데이터를 압축한다는 의미로 해석하면 적절할 것 같습니다. 다시 말하면 어떤 데이터를 효율적으로 나타내기 위해서 고차원을 저차원으로 차원 축소하는 방법입니다. 가장 기초적인 autoencoder를 시작으로, 맥락은 유지하며 여러 형태로 발전되어 왔습니다. 이번 포스팅에서는 가장 간단한 형태의 autoencoder를 살펴보고자 합니다.

Autoencoder

Autoencoder의 신경망 구조는 input(입력)과 output(출력)이 동일하며 좌우를 대칭으로 구축된 구조입니다. 간단한 예제와 함께 살펴보겠습니다.

Figure 1: Autoencoder

입력층과 출력층을 같도록 구성한 뒤 중간에 은닉층을 적재하고, 은닉층을 기준으로 좌우 대칭이 되도록합니다. 이때 은닉층의 노드의 수는 몇 개로 구성하든지 상관은 없습니다. 다만 데이터의 차원축소 및 특징추출이 목적인 경우는 입력층의 노드의 수보다 작게합니다. 현재 까지 상황을 요약하면 어떤 데이터 $X$를 입력받아, 가중치의 곱과 합 그리고 활성함수의 조합으로 은닉층 노드의 값을 계산한 상황입니다. 이때 은닉층의 노드의 값을 Code라고 부르며 이를 Encoder라고 부릅니다. 뒤따른 상황에서는 이 code값에 적당한 가중치를 곱하고 활성함수를 적용하여 출력층에 도달하는데 이때 출력층은 입력층의 값과 같아, 원래 값으로 복원하는 과정Decoder라고 부릅니다.

우리는 Encoder를 이용하면 $X$를 어떤 코드 값 $h$로 특징을 추출할 수 있는데, 이때 $h$의 크기를 $X$보다 작게 구성하면 차원축소가 가능합니다. 따라서 autoencoder를 이용하면 데이터 차원 축소 및 특징 추출이 가능해집니다.

Autoencoder의 학습

Autoencoder의 학습 방법은 사실 일반적인 딥러닝 모형의 학습방법과 동일합니다. 여기에서는 autoencoder의 이해를 돕기위한 autoencoder 학습시 목적함수 구성에 대해서 자세히 살펴보겠습니다. Code $h$는 다음과 같이 계산됐다고 가정해보겠습니다. $$h=\sigma\left(W_{e}x+b_{e}\right)$$ 출력층은 좌우 대칭이 되도록 구성했음으로 $$x'=\sigma\left(W_{d}h+b_{d}\right)$$와 같이 계산됩니다. 여기에서 $\sigma$는 sigmoid함수이고, $x'$은 사실 $x$와 완전히 같을 수는 없기 때문에 편의상 $x'$으로 기입하였습니다. 이어서 어떤 loss function을 $\mathcal{L}$이라고 하면, $$\mathcal{L}(x,x')=\mathcal{L}\left(x-\sigma\left(W_{d}\sigma\left(W_{e}x+b_{e}\right)+b_{d}\right)\right)$$로 나타낼 수 있으며 이를 최소화하는 $$\hat{W_{e}},\hat{W_{d}},\hat{b_{e}},\hat{b_{d}}=\underset{W_{e},W_{d},b_{e},b_{d}}{argmin}\mathcal{L}$$ 가중치를 찾으면 autoencoder를 학습할 수 있습니다.

Stacked Autoencoder

앞서 다룬 single autoencoder는 단층 encoder와 단층 decoder로 구성되어있습니다. 자연스럽게도 encoder에서는 code까지 여러층을 적재하고, 이와 대칭이 되도록 decoder를 구축할 수 있습니다. 이런 형태의 autoencoder를 stacked autoencoder라고 부릅니다.

Figure 2: Stacked Autoencoder

위 그림은 두 층으로 구성된 autoencoder입니다. 여러층을 적재한 형태의 autoencoder는 일반적으로 single autoencoder 대비 더 좋은 성능을 보인다고 알려져 있습니다. 사실 restricted Boltzmann machine과 deep belief network같은 개념이 등장하여 더 이론적으로 내용을 다룰 수 있습니다. 하지만 최근에 실제로 stacked autoencoder를 이용할 때,  단순히 대칭 구조를 구축하고 tensorflow를 이용하여 학습시켜 이용하는 것이 일반적이기 때문에 자세한 설명은 생략하였습니다. (혹시 궁금하시다면 google에 검색하면 방대한 자료를 찾아볼 수 있습니다 :))

마치며

이번 포스팅에서는 앞으로 다룰 다양한 형태의 오토인코더들의 뿌리가된 single autoencoder와 stacked autoencoder에 대하여 살펴보았습니다. 다음 포스팅에서는 다양한 autoencoder들을 살펴볼 예정입니다. 감사합니다. :)

References

Wikipedia contributors. "Autoencoder." Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 14 Jan. 2020. Web. 17 Jan. 2020.
Hinton, Geoffrey E., and Ruslan R. Salakhutdinov. "Reducing the dimensionality of data with neural networks." science 313.5786 (2006): 504-507.

댓글