2017년 2월 14일 화요일

초짜 대학원생의 입장에서 이해하는 Deep Convolutional Generative Adversarial Network (DCGAN) (2)

Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks - Alec Redford et al. (2016)을 기본으로 작성한 리뷰. 

이전 글에 이어 빠르게 DCGAN 결과와 분석 내용을 다뤄보도록 하겠습니다. 먼저 저번 글에서 이번에 소개할 내용과 관련된 부분을 한번 더 짚고 넘어가겠습니다.

빠른 복습


생성 모델들에 대한 연구에서 꼭 보여줘야할 내용은 다음과 같습니다:

  1. Generator가 이미지를 외워서 보여주는 것이 아니란 것을 확인시켜줘야합니다. (즉, memorization이 일어난 것이 아니란 것을 보여줘야 합니다.) 
  2. Generator의 input 공간인 latent space ($z$ space)에서 움직일 때 급작스러운 변화(sharp transition)이 일어나는 것이 아닌 부드러운 변화를 보여줘야합니다. (이를 논문에서는 "walking in the latent space"라고 표현하는데요 재미있는 표현인 것 같습니다.)

1과 2는 사실 같은 맥락에서 이해할 수 있다고 말씀드렸었죠. Memorization이 일어난다는 말은 Generator가 유의미한 특정을 학습하는 것이 아니라 overfitting이 일어나서 1:1 matching을 하는 mapping을 배웠다는 얘기입니다. 따라서 굳이 latent space에서 어떤 부드러운 변화가 있을 이유가 없습니다(바로 옆의 $z$값이 다른 sample과 1:1 연동이 될 수 있다는 말입니다.).



테스트 데이터셋


논문을 보시면 총 세 가지 데이터셋에 대해 DCGAN을 이용하여 학습한 결과를 확인할 수 있습니다. 
  • LSUN (Large-scale Scene Understanding): 침실 사진들이 모여있는 데이터셋
  • FACES: web에서 random image들을 받아와서 근대에 태어난 사람 얼굴을 모았다고 하네요. 
  • IMAGENET-1K: DCGAN으로 학습시킨 후 disriminator의 feature를 가져다가 K-means classification을 하니 state-of-art 결과와 비등한 정도의 정확도를 보였다고 하네요. 대단한 것은 DCGAN은 IMAGENET-1K 데이터로 학습한 후 K-means test는 CIFAR-10으로 했는데도 이렇다고 합니다. 특징 추출(Feature Extractor)로써의 역할을 DCGAN이 잘 해줄 수 있다는 점을 시사하고 있습니다. 

LSUN의 경우 Deduplication이라고 해서 혹시나 생길지 모르는 1번 문제 즉, memorization 문제를 피하기 위해서 이미지들을 Autoencoder를 이용하여 짧은 code로 변환할 수 있도록 학습한 후 이 code들에서 가까운 값들을 제거했다고 합니다. 비슷한 이미지들을 약 275,000개 제외할 수 있었다고 하네요. 기술적인 내용이긴 하지만 논문을 보다가 무슨 소린가 할 수 있는 부분이라 부연해보았습니다. 

DCGAN 결.과.


이제 끝판왕 결과들을 하나씩 보시죠(어서 결과를 보자! 결과!). 먼저 LSUN 결과입니다. 앞서 얘기했던 1번 문제(Memorization)가 일어나지 않았다는 것을 검증하기 위해서 네트워크에 학습 데이터(training data)를 한 번만 보여준 결과를 확인해줍니다. 한 번 밖에 안 보여줬기 때문에 학습이 아무리 빠르게 되었더라도 과학습(overfitting)이 일어났을리는 없을테죠. Random initialization 된 filter들이 조금 조정될 수는 있지만 과학습이 일어나기엔 너무 이릅니다.

아래 그림은 DCGAN이 이런 경우에도 첫 epoch만에 문제가 없이 (이미지를 외워서 그대로 내보내는 것이 아닌) 이미지를 스스로 잘 만들어내었다는 것을 보여줍니다. 

한 번 epoch을 돌려 학습한 후 생성된 침실 사진

오 신기하지 않나요? 자세히 보면 좀 많이 이상하지만 이미 언뜻 보기에는 그럴 듯한 침실 사진들을 볼 수 있습니다. 조금 더 학습을 시키면 다음과 같은 결과가 나옵니다:


다섯 번 epoch을 돌려 학습한 후 생성된 침실 사진

와 진짜 신기하지 않나요? 전 처음 봤을 때는 정말 충격적이었는데요....정말 조금 더 자세히 봐도 꽤나 그럴 듯 합니다.

