우노
[DL] Autoencoder (오토인코더) 본문
오토인코더란?
- 오토인코더(Autoencoder)는 위 그림과 같이, 단순히 입력을 출력으로 복사하는 신경망이다.
- 어떻게 보면 간단한 신경망처럼 보이지만, 네트워크에 여러가지 방법으로 제약을 줌으로써, 어려운 신경망으로 만든다.
- 예를들어, 위 그림처럼 hidden layer의 뉴런 수를 input layer(입력층) 보다 작게해서 데이터를 압축(차원을 축소)한다거나,
- 입력 데이터에 노이즈(noise)를 추가한 후 원본 입력을 복원할 수 있도록 네트워크를 학습시키는 등 다양한 오토인코더가 있다.
- 이러한 제약들은 오토인코더가 단순히 입력을 바로 출력으로 복사하지 못하도록 방지하며, 데이터를 효율적으로 표현(representation)하는 방법을 학습하도록 제어한다.
Undercomplete Autoencoder
- 오토인코더는 위 그림에서 볼 수 있듯이, 항상 인코더(encoder)와 디코더(decoder), 두 부분으로 구성되어 있다.
- 인코더(encoder) : 인지 네트워크(recognition network)라고도 하며, 입력을 내부 표현으로 변환한다.
- 디코더(decoder) : 생성 네트워크(generative nework)라고도 하며, 내부 표현을 출력으로 변환한다.
- 오토인코더는 위 그림처럼, 입력과 출력층의 뉴런 수가 동일하다는 것만 제외하면, 일반적인 MLP(Multi-Layer Perceptron)과 동일한 구조이다.
- 오토인코더의 출력은 입력을 재구성하기 때문에 재구성(reconstruction)이라고도 하며, 손실함수는 입력과 재구성(출력)의 차이를 가지고 계산한다.
- 위 그림의 오토인토더는 히든 레이어의 뉴런(노드, 유닛)이 입력층보다 작으므로 입력이 저차원으로 표현되는데, 이러한 오토인코더를 Undercomplete Autoencoder라고 한다.
- Undercomplete Autoencoder는 저차원을 가지는 히든 레이어에 의해 입력을 그대로 출력으로 복사할 수 없기 때문에, 출력이 입력과 같아지도록 학습해야 한다.
- 이러한 학습을 통해 Undercomplete Autoencoder는 입력 데이터에서 가장 중요한 특성(feature)을 학습하도록 만든다.
- 만약, 위에서 살펴본 Undercomplete Autoencoder에서 활성화 함수를 비선형함수(sigmoid, ReLU 등)가 아닌 선형함수(linear)를 사용하고, 손실함수로 MSE(Mean Squared Error)를 사용할 경우에는 PCA라고 볼 수 있다.
Stacked Autoencoder
- Stacked Autoencoder 또는 Deep Autoencoder는 여러 개의 히든 레이어를 가지는 오토인코더이며, 레이어를 추가할수록 오토인코더가 더 복잡한 코딩(부호화)을 학습할 수 있다.
- Stacked Autoencoder의 구조는 위 그림과 같이, 가운데 히든레이어(코딩층)을 기준으로 대칭인 구조를 가진다.
Denoising Autoencoder
- 오토인코더가 의미있는 특성(feature)을 학습하도록 제약을 주는 다른 방법은
- 입력에 노이즈(noise, 잡음)를 추가하고, 노이즈가 없는 원본 입력을 재구성하도록 학습시키는 것이다.
- 노이즈는 위의 그림처럼 입력에 가우시안(Gaussian) 노이즈를 추가하거나, 드롭아웃(dropout)처럼 랜덤하게 입력 유닛(노드)을 제거해 발생 시킬 수 있다.
Sparse Autoencoder
오토인코더가 좋은 특성을 추출하도록 만드는 다른 제약 방법은 희소성(sparsity)를 이용하는 것인데, 이러한 오토인코더를 Sparse Autoencoder라고 한다.
이 방법은 손실함수에 적절한 항을 추가하여, 오토인코더가 코딩층(coding layer, 가운데 층)에서 활성화되는 뉴런 수를 감소시키는 것이다.
예를들어, 코딩층에서 평균적으로 5% 뉴런만 활성화되도록 만들어 주게 되면, 오토인코더는 5%의 뉴런을 조합하여 입력을 재구성해야하기 때문에 유용한 특성을 표현하게 된다.
이러한 Sparse Autoencoder를 만들기 위해서는, 먼저 학습 단계에서 코딩층의 실제 sparse(희소) 정도를 측정해야 하는데, 전체 학습 배치(batch)에 대해 코딩층의 평균적인 활성화를 계산한다.
- 배치의 크기는 너무 작지 않게 설정 해준다.
각 뉴런에 대한 평균 활성화 정도를 구했다면, 손실함수에 희소 손실(sparsity loss)을 추가하여 뉴런이 크게 활성화 되지 않도록 규제할 수 있다.
- 예를 들어, 한 뉴런의 평균 활성화가 0.3 이고 목표 희소 정도가 0.1 이라면, 이 뉴런은 덜 활성화 되도록 해야한다.
희소 손실을 구하는 간단한 방법으로는 제곱 오차 를 추가하는 방법이 있다.
하지만, Sparse Autoencoder에서는 아래 그래프 처럼 MSE보다 더 경사가 급한, 쿨백 라이블러 발산(KL-divergense, Kullback-Leibler divergense)을 사용한다.
Variational Autoencoder (VAE)
- VAE(Variational AutoEncoder)는 2014년 D.Kingma와 M.Welling이 Auto-Encoding Variational Bayes 논문에서 제안한 오토인코더의 한 종류이다.
- VAE는 위에서 살펴본 오토인코더와는 다른점이 있다.
- VAE는 확률적 오토인코더(probabilistic autoencoder)이다.
- 즉, 학습이 끝난 이후에도 출력이 부분적으로 우연에 의해 결정된다.
- VAE는 생성 오토인코더(generatie autoencoder)이며, 학습 데이터셋에서 샘플링된 것과 같은 새로운 샘플을 생성할 수 있다.
- VAE는 확률적 오토인코더(probabilistic autoencoder)이다.
- VAE의 코딩층은 다른 오토인코더와는 다른 부분이 있다.
- 우선, VAE의 인코더는 주어진 입력에 대해 바로 코딩을 만드는 것이 아니라, 평균 코딩 와 표준편차 코딩 을 만든다.
- 실제 코딩은 가우시안 분포(gaussian distribution)에서 랜덤하게 샘플링되며, 이렇게 샘플링 된 코딩을 디코더(decoder)의 입력으로 사용해 원본 입력으로 재구성하게 된다.
- VAE는 마치 가우시안 분포에서 샘플링 된 것처럼 보이는 코딩을 만드는 경향이 있는데,
- 학습하는 동안 손실함수가 코딩(coding)을 가우시안 샘플들의 집합처럼 보이는 코딩 공간(coding space) 또는 잠재 변수 공간(latent space)으로 이동시키기 때문이다.
- 이러한 이유로 VAE는 학습이 끝난 후에, 가우시안 분포로부터 랜덤한 코딩을 샘플링 한 뒤 디코딩을 통해 새로운 샘플을 생성할 수 있다.
- VAE의 손실함수
- VAE의 손실함수는 두 부분으로 구성되어 있다.
- 첫 번째는, 오토인코더가 입력을 재구성하도록 만드는 일반적인 재구성 손실(reconstruction loss)이고,
- 두 번째는, 가우시안 분포에서 샘플링 된 것 같은 코딩을 가지도록 오토인코더를 제어하는 latent loss 이다.
참고
'AI > Deep Learning' 카테고리의 다른 글
[DL] DNN Grid Search (3) | 2021.07.16 |
---|---|
[DL] Semantic Segmentation (FCN, U-Net, DeepLab V3+) (8) | 2021.03.19 |
[DL] Word2Vec, CBOW, Skip-Gram, Negative Sampling (3) | 2021.02.18 |
[DL] One-Hot Vector, Word Embedding (1) | 2021.02.17 |
[DL] RNN, LSTM, GRU 란? (5) | 2021.02.16 |
Comments