본문 바로가기

딥러닝

14. AutoEncoder

 

1. AutoEncoder

 

 오늘은 AutoEncoder라는 아주 유용한 모델 구조를 소개해드리고자 합니다. Autoencoder를 사용하는 가장 주된 이유는 새로운 feature를 만들어내는 것 입니다. 인공신경망 때부터 유용하게 사용되다가, 딥러닝이 발전하면서 autoencoder도 같이 발전했습니다. NLP의 기계번역에서 주로 사용하는 seq2seq 라던가, 생성모델로 유명한 VAE, GAN등을 알기전에 autoencoder는 필수적으로 알아야하는 구조 입니다. 

 

2. AutoEncoder의 모델구조

 

 AutoEncoder의 가장 큰 특징은 Input과 output이 같다는 것 입니다. Input과 output이 같다면 도대체 모델이 무슨 용도가 있느냐 라고 생각할 수 있습니다. 그래서 autoencoder는 모델에 몇가지 제약을 걸어줌으로써, 모델이 의미가 있도록 만듭니다.

 

 가장 일반적인 Autoencoder의 모형을 예시로 들어보겠습니다.

 

 보시면 Input과 Output은 같도록 훈련을 합니다. Input은 encoder를 통해서 z로 압축되고, 이 z를 다시 decoder를 통해서 x로 복원됩니다. 그리고 위의 그림을 보시면 모델의 각 부분의 크기도 의미가 있습니다. Input x, output x에 비해서 z의 크기가 작습니다. Encoder는 점점 작아지고, Decoder는 점점 커집니다. 

 

 보통 위와 같은 식으로 autoencoder는 input을 더 작은 feature로 압축을 했다가, 복원하는 과정으로 훈련을 합니다. 만약 훈련이 너무 잘 되어서 input이 똑같이 복원되었다고 해봅시다. 그렇다면 압축된 feature인 z는 x보다 낮은 차원이지만, input x의 정보를 모두 가지고 있다고 볼 수 있습니다. 이 z는 representation vector 또는 bottleneck 등의 이름으로 불립니다.

 

 똑같은 정보를 가지고 있지만, 더 작은 차원이고, 다르게 표현된 feature라고 볼 수 있습니다. 이런식으로 autoencoder는 압축 또는 새로운 feature를 만드는데 사용합니다. 이러한 특징으로 인해서 autoencoder를 과거부터 지금까지 쭈욱 유용하게 사용하는 것 입니다.

 

3. AutoEncoder의 발전

 

 AutoEncoder는 모델의 유용성 때문에 과거부터 이것저것 발전이 많았습니다. Sparse Autoencoders 라고 hidden layer의 일부 node만 사용하는 방법도 있고, enocder와 decoder의 변수에 제약을 건다던가, 여러 방법이 있습니다. 그 중에서 지금도 눈여겨볼 만한 AE를 소개해보겠습니다.

 

1) Denoising AutoEncoder

 이름처럼 noise를 제거하기 위한 AE 입니다. 훈련을 진행할때 의도적으로 input x에 noise를 add 하는식으로 구성하는게 많습니다. 또는 input의 일부분을 의도적으로 제거하고 훈련을 합니다. 어쨌든 input이 무언가 깔끔하지 않은 것이죠. 이런식으로 구성을 하면 이미지 또는 음성에 noise가 약간 끼어있어도 깨끗한 이미지와 음성을 출력해낼 수 있는 식 입니다.

 

 논문에서만 사용하는 데이터가 아니라, 현실의 데이터를 사용하는 경우에는 데이터에 noise가 있는 경우가 상당히 많습니다. 이런 경우에 denoising AE를 활용하려는 경우가 요즘에도 있습니다. (제가 요약해서 포스팅한 주식 예측 논문에서도 denoising AE를 사용했죠)

 

2) Convolution & Deep Autoencoder

Saliency_Detection_Convolutional_Autoencoder

 Autoencoder의 encoder와 decoder를 처음에는 Fc layer를 이용해서 많이 구성했다면, 딥러닝이 발전하면서 layer들을 CNN으로 구성하게 되고, layer의 수도 깊어지게 됩니다. 이러한 방식들이 data의 feature를 뽑아내는 것에 도움을 주기 때문이죠.

 