논문에서는 overfitting이 아니라 오히려 아직 underfitting이 일어났다고 말하면서 그 증거로 침대의 머리 부분에 약간의 노이즈 질감이 반복되는 것을 볼 수 있다고 주장하는데....(사실 이렇게 작은 그림에 내가 어떻게 그걸 알아...) 여하튼 그렇다고 합니다.

"Walking in the latent space"

1번 문제는 그렇다치고 2번 문제에 대해서도 검증을 해줘야겠죠. 위 그림이 바로 DCGAN에서 학습된 Generator의 input인 $z$값(latent space)을 조금씩 바꿔가면서(walking) 생성되는 output 이미지가 어떻게 바뀌는지를 확인한 그림입니다.

아주 부드럽게 그림이 바뀌는 것을 확인하실 수 있습니다. 특히 중간에 여섯 번째 줄의 그림들을 보면 벽이었던 곳에서 서서히 커다란 창문이 있는 방으로 바뀌어가는 것을 보실 수 있는데 놀랍기 그지 없습니다 (DCGAN 짱짱맨).


What are the filters looking at?

앞서 CNN이 black-box 모델이라 안이 어떻게 돌아가는지 모르고 쓸 뿐이라는 지적을 받고 있다고 말씀드렸었죠? DCGAN 논문에서는 이 부분을 조금이나마 보여주고자 input까지 backpropagation을 하여 어떤 input이 discriminator가 학습한 feature의 어떤 부분을 active하게 하는지를 보여주고 있습니다. 

왼쪽 그림과 같이 filter가 무작위 값을 가지고 있는 경우는 딱히 구조를 특정할 수 없지만 학습된 filter들은 나름 DCGAN이 구조의 특징들을 이해하고 구별하여 침대나 창문과 같은 구조 등으로 나누어 역할을 담당하고 있는 것을 확인할 수 있습니다. 

"학습한 특징을 잊어버리기"

심지어는 각 특징을 맡고 있는 filter를 dropout 시켜서 이미지를 생성하면 실제로 이미지에서 해당 특징이 사라지는 즉, "학습"뿐만 아니라 "잊어버리는" 것이 가능하다는 것을 보여줌으로서 역설적으로 학습이 매우 잘 되었다는 것을 보여주고 있습니다. 
* 마치 강제로 치매에 걸리게 한달까...

실제로 위의 그림에서 첫 번째 줄의 그림에서 두 번째 줄의 그림과 비교해볼 때 창문이 사라진 것을 확인할 수 있습니다. "창문"을 학습한 filter를 없애고 이미지를 생성한 결과 창문 대신 다른 특징으로 채우려고 네트워크가 노력한 것이 보입니다. 예를 들어 여섯 번째 그림을 보시면 창문 대신 일반 문이 대신 들어가 있는 듯한 그림을 보실 수 있습니다. 
* 이거 저만 신기한가요?... 뭔가 당연한데 이렇게 분석해주니까 매우 있어보이고 그럴듯 해.... 이렇게 분석을 해서 썰을 푸는 것도 능력이죠...


Vector arithmetic for visual concepts

드디어 이전 글에서 처음 보여드렸던 결과를 보여드리는군요. 설명이 필요없을 정도로 그림만 봐도 신기합니다. 물론 Generator의 input인 $z$ vector가 하나로는 잘 안 되어서 세 개 정도를 평균한 $\bar{z}$를 사용해야 위와 같은 결과가 나왔다고는 하는데 어찌되었든 신기한 것은 매한가지입니다. 

사실 $z$ input은 Gaussian noise이기 때문에 $z$가 특별한 것이 아니라 Generator가 학습한 어떤 함수 즉 mapping이 매우 대단한 것인데요 앞선 글에서 한 번 말씀드렸듯이 어떻게 보면 네트워크가 영상의 의미를 이해했다고 생각할 수 있습니다. "남자"를 생성하는 mapping이 단순히 1:1 matching을 하고 있는 것이 아니란 것이죠. 

"회전"이란 의미를 이해하기

네트워크가 무언가를 이해했다는 말이 과하지 않다고 생각하는 것이 위 그림의 결과가 다시 한 번 이를 뒷받침해주고 있기 때문입니다.

왼쪽을 보고 있는 얼굴을 만들어내는 input $z_{left}$들의 평균 vector $\bar{z}_{left}$과 오른쪽을 보고 있는 얼굴에 대응하는 $z_{right}$들의 평균 vector $\bar{z}_{right}$를 계산하고 이 두 벡터의 사이를 잇는 축(axis)을 interpolating하여 Generator에 넣어보았더니 천천히 "회전(turn)"하는 얼굴들이 나오는 것을 볼 수 있었다네요.

