1. Autoencoder
Autoencoder란 고차원의 input data를 저차원의 latent vector로 압축시킨 후에,
이를 다시 input data shape으로 복원하는 모델이라고 할 수 있습니다.
학습 과정은 단순합니다.
input과 output의 차이를 최소화하는 식으로 학습하면 되죠.
Autoencoder는 Denoising, 데이터 압축에 사용하고, 생성된 latent vector는 input의 feature로 사용하기도 합니다.
2차원으로 압축된 latent vecotr를 시각화하면 위와 같은 그래프가 나옵니다.
숫자들이 어느정도 알맞게 모여있는 것을 보실 수 있습니다.
3 같은 경우 8과 매우 비슷하게 생겼죠?
그래프 상에서도 가까운 거리에 위치해 있습니다.
2. VAE (Variational Autoencoder)
Auto-Encoding Variational Bayes (2013) - Universiteit van Amsterdam
VAE는 말 그대로 변형된 오토인코더입니다.
Encoder는 입력 데이터를 표현하는 분포의 평균과 분산을 찾도록 학습됩니다.
Decoder에서는 정규 분포에서 noise를 샘플링한 후, 이를 이용해 새로운 output을 생성합니다.
따라서 학습 목표는 두 가지가 됩니다.
- 입력 이미지와 출력 이미지가 비슷해지게 학습
- Latent space의 분포가 정규 분포와 동일해지게 학습
다만, 학습을 위한 function을 생성할 때 약간의 문제가 있었다고 합니다.
p_θ(x): 데이터 x가 생성될 확률
p _θ(x|z): latent vector z가 들어왔을 때 x를 생성할 확률
p(z): latent vector z에 대한 사전 확률
θ는 Decoder의 파라미터 입니다.
위의 수식과 같이 Decoder 만을 가지고 모든 z에 대해서 우항을 적분하는 것은 매우 어려운 일입니다.
따라서 vae 저자들은 Encoder도 학습에 포함시키는 방법을 고안하였습니다.
맨 첫 줄에서 추가된 개념은 바로 latnet vector z는 입력 x가 들어왔을 때 인코더가 z를 생성할 확률 분포를 따른다는 것입니다.
이후 베이지안 룰, 상수 곱셈, Logarithm에 의해 맨 아랫줄의 수식이 완성됩니다.
빨간 줄 친 term은 이해가 안 돼서 찾아본 결과, KL-Divergence 정의와 관련이 있었습니다.
여기서 세 번째 term의 경우에 p_ θ(z | x^(i)) 이 포함되어 있습니다.
이는 디코더에 입력 x가 들어왔을 때 latent vector z가 생성될 확률을 뜻하므로, 구할 수 없습니다.
따라서 KL-Divergence는 항상 0보다 크다는 사실을 이용하여 세번째 term을 처리하고,
위의 수식 ELBO(Evidence Lower bound)를 최대화하는 식으로 VAE를 학습시켰다고 합니다.
- 입력 이미지와 출력 이미지가 비슷해지게 학습
- Latent space의 분포가 정규 분포와 동일해지게 학습
앞에서 말했던 두 가지 목표가 충족되는 것을 볼 수 있습니다.
3. GAN (Generative Adversarial Networks)
Generative Adversarial Networks (2014) - University of Montreal
GAN은 Generator와 Discriminator라는 두가지 모델로 구성되어 있습니다.
Generator: Discriminator를 속이기 위해서 최대한 진짜 같은 이미지를 생성해 내는 모델
Discriminator: Generator가 생성한 이미지가 Real인지 Fake인지 판단하는 모델
검은색: 훈련 데이터의 분포
초록색: Generator가 생성한 데이터의 분포
위의 사진처럼 Generator의 분포가 훈련 데이터의 분포와 유사해지면,
Discriminator가 생성하는 결과의 분포는 1/2이 될 것입니다. (파란색 선)
Objective function을 요약하자면 다음과 같습니다.
- Max (Discriminator 입장): D(x)가 진짜 데이터를 1에 가깝게, 가짜 데이터를 0에 가깝게 출력하도록 최대화하려고 합니다.
- Min (Generator 입장): G(z)가 생성한 가짜 데이터를 판별기가 진짜라고 인식하도록 최소화하려고 합니다.
그래서 이것을 min-max 최적화 문제라고 부른답니다.
먼저 Discriminator의 objective function을 살펴봅시다.
첫 번째 term은 진짜 이미지가 들어왔을 때 이를 1로 판별하도록 하는 수식이고,
두 번째 term은 Generator가 생성한 이미지가 들어왔을 때 이를 0으로 판별하도록 하는 수식입니다.
따라서 결괏값을 maximize 하기 위해 gradient ascent로 parameter를 학습합니다.
Generator의 objective function은 위와 같습니다.
원래는 위의 수식처럼 Discriminator의 결과가 1에 가까워지게 해서 objective function을 최소화하는 것이 목적이었습니다.
이 function으로는 학습이 불안정하여 아래와 같이 바꿨다고 합니다.
학습은 Discriminator -> Generator 순서로 반복됩니다.
Generator의 경우 iteration당 1번씩 학습되지만,
Discriminator의 경우 어떤 연구에선 1번이 좋다고 하고, 어떤 연구에선 1번 이상의 횟수로 학습하는 것이 좋았다고 합니다.
하지만 GAN에도 여러 단점이 있었다고 합니다.
그중에서 가장 유명한 문제가 바로 Mode Collapse입니다.
이것은 Generator가 Discriminator를 잘 속일 수 있는 특정 패턴을 찾아낸 후에 계속해서 해당 패턴만 생성해 내는 문제입니다.
이렇게 되면 두 모델 모두 학습이 제대로 이루어지지 않는다는 문제가 생깁니다.
이후 나온 GAN 계열 모델들은 여러 가지 기법을 사용해서 output의 품질을 높입니다.
궁금한 내용 댓글 남겨주시면 빠르게 답변해 드리도록 하겠습니다. 😍