서론
이 장은 Auto Encoder와 Variational Auto Encoder에 대해서 설명한다.
목차
Auto Encoder
- Auto-Encoder는 기본적으로 데이터를 압축하고 복원하는 모델로 입력 데이터를 저차원 공간으로 압축(Encoding)하고, 압축된 저차원 데이터를 다시 원본 데이터로 복원하는 과정을 통해 학습한다.
- Unsupervised Learning 방법으로 레이블 필요 없이 원본 데이터를 레이블로 활용한다.
Auto Encoder의 구조는 아래와 같다.

입력 \(x\)와 출력 \(y\)가 최대한 동일한 값을 갖도록 하는 것이 목적이며 입력의 정보를 압축하는 구조를 Encoder, 압축된 정보를 복원하는 구조를 Decoder, 그 사이에 있는 \(z\)를 Code, Latent Variable 등이라고 부른다.
- Auto Encoder에서 저차원 표현 \(z\)는 아래 그림과 같이 원본 데이터의 함축적인 의미를 가지도록 학습된다.

위 예시처럼 물체의 형상, 카메라 좌표, 광원의 정보와 같이 명시적으로 Latent Variable이 저장되지는 않지만 어떤 특정 정보가 저장된다는 점은 일치하다.
머신러닝모델에서 feature라고 불라는 것과 같으며 학습 과정에서 겉으로 드러나지 않는 숨겨진 변수임으로 Latent Variable이라 불리게 된다.
Auto Encoder의 Latent Variable은 입력을 압축하여 Feature를 만들기 때문에 Feature Exractor의 역할을 수행할 수 있다.

위 그림과 같이 학습이 완료된 Auto Encoder에서 Encoder와 Latent Variable까지만 가져와 Feature \(z\)를 추출하고 그 값을 이용해 다른 머신러닝 classification과 섞어서 사용한다.
- Mnist 데이터를 이용해 Auto Encoder를 사용한 결과는 아래 예시와 같다. 학습이 완료된 네트워크에 숫자 7과 2를 넣으면 오른쪽처럼 흐릿하지만 원본과유사한 데이터가 생성되는 것을 확인할 수 있다.

Variational Auto Encoder
VAE는 랜덤 노이즈로 부터 원하는 영상을 얻을 수 없는 지에 대한 의문에서 시작된다.
아래 그림을 보면 2D Random Noise를 입력으로 받았을 때 오른쪽과 같이 사람의 이미지를 만들어 낼 수 있는지에 대한 문제이다.

- 일반적으로 이미지에서 색상은 8비트로 표현되며 \(2^8\), 256(0~255)가지의 다양한 값을 표현할 수 있다.
- 따라서 1x1이미지 라고 한다면 한 개의 픽셀은 256(R) * 256(G) * 256(B) = 16,777,216가지의 다양한 색상을 표현할 수 있다.
- 그리고 영상의 모든 픽셀에 대해 이러한 조합을 고려하면, \(256^{h\times w\times 3(channel)}\) 로 총 가능한 영상의 수를 계산할 수 있다.
예를 들어 Random Noise를 통하여 위 그림과 같은 이미지를 얻을 확률은 \(\frac{1}{256^{h\times w \times 3(channel)}}\)생각할 수 있다.
VAE의 처음 질문이 Random Noise를 통해 원하는 영상을 얻을 수 없을까? 였는데 위 확률처럼 원하는 이미지가 나오기에는 첫 문학적인 확률임으로 원하는 영상을 얻을 수 없다.

만약 \(p_{data}(x)\)라는 데이터셋이 있고 이 데이터 셋을 이용해 데이터셋을 잘 나타내는 분포를 만들고 Random Noise가 그 분포중 하나에 sample에 해당된다면 데이터셋을 나타내는 분포 내에서 랜덤값이 생성되기 때문에 데이터셋과 유사한 값을 뽑아낼 수 있다.
- 예를들면 아래 그림의 희미한 얼굴 사진과 같다.
- 아래 분포는 VAE의 latent variable의 분포에 해당된다.
- 이런 방법은 Uniform한 Random Noise를 만드는 것과 다르게 Dataset이 가지는 확률분포 내에서 Random Noise를 만드는 것으로 차이가 있다.

Difference between Auto Encoder and VAE
Auto Encoder
- 네트워크의 Encoder를 학습하기 위해 Decoder를 적용한 것으로 Sample의 차원을 줄였다 늘리는 과정을 통하여 sample을 잘 설명하는(
Manifold Learning) latent variable을 도출하도록 학습한다.(Encoder에 중점!!)

VAE
- 주 목적은 데이터를 생성(
Generative Model)하기 위함이다. 따라서데이터의 분포 자체를 학습한다. Decoder를 통해 학습하기 위해(이미지를 생성하기 위해) Encoder를 적용한 것이다.(Decoder에 중점!!)

- 데이터셋이 VAE의 Encoder 쪽으로 들어가면 latent variable의 분포인 latent distribution으로 나타내어 진다.

- 이 latent distribution에서 랜덤으로 샘플링을 하면 latent distribution에 대응 되는 의미(Smile, Skin tone, Gender …)에 따라 다른 출력의 이미지를 생성하도록 할 수 있다.
- 아래 예시에서는 노란색 / 빨간색 샘플링 방식에 따라 전혀 다른 모습의 이미지가 생성된 것을 볼 수 있다.

- VAE의 전체 아키텍쳐를 보면 인풋으로 데이터를 받은 뒤 Encoder 부분에서는 latent variable을 생성하도록 학습한다.
- 이 때, latent variable로 \(\mu, \;\sigma\)를 생성한다.
- 가우시안 노이즈 \(N(0,\;1)\)과 ① latent variable σ와 곱해지고 ②μ와 더해져서 Decoder의 Input으로 전달되어 집니다.
- Decoder에서는 이 값을 원본 데이터 해상도 만큼 복원시켜서 원본 인풋과 유사해지도록 학습합니다.

Auto-Encoder 학습
- 입력(x)와 출력(x’)이 동일한 차원을 갖는 신경망
- (x, x’) \(\in \R^d\)
- Encoder의 출력
- \(z = h(x) = w_ex + b_e\)
- Decoder의 출력
- \(y = g(z) = g(h(x)) = w_dz + b_a\)
- Loss
- \(L(x, y) = L(x, g(h(x))) = ||x -y||^2\)

Auto-Encoder 추론
- 학습이 완료되면 Decoder부분을 제거한다.
- z의 잠재벡터(Latent)를 이용하여 출력\((\hat y)\)를 원하는 Task의 입력으로 사용한다.

Comment