어떠신가요? DCGAN 이쯤이면 끝판왕이라 할 만하죠? 솔직히 논문의 이론적 면에서는 전혀 새롭거나 대단하단 느낌을 받을 부분이 없었는데, 일단 잘 되는 구조를 찾고(사실 이 부분이 매우 대단하지만) 그 구조의 요소들은 크게 새로울 것은 없지만 그 것을 바탕으로 나온 결과를 신선한 시각으로 다양한 각도에서 분석하고 정리한 부분이 매우 인상적인 논문이었습니다.

물론 아직 할 일이 많이 남아있긴 합니다. DCGAN이 GAN의 불안정한 학습을 많은 부분 해소해주기는 하였습니다만 간혹 너무 학습을 오래 할 경우 여전히 mode collapsing이나 oscillating mode 등의 불안정한 모습을 보입니다.

이 후 이런 부분을 좀 더 해소해준 Unrolled GAN이나 위에서 말했던 "회전"과 같은 개념을 학습하는 것을 더 잘하게 해주는 InfoGAN 같은 논문들이 작년에 발표되기도 하였는데요 이 논문들도 읽기는 했지만 찬찬히 시간이 날 때 또 글로 정리해보도록 하겠습니다.

일단 당장은 또 Wasserstein GAN이란 것이 나와서 좀 정리해보는 중입니다ㅎㅎ 왜 이렇게 발전이 빠르고 볼 것이 많은지...어느 세월에 제 스스로 생각해서 새로운 것을 만들 수 있을지 모르겠습니다. 더 노력해야겠습니다.

다음 읽을거리

(GAN이 어떻게 이런 이미지를 만드는지 알고 싶다면)
(GAN의 다른 application을 보고 싶다면)

참고문헌:
[1] Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks - Alec Radford et al. 2016
[2] Generative Adversarial Nets - Ian Goodfellow et al. 2014 논문, 
[3] NIPS 2016 Tutorial: Generative Adversarial Networks



댓글 8개:

  1. 항상 잘 보고 있습니다. 감사합니다

    답글삭제
    답글
    1. Unknown님 댓글 감사합니다. 보람이 있군요 :)

      삭제
  2. Ian 2014 논문 읽다가 GAN, DCGAN 을 알게 되었는데 아직 머신러닝 초보라 많이 헷갈렸었거든요. 이 블로그가 정말 크게 도움이 되네요. 중간중간 수식도 증명해 주시고 말입니다. 팔로우 했습니다! 정말 감사해요. :)

    답글삭제
    답글
    1. Unknown님 안녕하세요 댓글 감사합니다. 도움이 되셨다니 다행입니다 ㅎㅎ

      삭제
  3. 안녕하세요. 포스팅 너무 재밌게 잘 보고 있고, 논문을 보면서 이해하는 데 많은 도움이 되었습니다.

    다름이 아니라, 본 논문은 DCGAN을 이용한 unsupervised learning이 갖는 효과를 보여주는 것으로 보이는데요. 결과를 설명할 때는 label을 갖는 이미지를 이용하여 보여주는 것으로 보입니다.
    Figure 7 & 8 같은 경우, unsupervised learning을 통해서 학습한 DCGAN에 labeled image를 이용하여 latent space Z를 비교했다고 보면 될까요?
    논문을 완전히 이해하지 못해서 이 부분이 헷갈리네요..

    답글삭제
  4. 좋은 글 잘 읽었습니다 ㅎㅎ

    궁금한게 있어서 댓글을 남기게 되었는데요

    주어진 이미지에 해당하는 latent vector (z)를 항상 찾을 수 있나요?

    generator가 non linear 함수이기 때문에 주어진 이미지에 해당하는 latent vector가 유일하지 않을 수도 있을 것 같습니다...

    저의 경우에는 latent vector를 잘 찾지 못하네요...혹시 이와 관련된 논문을 알고 계시면 알려주시면 감사하겠습니다 ㅎㅎ

    답글삭제
  5. In feature extractor part, how did they get 28672 dimensional vector by using 4*4 spatial grid? What will be the input image size? Please help me to figure out this.

    답글삭제
  6. """
    "Walking in the latent space"

    1번 문제는 그렇다치고 2번 문제에 대해서도 검증을 해줘야겠죠. 위 그림이 바로 DCGAN에서 학습된 Generator의 input인 z값(latent space)을 조금씩 바꿔가면서(walking) 생성되는 output 이미지가 어떻게 바뀌는지를 확인한 그림입니다.
    """

    여기서 z값을 바꾼다는 게 벡터 성분 값을 바꾸는 걸 말하는 건가요? 맞다면 어떤 방식으로 바꿔야 저렇게 자연스럽게 흘러가나요?

    답글삭제