2018년 4월 28일 토요일

일전의 auto encoder를 조금 개선해 봤다.

 이제는 거의 GAN이 되어가는 것 아닌가 싶지만.

 네트워크 구조는 동일하고 대신 reconstruction loss를 encoder 단에만 실리도록 구조를 바꾸었다. 이렇게 되면 decoding은 온전히 GAN이 관여하는 대신에 likelihood를 latent space 상에서 교정해준다.

 구조를 이런 특이한 형태로 바꾼 이유는 GAN의 강점인 sharp한 이미지가 reconstruction loss로 인해 무너지기 때문이다.

 이 구조에 들어간 intuition을 쉽게 얘기하면 generator가 생성하는 이미지는 어떻게 되든 좋으니, 대신 real distribution에 해당하는 이미지들과 최대한 가깝게 생성할 수 있도록 강제하는 것이다. 이렇게 된다면 discriminator의 혼동과 관계없이 generator 자체에 강력한 constraint가 실리고, 결과적으로 mode는 collapsing할 수 없다. 함정이라면 여기에 사용한 GAN이 LSGAN이라 mode collapsing이 잘 안 일어난다는 거지만, mode를 좀 더 세세하게 나눌 수 있을 거라고 예측된다. 여튼 embedding이 된다는 것만으로 만족이지... 결론적으로 말하면 결과는 나쁘지 않다. 실제 이미지와 동떨어진 이미지가 몇 개 등장하긴 했지만 어차피 embedding은 대강만 되어도 충분하니까.




(좌: 생성된 이미지, 우: 실제 이미지)




(랜덤 생성 이미지)

 이미지가 살짝 hole이 많이 들어가고 품질이 떨어진 것은 훈련이 100k에서 멈췄기 때문이다.

 ...한편으로는 이런 무식한 방법으로도 어떻게든 해결이 되는 듯한 deep learning에 치얼스...

PS. VAEGAN이랑 똑같아 보이면서 조금 다르다. 이 모델은 reparametrization이 없고 distribution에 regularization이 들어간다. decoding에는 관여하지 않는 것도 차이점. 다만 디코딩 성능은... 저 쪽이 결과가 더 좋아보이네. 으.

2018년 4월 27일 금요일

내 블로그의 제목.

 인공지능... 그러니까, 지금 우리가 쓰는 약인공지능이 아닌 강인공지능이 우울증에 걸리면 어떻게 될까. 은하수를 여행하는 히치하이커를 위한 안내서에 등장하는 로봇을 패러디한 것은 아니지만 어쩌다 보니 느낌이 비슷하다.

 아무튼 인공지능이 만약 우울증에 걸린다면 사람과 같은 행동을 할까. 아니면 다른 양상을 보일까. 애초에 우울증에 걸리긴 할까.

 그냥 그런 호기심에서 지은 제목이다. 우울증이야말로 뇌의 가장 이상한 행동이 아닐까 싶으니...

2018년 4월 24일 화요일

혼자 연구하는 것은 힘들다.

 개인적인 열정만으로 연구를 하다 보니, 혼자서 연구하는 건 매우 벅차다는 느낌이 든다.

 2년이라는 짧은 시간 동안 도와주는 사람 없이 이것저것 많이도 건드렸는데, 정말 이 쪽 분야로 취업을 하든지 해서 뭔가 협업을 좀 해보고 싶다. 모든 아이디어를 혼자 실현 및 검토해야 하는 현실도 그렇지만, 하드웨어도 한계를 느끼고, 금전적인 부분도 다소 문제가 있고, 데이터를 혼자 구하고 만드는 것도 슬슬 버겁다.

 석사를 따기 위해서였다곤 하지만 28세에 병역도 취업도 해결이 안 됐다는 건 다소 큰 디메리트이다. 이 분야로 취업할 수 있을까. 돈 벌 수 있을까. 누가 나 좀 뽑아주세요. 머리는 좋아요. 진짜로. 으하하.

2018년 4월 17일 화요일

새로운 형태의 auto encoder를 만들어 보았다.

 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들을 좀 알려줄 사람이 있었으면 좋겠다. 수학과 물리학은 친한 듯 안 친해서 그런 부분들이 많이 다르다 보니 시간이 오래 걸린다.