오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-05 00:02
관리 메뉴

우노

[DL] Autoencoder (오토인코더) 본문

AI/Deep Learning

[DL] Autoencoder (오토인코더)

운호(Noah) 2021. 3. 3. 20:15

오토인코더란?

  • 오토인코더(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의 코딩층은 다른 오토인코더와는 다른 부분이 있다.
  • 우선, VAE의 인코더는 주어진 입력에 대해 바로 코딩을 만드는 것이 아니라, 평균 코딩표준편차 코딩 을 만든다.
  • 실제 코딩은 가우시안 분포(gaussian distribution)에서 랜덤하게 샘플링되며, 이렇게 샘플링 된 코딩을 디코더(decoder)의 입력으로 사용해 원본 입력으로 재구성하게 된다.
  • VAE는 마치 가우시안 분포에서 샘플링 된 것처럼 보이는 코딩을 만드는 경향이 있는데,
  • 학습하는 동안 손실함수가 코딩(coding)을 가우시안 샘플들의 집합처럼 보이는 코딩 공간(coding space) 또는 잠재 변수 공간(latent space)으로 이동시키기 때문이다.
  • 이러한 이유로 VAE는 학습이 끝난 후에, 가우시안 분포로부터 랜덤한 코딩을 샘플링 한 뒤 디코딩을 통해 새로운 샘플을 생성할 수 있다.
  • VAE의 손실함수
    • VAE의 손실함수는 두 부분으로 구성되어 있다.
    • 첫 번째는, 오토인코더가 입력을 재구성하도록 만드는 일반적인 재구성 손실(reconstruction loss)이고,
    • 두 번째는, 가우시안 분포에서 샘플링 된 것 같은 코딩을 가지도록 오토인코더를 제어하는 latent loss 이다.

참고

Comments