오늘 정리할 논문은 ICLR 2016에 소개된, DCGAN입니다. DCGAN은 Deep Convolutional GAN의 약자로 이름에서 알 수 있듯이 기존의 GAN에 CNN을 적용하여 높은 성능 개선을 이룬 것이 특징입니다.

기존의 GAN의 경우, 구조가 불안정하여 네트워크 학습이 불안정했습니다. 또한, NN의 Black Box 특성상 모델의 학습이 어떻게 진행되는지에 대한 설명이 불가능하다는 단점을 가지고 있습니다. 저자는 DCGAN을 통해서 이러한 단점을 커버하려 했습니다. 주요 포인트는 다음과 같습니다.

  • GAN에 CNN을 사용하여 구조를 변형하니, 안정적인 학습이 가능해졌다.
  • 좋은 성능을 보인다.
  • 학습된 분별기(D)의 성능이 다른 unsupervised 알고리즘과 비교했을 때, 대등하다.
  • 학습을 마치고 filter를 이미지화해보니, object에 적합한 filter가 있다. (=설명가능성)
  • DCGAN은 vector 연산이 가능하다.

 

Architecture

GAN에 CNN을 적용한 연구는 이전에도 있었습니다. LAPGAN(Denton et al., 2015)에서 영감을 받아 연구를 진행하게 되었고 그 과정에서 몇 가지 approach를 적용하니 성능 개선을 이룰 수 있었다고 합니다.

1. Strided Convolutions

Spatial Pooling 기법은 down sampling의 대표적인 방법이지만, deterministic하기 때문에 학습은 불가능하다는 단점이 있었습니다.

Strided Convolution

저자는 Pooling 과정을 CNN을 통해서 수행해 학습이 가능하도록 만들었습니다. 이 방법은 Generator(G)로 하여금 down sampling이 가능하게 만들며 Descriminator(D)로 하여금 up sampling이 가능하게 만듭니다.

 

2. Fully-Connected layer 지우기

저자는 이 행위에 대한 근거로 Global Average Pooling(GAP)을 제시합니다. 간단하게 설명하자면, Conv layer의 계산 결과를 FC layer에 넣어서 classification을 진행하는데, 이 과정에서 공간적 정보도 많이 잃어버리는데다가, 굉장히 많은 weight가 필요하게 됩니다. 여러 Conv layer의 가중치 연산량을 합쳐도 하나의 FC layer에 못 미치는 경우가 많다고 합니다. GAP은 이 문제를 해결하고자 나온 pooling 기법입니다.

 

DCGAN의 Generator 구조

이런 이유로 저자는 G에 noise vector Z를 넣는 경우, D에 결과 분류를 위한 softmax layer를 제외하고는 FC layer를 사용하지 않습니다.

 

3. Batch Normalization 사용

Batch normalization을 사용하면 poor initialization 때문에 발생하는 훈련 문제를 해결할 수 있으며, deep한 모델에서도 gradient flow가 잘 흐를 수 있게 도와줍니다. 저자는 이를 활용하여 GAN에서 발생하는 훈련 실패에 따른 single point collapse를 해결할 수 있었다고 말합니다.

 

4. ReLu, LeakyReLu의 사용

GAN이 maxout activation을 사용한 것과 다르게 DCGAN은 ReLU와 LeakyReLU를 사용합니다. 워낙 좋은 activation function 답게 학습이 빨라지고 좋아졌다고 합니다.

 

정리하면 다음과 같습니다.

DCGAN ; Architecture Guidelines

 

Details of Adversarial Training 

정말 간단하게 하이퍼 파라미터를 어떻게 설정하였는지만 보고 넘어가겠습니다. 

Training details

Dataset 3개로 학습을 진행하였습니다.  LSUN(침실사진), ImageNet-1k, new Face dataset(저자가 직접 모은 얼굴사진)입니다. 각 데이터셋에 대한 설명은 따로 검색을 통해서 찾아보시길 바랍니다.

 

Result Analysis

1. DCGAN is not mimicking online learning

쉽게 말해서 GAN이 정말로 이미지를 생성하고 있다는 것을 증명할 필요가 있습니다. 저자는 LSUN 데이터셋 학습 과정을 통해서 이를 증명합니다. 다음의 사진을 봐주세요.

DCGAN after 1 epoch

작은 learning rate와 minibatch SGD로 DCGAN의 G를 학습시킨 결과입니다. 이를 통해 우리는 DCGAN이 mimicking하고 있지 않음을 알 수 있습니다. 훈련 이미지에 overfitting했다기에는, 1 epoch을 돌았고 작은 learning rate와 mini batch로 학습되었기 때문에 그럴 수 없기 때문입니다.

 

