generative model 쪽이 요즘 핫하다 보니 논문이 너무 빨리 나오는 분야이기도 하고, 또 내가 물리학 전공자라 이 쪽의 정보는 어디서 얻는지 잘 모르기도 하기 때문에 이 구조가 기존에 있는지 없는지에 대해선 잘 알지 못한다.
아무튼 GAN이 대세인 때에 뜬금없이 auto encoder라고 하니 좀 시대에 뒤처져 보인다. 다만 나는 이 아이디어를 고안할 때 그저 random generation보다는 latent space에서의 embedding과 generation을 모두 어느 정도 잡길 바라는 마음이었다. 즉 이 구조는 이미지의 quality, latent space에서의 embedding을 다 잡기 위해서 고안해낸 여러 가지 시도 중 하나이다. (conditional에 대한 연구들은 다 알고 있지만 그 당시에 내가 필요한 건 likelihood이지 conditional이 아니었다.)
사실 내가 짜려던 프로그램에서는 BEGAN을 쓰려고 했다. 그러나 내가 구현하려는 작업에서는 latent space에서 pixel space로, 그리고 pixel space에서 다시 latent space로 양방향의 복원이 필요했고 이를 위해서는 따로 interpolation을 학습해야 한다는 사실을 이해하고 나서 포기했다. 이후 다시 고안한 아이디어가 바로 이것이다. (게다가 BEGAN은 quality와 variation이 서로 심하게 상충되는 단점이 있었다. BEGAN만 거의 반 년 넘게 hyperparameter를 수정해가면서 돌린 결과가 그랬다.)
결과만 놓고 보면, 절대로 성공적인 결과물 같지는 않고 hyperparameter의 튜닝도, 추가적인 학습도 충분히 해보지 않았다. 그래도 상당히 재밌는 아이디어였다고 생각되기에 올려본다. 물론 generative model이 너무나 많이 나왔기 때문에 이 아이디어도 기존에 없던 새로운 아이디어라고 확신하기엔 곤란하다.
아이디어의 시작은 auto encoder가 real sample이 채우고 있지 않은 latent space의 '나머지 부분' 을 과연 어떤 식으로 generation시키는 것이 효율적인지에 대해 고민한 게 시작이었다. vanilla auto encoder의 latent space를 tensorboard의 histogram으로 관찰한 결과 대개 매우 broad한 gaussian 형태가 나왔다.
그래서 reconstruction과 동시에 latent space에 비슷한 형태의 noise를 주입하고, 이것이 decoder를 통과해 나온 output을 discriminator에 넣기로 했다. 즉 reconstruction과 generation을 동시에 해서 embedding과 generation을 잡고, 덩달아 mode collasing도 없애보자는 것이 나의 생각이었다. reconstruction에 의해 latent space에서 sample들이 차지하고 있는 영역들 때문에 mode가 saturation을 일으킬 확률은 아무래도 낮을 테니까. reconstruction이 일종의 guiding을 해주는 셈이다.
다만 그냥 이러한 구조대로 넣으면 reconstruction에 의한 latent space가 너무 broad한 gaussian 형태를 띄므로, latent space에 대해 l2-regularization term을 넣었다.
구조를 대강 그리면 이렇게 될 것이다. 대충 그리다 보니 input의 reconstruction 부분이 빠졌다. 다시 그리긴 귀찮다...
loss는 LSGAN에서 따와 least square loss를 쓰는 편이 더 효과가 괜찮았다. discriminator는 ResNet을 썼다. 추가로 denoising term도 들어갔지만, 따로 표시는 하지 않았다. 논문 쓸 것도 아니고...
전체적으로 보면 GAN에 auto encoder를 unifying한 형태이다. 돌릴 때는 재밌는 아이디어다 싶었는데, 돌려놓고 나서 결과가 그냥저냥 나오기에 조금 더 이론적으로 분석하니 결과적으론 adversarial auto encoder를 괜히 더 복잡하게 꼬아놓은 듯한 구조가 아닐까, 라는 생각이 들어 조금 짜증이 나서 100k 정도 돌리고 학습을 멈추었다.
사람의 얼굴을 대상으로 한 랜덤 샘플링 결과는 다음과 같다. 해상도는 가로와 세로가 모두 128px인 정사각형.
cherry picking은 없다. 그럴 정도로 가치가 있는 퀄리티도 아니고... 어차피 다른 아이디어는 많고 이 아이디어는 하루 정도만에 생각해서 가다듬은 아이디어였으니 결과가 나쁘다 해도 그리 아깝지는 않다.
Titan V 정도의 GPU만 있었어도 생각한 아이디어들은 다 돌려볼 수 있었을 것이다만... 구글의 TPU가 탐이 나는 요즘이다. 난 개인적으로 연구하는 것이라, 구글이 연구자들에게 무료로 제공하는 구글 클라우드에 가입도 못한다.
같이 이런저런 얘기도 하고 연구할 수 있는 사람이 있었으면 좋겠다. 머신러닝에 대해 아무 것도 모르는 상태에서 2년 동안 짬짬이 공부해왔다. 난 물리학도였고 어려운 수학엔 익숙해서, 최신의 GAN 논문에 나오는 수학적 내용을 쉽게 이해할 정도의 지식은 갖추고 있지만 그래도 많이 부족하다. 특히 그 복잡한 notation들을 좀 알려줄 사람이 있었으면 좋겠다. 수학과 물리학은 친한 듯 안 친해서 그런 부분들이 많이 다르다 보니 시간이 오래 걸린다.