3) Conditional AutoEncoder

 

 딥러닝 모델을 학습할때, 적절한 데이터(정보)의 추가는 항상 도움이 됩니다. Mnist 데이터를 통해 원래의 이미지를 복원할때, 기존에는 input x의 픽셀 값들만 주어졌다면, Conditional AE에서는 조건으로 input이 무슨 숫자인지를 주는 것입니다. x를 압축했다가 다시 복원하는 것에 있어서 숫자의 정보는 분명 도움이 되겠죠.

 

 이런 조건을 주는 경우에는 조건이 어떤식으로 모델에 input이 되어야 하는가도 매우 중요한 문제 입니다. 좋은 정보라고 할지라도 모델의 학습 하는데에 제대로 전달이 되지 않는 경우에는 성능의 향상이 일어나지 않는법 입니다. 가중치 학습을 할때 정보를 주도록 잘 분배해야 합니다. DNN의 경우 이미지를 flatten 한 다음에 숫자 정보를 concate 해준다던가, CNN의 경우 이미지 채널을 늘린다던가, label을 어디에다가 첨가해준다던가 하는 식의 접근이 필요합니다.

 

 

4) VAE(Variational AutoEncoder) (Kingma & Welling, 2014) 그리고 생성모델

VAE(with Gaussian)

 AE의 Decoder를 보시면, input x를 압축해놓은 feature인 z를 다시 input x로 복원합니다. 그래서 decoder를 생성 네트워크라고도 부릅니다. 잘 학습된 모델의 decoder만 분리해내서, 새로운 z를 input으로 넣으면 새로운 output이 나올테니까요. Mnist 데이터로 학습한 모델을 예시로 들면, 새롭게 그린 숫자가 나올 수도 있는 것이죠.

 

 Z의 분포를 알수만 있다면, 그러니까 mnist 데이터에서 숫자 0을 그릴때 z가 어떻게 분포되어 있는지를 알고, 그 z안에서 샘플링을 한다면 이제껏 없던 새로운 이미지가 등장합니다. 하지만 기존의 AE에서는 이 Z의 분포가 항상 달라집니다. 새로운 모델링을 할때마다 달라지게 되고, 이런 경우는 z를 사용하기가 쉽지 않죠.

 

 VAE는 이 점을 착안하여 Z의 분포를 우리가 원하는 분포가 되도록 학습을 시킵니다. Z의 분포가 항상 우리가 원하는, 알고있는 분포로 매칭이 된다면 이 Z를 이용해서 VAE라는 생성 모델을 만들어낼 수 있는 것입니다. 다만 이렇게 Z를 우리가 원하는 분포로 바꾸는 과정에서 원래 훈련이 불가능한 상황이 일어납니다. 분포를 변환하는 과정이, 가중치 학습이 불가능하기 때문입니다.

 

 이래서 VAE 논문의 저자는 reparameterization trick이라는 방식으로 이 문제를 해결합니다...만 워낙 잘 정리되어있는 글들이 많아서 패스하겠습니다. 

 

 이 이외에도 VQ-VAE 등의 발전이 계에에속 있습니다. 딥러닝을 포함한 머신러닝 기법은 보시면 대부분 예측을 하거나 분류를 하거나 하는 기능을 합니다. 그런데 AE는 '생성 모델'로써의 가능성이 존재합니다. 생성 모델이 잘 작동하면 지금보다 머신러닝이 하는 역할이 훨씬 커질 것 입니다. 그래서 VAE, GAN 등의 생성모델에 폭발적인 관심이 생기고 발전하게 되었습니다. 

 

 다음 글에서는 간단한 AE, Convolution AE 등의 코드를 예제로 올려보겠습니다.

'딥러닝' 카테고리의 다른 글

16. GAN - 생성모델  (0) 2019.12.03
15. AutoEncoder 예제코드  (0) 2019.11.26
13. RNN (순환 신경망)  (0) 2019.11.20
12. Learning Curve (학습 곡선)  (2) 2019.11.19
11. Activation Function (활성화 함수)  (0) 2019.11.18