No Limitation
[Paper Review] Unsupervised Representation Learning with Deep Convolution Generative Adversarial Networks 본문
[Paper Review] Unsupervised Representation Learning with Deep Convolution Generative Adversarial Networks
yesungcho 2022. 5. 10. 00:08본 리뷰는 제 개인 유튜브 채널에도 리뷰 영상을 올려놓았습니다. 참고 바랍니다.
https://www.youtube.com/watch?v=XQNRgZ2-RKg
본 포스팅은 다음 자료들을 참고하였습니다
Reference :
[1] https://greeksharifa.github.io/generative%20model/2019/03/17/DCGAN/
[2] Metz, L., Poole, B., Pfau, D., & Sohl-Dickstein, J. (2016). Unrolled generative adversarial networks. arXiv preprint arXiv:1611.02163
[3] https://memesoo99.tistory.com/32
[4] https://ysbsb.github.io/gan/2020/12/05/DCGAN.html
[5] https://wikidocs.net/147019
[6] https://eehoeskrap.tistory.com/431
[7] https://www.youtube.com/watch?v=tQYZaDn_kSg
[8] https://velog.io/@tobigs-gm1/basicofgan
[9] https://kau-deeperent.tistory.com/79
[10] https://ysbsb.github.io/gan/2020/12/05/DCGAN.html
[12] https://jaejunyoo.blogspot.com/2017/02/deep-convolutional-gan-dcgan-2.html
[13] https://developer-ping9.tistory.com/121
[14] https://iskim3068.tistory.com/35
[15] https://darkpgmr.tistory.com/117
[16] https://daebaq27.tistory.com/92
[17] https://memesoo99.tistory.com/33
[18] https://github.com/Natsu6767/DCGAN-PyTorch
[19] https://github.com/safwankdb/Vanilla-GAN
[20] https://www.youtube.com/watch?v=AVvlDmhHgC4
Introduction
DCGAN으로도 잘 알려져 있는 본 논문은 GAN이 이미지의 여러 feature들을 잘 학습한다는 것을 여러 실험을 통해 보이고 있으며, GAN 특성 상 학습이 불안한 점을 보완하기 위해 약간의 모형을 개선한 DCGAN을 제안합니다. 본 논문에서는 저자는 다음 2가지를 강조하고자 합니다.
1. DCGAN을 사용하여 더 좋은 image representation을 만들어내고 (좋은 해상도와 안정적인 학습), 잘 학습된 Generator와 Discriminator의 일부를 떼어내서 이 녀석들을 supervised task를 위한 feature extractor로도 사용할 수 있다.
2. 또한 GAN을 이해하고 Visualize하는 것에 대한 논문이 이전에는 거의 없었다. GAN을 충분히 이해하고 생성된 image를 visualize해보는 것에 있어 본 논문은 큰 기여를 하였다.
GAN은 2014년에 발표된 이후로 생성 모델의 핵심 아키텍쳐가 되었습니다. 하지만 GAN이 무조건 만능은 아니었는데요. 첫 번째로 "학습이 불안"하다는 점이 대표적인 한계점이었습니다. 다음 그림을 보시죠.
맨 위의 수식은 GAN의 전체 objective function입니다. 보시다시피 Generator에서 objective function을 optimize하는 방향과 Discriminator에서 optimize하는 방향은 각각 상이한 것을 확인할 수 있습니다. Generator는 objective function을 minimize하려고 하기 때문에 gradient를 -방향으로 가중치를 업데이트 시켜주지만, 반면 Discriminator는 objective function을 maximize하려고 하기 때문에 gradient를 +방향으로 업데이트를 시켜주려 하기 때문에 학습이 간혹 불안정하게 진행이 되는 경우가 있습니다. 따라서 때때로 유사하지 않는 non-sensical한 output을 내놓는 경우가 존재합니다.
두 번째로는 "Mode Collision" 문제입니다. 다음 그림을 보시죠.
Mode Collision은 쉽게 말해 Generator가 똑같은 sample을 계속 생성해내는 문제를 의미합니다. 이 경우는 Generator가 Discriminator보다 더 학습이 잘 진행된 경우에 많이 발생하는데요, 예를 들어 Generator가 Discriminator를 속일 수 있는 특정 샘플을 생성하고 속이는 데 계속 성공한다면, 모형은 앞으로 이 샘플만 계속해서 생성할 것입니다. 하지만, 일반적으로 우리가 Generator에 기대하는 것은 똑같은 샘플 형성이 아닌 Discriminator를 속일 수 있는 분포 내에 있는 다양한 샘플들입니다. 따라서 이는 큰 문제를 야기할 수 있습니다. 다른 의미로 이는 Generator가 local minima에 빠진 것을 의미하기도 합니다.
저자는 다음과 같은 4가지로 본 논문의 Contribution을 이야기 합니다.
1. 우리는 DCGAN을 제안하는데, 이건 대부분의 상황에서 학습이 안정적인 Convolution GAN이다.
( 이 말은 기존 GAN을 구축한 Fully Connected Layer를 Convolution Layer로 바꾼 것을 의미하는데 자세한 것은 뒤에서 살펴보도록 하겠습니다. )
2. Discriminator에게 image classification task를 수행하라 했을 때, 다른 비지도 알고리즘에 비했을 때 좋은 성능을 보였다.
3. 특정 filter가 특정 object를 그리는 것을 알 수 있었다.
4. Generator에 들어가는 latent vector에 산술 연산을 한 결과로 많은 의미 있는 이미지를 생성하였다.
저 4가지에 대해 차근차근 하나씩 살펴보도록 하죠.
Model Architecture
저자는 GAN에서 CNN을 사용하여 이미지를 안정적으로 학습하여 생성하고 Resolution이 잘되게끔 하는 시도는 지금까지 성공적이지 못했다고 언급합니다. 그리고 저자는 다양한 데이터셋에 대해 안정적으로 학습을 수행할 수 있고 더 높은 해상도의 이미지를 생성하는 모델 구조를 발견했다고 언급합니다.
핵심은 바로 다음 3가지를 CNN에 적용시키는 것입니다.
1. 모든 네트워크에 있는 spatial pooling function을 strided convolution으로 교체
2. 모든 네트워크에 있는 Fully Connected Layer를 제거
3. Batch Normalization을 적용
1번 부터 살펴보겠습니다.
"모든 네트워크에 있는 spatial pooling function을 strided convolution으로 교체"
즉, max pooling 같은 pooling 기반의 함수를 strided convolution으로 대체했다는 것입니다.
구체적으로는 downsampling을 수행할 때는 strided convolution을 수행하고 upsampling을 수행할 때는 fractionally strided convolution을 수행한다는 거죠. 자 이게 무슨 말일지 살펴봅시다.
아래 그림을 살펴보겠습니다.
Max pooling의 경우는 위의 빨간 박스의 경우를 생각해보시면 좋을 거 같습니다. 7x7 input이 들어오고 3x3 kernel을 사용할 때 max pooling은 저렇게 3x3을 mapping할 때 예를 들어
2 3 7
6 6 9
3 4 8
에서 가장 큰 값, 즉 9를 pooling하게 되어 맵핑을 수행해주게 됩니다. 그리고 다음 1칸을 이동하여 마찬가지의 연산을 수행해줍니다.
반면 strided convolution은 무엇을 의미하냐면 일반적은 kernel을 사용하여 연산을 수행해주되, '보폭'을 설정해주는 것입니다. 파란 박스의 경우가 그 예시입니다. 예를 들어,
4 2 1
3 2 4
0 1 3
에 3x3 kernel을 맵핑 시키면
4x3+2x4+4x1+3x1+2x0+2x4+0x(-1)+1x0+3x3 = 44 이렇게 나오게 됩니다.
그리고 이 다음으로 1칸이 아닌 주어진 stride만큼 움직이게 됩니다. 위 그림의 경우 2로 주었기 때문에 한 칸이 아닌 두 칸을 이동하게 됩니다. 따라서 3x3인 output이 나오게 됩니다.
바로 이 방법이 기존 input 이미지의 차원을 줄여나가 represent한 latent feature로 만들어나가는 downsampling을 수행하는 spatial convolution입니다.
그렇다면 upsampling은 이러한 spatial convolution을 사용해서 어떻게 수행하게 될까요.
바로 "행렬 연산"을 차용합니다.
자 예를 들어 위의 downsampling의 경우, 편의상 stride=1로 설정한 경우를 예로 들면 다음과 같은 그림으로 나타낼 수 있습니다.
즉 3x3 kernel을 밑의 Sparse Matrix C로 나타낼 수 있으며 input을 1-dimension vector로 나타내어 둘의 행렬 연산을 취해주면 위의 strided convolution 연산이 가능하며 이 때 1-dimension의 output vector가 나오게 됩니다. 그리고 이 폼을 바탕으로 upsampling을 수행합니다. 아래 그림을 보시죠
자 이 경우 위에서 구한 Sparse Matrix C를 transpose 시킨 행렬에 output vector를 곱해주어 다시 input을 복원시키는 방법으로 연산을 수행하게 됩니다. 이 방법이 바로 fractionally strided convolution입니다. 이렇게 transpose시킨 행렬을 이용하기 때문에 transpose convolution이라고도 표현합니다.
자 다음으로 2번을 살펴보겠습니다.
"모든 네트워크에 있는 Fully Connected Layer를 제거"
즉 말 그대로, Fully Connected Layer를 제거해서 Convolution Layer로 대체했다는 것을 의미합니다. 당연하게도 이미지의 특징을 읽어올 때는 fully connected layer를 사용할 때는 이미지 내에 있는 object의 위치나 여러 특징들의 정보가 손실되기 쉽습니다. 따라서 convolution layer는 이러한 특징들을 filter를 통해 위치 정보를 represent할 수 있다는 점에서 CNN은 큰 각광을 받게 되었습니다. 이에 대한 자세한 설명은 아래 블로그 포스팅을 참고 바랍니다.
https://towardsdatascience.com/convolutional-layers-vs-fully-connected-layers-364f05ab460b
실제 git code를 뜯어보면서 살펴보겠습니다.
왼쪽의 경우 일반적인 Vanilla GAN의 Generator고 오른쪽의 경우는 DCGAN의 Generator입니다. 빨간 색 박스를 보시면 일반적인 FC Layer가 전부 Convolution Layer로 바뀐 것을 볼 수 있습니다. 그리고 위에서는 ConvTranspose2d로 Transpose Convolution을 적용한 것을 확인할 수 있습니다.
Discriminator도 마찬가지로 Convolution Layer를 적용함을 확인할 수 있습니다.
3번 내용도 살펴보겠습니다
"Batch Normalization을 적용"
Batch Normalization은 batch 단위로 학습을 수행할 때 batch 별 형성되는 distribution이 다른, 즉 internal covariate shift 문제가 발생하여 이를 해결하기 위해 나온 방법입니다. 2015년에 나온 방법으로 현재 딥러닝 기반의 모형에서는 당연하게 사용되고 있지만 DCGAN 논문이 나온 당시에는 Batch Normalization이 적용되는 연구들이 막 등장하는 때였습니다. 본 DCGAN에서도 이 방법을 적용하였고 이를 통해 가중치의 초기화가 잘 되지 않는 poor initialization 문제를 극복할 수 있었고 더 깊은 신경망에 대해서 gradient가 잘 업데이트 될 수 있게 되었다고 말합니다. 또한 위에서 언급한 mode collision 문제에 더 잘 대응할 수 있었다고 언급합니다. 하지만 이를 모든 layer에 적용하지 않고 sample oscilliation 문제를 마주하지 않기 위해 Generator의 output과 Discriminator의 input에는 이를 적용하지 않았다고 합니다.
추가적으로 ReLU 활성화 함수를 사용하였고 마지막 output layer에는 tanh 활성화 함수를 사용하였습니다. 그리고 Discriminator에서는 leaky ReLU를 사용하였는데 이는 기존 GAN이 maxout을 사용한 부분과 다른 점이며 이를 통해 더 해상도 높은 결과물을 얻을 수 있었다고 합니다.
Details of Adversarial Training
이렇게 구축한 DCGAN을 다음과 같은 데이터셋과 실험 조건을 바탕으로 수행하였는데 디테일한 내용을 살펴보겠습니다. 우선 데이터셋으로는 다음 3가지 데이터셋을 사용하였습니다.
[1] Large-scale Scene Understanding (LSUN)
LSUN bedroom dataset ( containing a 3 million training examples )
[2] Imagenet-1k
Natural Images for unsupervised training. Training 32x32 min-resized center crops
[3] Faces
3M images from 10k people
디테일한 실험 환경 설정은 다음과 같습니다
[1] 이미지를 학습하는 데에 있어 어떠한 전처리 과정도 수행하지 않았다. ( data augmentation 같은 )
[2] Mini-batch 128로 설정하여 학습
[3] Leaky ReLU에서는 기울기를 0.2로 설정
[4] Adam Optimizer 사용 ( learning rate = 0.0002, momentum = 0.5 ) # 기존 GAN은 momentum만 사용
저자는 하지만 학습을 수행하기 전에, 생성 모형이 단순하게 학습하는 데이터 자체를 "암기"할 수 있는 문제가 있을 수 있음을 지적하고 이를 방지하기 위한 여러 가지 heuristic한 방법들을 도입하는데, 우선 첫째로 암기할 수 있는 우려를 방지하기 위해 어떠한 data augmentation도 진행하지 않았다고 합니다. 또한 'deduplication'이라는 방법을 통해 3072-128-3072의 구조를 갖는 Autoencoder를 만들어서, 여기서 도출하는 결과를 ReLU 함수를 활용해서 이진화한 다음 도출하는 코드 값을 바탕으로 해시 충돌이 일어나는 샘플들을 제거하는 방법을 통해 275,000 중복 샘플들을 제거했다고 합니다. ( 이 부분에 대해서는 제가 정확히 이해한 것이 아닌 거 같아서 혹시 아시는 분은 코멘트 부탁드립니다..! )
처음으로 아래 그림은 DCGAN을 사용해서 bedroom을 generate한 결과입니다.
이렇게 보면 명확하게는 안보이지만 이전 GAN이 형성했을 때의 사진보다 훨씬 더 high-resolution 즉 고해상도의 이미지가 잘 생성되었다고 합니다. 즉, 이는 저자는 Convolution Layer를 사용하고 Leaky ReLU를 사용함으로써 얻어진 효과라고 언급합니다. 그리고 위의 샘플들은 이전 학습 데이터에 존재하지 않은 새로운 데이터를 생성함으로서 단순히 데이터를 암기하지 않음을 알 수 있었습니다. 물론 이 memorization 문제를 잘 대처하기 위해 추가적인 실험을 뒤에서 이어가는데 이는 뒤에서 자세하게 설명드리도록 하겠습니다.
Empirical Validation of DCGANs Capabilities
다음으로 저자는 앞서 언급드렸듯 GAN의 네트워크, 구체적으로 Discriminator가 이미지의 특징을 얼마나 잘 잡고 있는 지를 확인하기 위해, 우선 image classification task를 잘 수행하는 지를 점검하고자 하였습니다. 구체적인 설계로는 discriminator를 featur extractor로 사용해서 이들이 내놓는 결과를 supervised classifier에 집어 넣어 ( 구체적으로는 linear classifier ) 그 분류 결과가 정확한 지를 측정함으로서 feature extractor로서의 성능을 확인합니다. 구체적으로 저자는 Imagenet-1k 데이터를 통해 pre-trained 된 모형을 가지고 CIFAR-10 데이터를 이용하여 실험을 수행하였고, discriminator로부터 4x4 grid feature를 뽑아낸 다음, 28,672 크기의 벡터로 전환하여 L2-SVM 모형을 훈련시켰다고 합니다. 다른 classifier 모형들과 성능을 비교하였고 성능은 아래 표와 같이 exemplar CNN 모형 다음으로 준수한 성능을 보인 것을 알 수 있습니다.
다른 데이터셋, StreetView House Numbers dataset (SVHN)이라는 데이터셋을 사용해서도 성능을 측정해보았는데, 여기서는 가장 준수한, SOTA 성능을 도출했다고 합니다.
또한 여기서 주목해야하는 부분은, Supervised CNN 보다 더 준수한 성능을 보임을 알 수 있는데요, 저자는 이를 통해 DCGAN에서의 핵심 key가 CNN 아키텍처라고만 할 수는 없다는 점을 명시합니다.
Investigating and Visualizing the Internals of the Networks
저자는 또 재밌는 여러 실험들을 수행합니다. 첫 번째로 수행한 실험은 'Walking in the Latent Space'입니다.
이 실험의 목적은 정말로 네트워크, 특별히 generator가 학습 데이터를 memorize하지 않았냐를 구체적으로 점검하고자 하였습니다. 이 walking in the latent space라는 것이 정확히 무슨 의미인지 원문을 살펴보겠습니다
"When the latent space is moved, the semantic changes should be occurred ( such as object being added and moved ) rather than sharp transition. If the sharp transition is shown, it can be seen that there is 'memorization'."
즉, 잠재 벡터 z를 조금씩 움직일 때, 만약에 memorize된 네트워크라면 이 작은 움직임에도 큰 변화를 보일 것입니다. 왜냐하면 학습 데이터를 암기하였기 때문에 잠재 벡터의 변화에 대한 민감도가 커지기 때문입니다. 그래서 급격한 변화 ( sharp transition ) 이 발생하게 됩니다. 하지만 만약 네트워크가 암기를 하지 않았다면 급격하지 않은 부드러운 변화 ( smooth transition ) 가 발생을 하게 됩니다.
여기서 추가적으로 '움직임'을 수행하는 방법으로는 'Interpolation'을 사용합니다. 아래 예시는 라그랑지 보간법의 예시 그림입니다.
Z(x)가 있고 Z(x+1)이 있으면 이 둘의 보간을 통해 새로운 z를 만들 때, 이를 Generate하게 되면 과연 그 변화가 얼마나 큰 지를 살펴보는 겁니다.
아래 그림은 보간을 통해 생성한 데이터 샘플들의 예시입니다.
9개의 random point에 대해 보간을 수행했을 때의 변화 예시입니다. 점차적으로 smooth한 변화를 보임을 알 수 있습니다. 6번째 줄의 경우 점차 벽이 창문으로 변화하는 모습을 볼 수 있고 10번째 줄에서는 TV가 창문으로 변화하는 것을 볼 수 있습니다. 이로서 저자는 네트워크가 단순히 데이터를 memorize하지 않았음을 설명합니다.
두 번째로 수행한 실험은 'Visualizing the Discriminator Features'입니다.
이 실험에서는 Discriminator가 이미지의 구체적인 feature를 잘 학습하는 것을 보다 더 직접 실험을 통해 보여주는 과정을 거쳤는데요. 한 마디로 이미지 안에 있는 구조, 즉 구체적으로는 hierarchy of features that are interesting을 더 집중해서 보고 싶었다고 합니다. 즉, 예를 들어 침실 이미지같은 경우는 당연하게 침대, 창문 같은 주요한 요소를 이루는 object들을 먼저 특징을 뽑을 수 있습니다. 우리가 일반적으로 아이에게 침실을 그려보라고 할 때 가장 먼저 그리는 요소도 그러하기 때문입니다. 이러한 것을 네트워크도 잘 캐치를 하는 지를 확인해보고 싶은 것입니다. 따라서 저자는 DCGAN에서 학습된 filter와 random하게 초기화한 filter 2개를 놓고 비교하는 과정을 거쳤습니다. 아래 그림은 각각이 가지고 있는 feature를 visualize를 해본 결과입니다.
그림에서 쉽게 알 수 있듯, 랜덤한 피처는 침실의 어떤 특징을 뽑았다고 하기 어렵습니다. 하지만 오른쪽의 학습된 필터는 침대의 특징, 창문의 특징을 잘 캐치해서 학습을 수행했음을 확인할 수 있습니다.
세 번째로 수행한 실험은 'Forgetting to draw certain objects'입니다.
이 논문의 경우, Generator에서 학습된 일부 가중치를 drop out 시켰을 때, 즉 특정 object를 학습되었다고 판단된 특정 filter를 제거하면 정말 그 object가 제거된 이미지가 나오는 지를 실험하는 과정을 거쳤습니다. 본 연구에서는 window를 학습한 filter를 제거함으로써 실험을 진행하였습니다.
그렇다면 특정 filter가 어떤 object를 학습했는 지 어떻게 알 수 있을까요? 다음 과정을 살펴보겠습니다.
첫 번째로 왼쪽의 그림처럼 제거할 창문에 bounding box를 그립니다. 다음으로 Generator의 두번째 끝단의 네트워크에서 Logistic Regression을 fitting 시켜서 여기서 bounding box 내부는 양수고 바깥은 음수가 나오는 경우, 즉 다른 말로 해당 부분에 대해서 가중치가 양수 값을 갖는 모든 경우는 drop을 시킴으로써 제거를 하게 됩니다. 그렇게 제거된 filter를 사용하여 Generate을 수행했을 때 정말 창문이 없는 사진이 나오는지를 실험해보았습니다.
위 그림에서 첫 번째 줄은 조작을 가하기 전, 아래 줄은 조작을 가한 줄입니다. 위에 빨간 색 박스를 표시한 부분을 보면 기존 창문이 있던 위치에 벽이나 문으로 대체된 것을 확인할 수 있습니다. 이렇듯 네트워크에서 특정 filter가 특정 object에 대한 정보를 학습함을 확인할 수 있었습니다.
세 번째로 수행한 실험은 'Vector Arithmetic on Face examples'입니다.
가벼운 벡터 연산을 통해 의미상으로 유사한 다른 샘플들을 형성할 수 있는 지를 실험해본 것입니다.
벡터 연산이라는 것은 무엇일까요? Word2Vec에 나오는 개념을 생각하시면 될 것 같습니다.
다음 그림을 살펴보시죠.
"King"을 vector로 표현하면 다음 'male', 'adult' 같은 feature를 활용해서 다음과 같은 vector로 표현이 가능합니다. 만약 우리가 저 King에서 Man을 빼고 Woman을 집어 넣는다면 어떻게 될까요? 해당 vector는 가장 가까운 Queen vector에 맵핑이 될 것입니다. 바로 이러한 절차를 이미지에서도 활용이 가능한지를 실험해본 것입니다.
아래 그림을 보시죠.
웃고 있는 여성의 사진에서 일반 무표정의 여성 사진을 빼고 일반 무표정의 남성 사진을 넣는다면? 바로 웃고 있는 남성의 사진이 나옴을 확인할 수 있습니다. 바로 이런 연산이 가능하다는 것을 본 논문은 실험을 통해 확인할 수 있었습니다. 하지만 이 웃고 있는 여성의 사진을 예로 들어, 저 특징을 잘 표현할 수 있는 대표성을 가져야 하기 때문에 저자는 적어도 3개의 샘플을 뽑아 평균을 매긴 벡터를 바탕으로 연산을 수행했다고 합니다.
또한 이러한 특징은 GAN에서 학습한 분포에서 이미지 사이에 이루는 축에서 interpolate을 시킨 샘플들을 Generate해보았을 때도 유사한 결과들을 도출할 수 있습니다.
아래 그림을 보시죠.
위 그림은 왼쪽 얼굴이 보이는 사진에서 오른쪽 얼굴이 보이는 사진으로 가는 이 사이 axis에서 interpolate을 시켰을 때, 그 지점들을 Generator를 통과시키면 유의미한 샘플들이 나오는 지 실험한 결과 다음과 같은 점점 회전하는 듯한 이미지들이 형성되는 것을 확인할 수 있었습니다. 이는 곧 네트워크가 이미지의 어떠한 특징을 잘 학습하고 있다는 것을 시사하게 됩니다.
이상 DCGAN에 대한 논문 리뷰였습니다! 긴 글 읽어주셔서 감사합니다.