DCGAN after 5 epochs

5 epochs을 돌고 난 후의 결과입니다. 굉장히 실제와 같은 이미지들이 생성되고 있음을 알 수 있습니다. 또한 자세히 보면 노이즈가 관측되는데, 이는 under-fitting의 결과로 분석할 수 있습니다. 따라서 DCGAN은 단순히 훈련 이미지셋을 카피하는 것이 아니라 이미지를 생성하고 있음을 알 수 있습니다.

 

2. Performance as a Feature Extractor

Unsupervised representation learning algorithm을 평가하는 방법 중 하나는 supervised dataset의 feature extractor로 사용해 성능을 분석하는 것입니다. 저자는 2개의 데이터셋에 DCGAN의 D를 feature extractor로 사용해 다른 알고리즘과의 성능 비교를 수행합니다. 결과는 다음과 같습니다.

CIFAR-10 classification results
SVHN classification with 1000 labels

 다른 알고리즘과 비교했을 때, 우수한 성능을 보이고 있습니다.

 

3. Walking in the Latent Vector

1번과 같은 내용을 증명하기 위해 진행한 실험 결과입니다. 아래 이미지의 각 열은 z의 값을 조금씩 변경해가며 나온 생성 이미지입니다. 6번째 열을 보면, 창문이 없는 방에서 큰 창문이 있는 방으로 변하고 있는 것을 확인할 수 있습니다. 또한 10번째 열을 보면, TV가 창문으로 전환되는 것을 볼 수 있습니다. 이를 통해, DCGAN은 이미지를 생성하고 있음을 알 수 있습니다.

Generated Image from latent vector, Z

 

4. Visualizing the Descriminator Features

앞서 NN의 특성상 설명 가능성이 부족하다는 점이 있었습니다. 저자는 이를 보충하기 위해 discriminator의 CNN이 흥미로운 feature를 잘 찾아가는 것을 확인합니다. 실험을 통해 확인해본 결과, filter가 침실의 침대나 창문과 같이 특정 부분을 활성화하고 있습니다.

 

5. Forgetting to Draw Certain Object

저자는 4번에서 살펴본 내용을 또 확인하기 위해 실험을 진행합니다. 특정 구성요소를 검출하는 필터를 제거한다면, 해당 구성요소 이미지가 생성되지 않는다고 가정하고 이를 실험을 통해 보입니다.

실험은 이미지에서 창문을 지우는 것을 목표로 합니다. 이를 위해 창문을 검출하는 filter를 찾고 이를 dropout해서 이미지를 생성합니다. 실험 결과는 아래와 같습니다. 실제로 창문이 사라진 것을 알 수 있습니다.

Top row : original samples / Bottom row : samples generated with dropping out filters

 

6. Vector Arithmetic on Face Samples

저자는 DCGAN을 통해 이미지에서도 vector 연산이 가능함을 보입니다. 이 전에는 vector 연산은 주로 NLP에서 사용되던 개념이었습니다. Vector 연산이 무엇인지에 대한 설명은 대표적인 예제를 통해 대체하겠습니다.

vector("King") - vector("Man") + vector("Woman") = vector("Queen")

Vector라는 개념은 잠시 넣어두고, 단어의 의미만을 살펴 봅시다. "왕"이라는 개념에서 "남자"를 제거하고 "여자"를 넣으면 "여왕"이 되는 것을 우리는 무리 없이 받아들일 수 있습니다. 머리 속에서 이루어지는 이 개념의 전환 과정을 사람들은 산술적으로 표현하고 싶어했습니다. 다음의 가정을 생각해 봅시다.

  • "King" = 10
  • "Man" = 3
  • "Woman" = 4
  • "Queen" = 11

위의 예제는 10-3+4 = 11이 되어 "Queen"이 됨을 알 수 있습니다. 이런 관계를 표현하고자 하였고, 상수 대신 vector를 사용해 표현력을 넓힌 것입니다. 저자는 이 과정을 GAN이 input으로 latent vector Z를 사용하기 때문에 적용할 수 있을 것이라 생각했습니다. 

Vector arithmetic for visual concepts

 

Conclusion

DCGAN은 GAN의 성능을 끌어올림과 설명 가능성을 제시한 점에서 높은 평가를 받았으며 이후 생성 알고리즘에 많은 영향을 준 논문입니다. ICLR 2016에 accept되었고 Tensorflow, Pytorch에서 예제를 찾아볼 수 있으니 참고해 보시길 바랍니다.