[CV Study] Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks

2020. 6. 11. 02:17Research

  • 비지도학습(unsupervised learning)은 labeling이 되지 않은 무수히 많은 이미지 데이터를 활용하여 좋은 feature representation을 학습할 수 있다는 장점이 있다.
  • 비지도학습 방식으로 GAN을 트레이닝 하여 좋은 image representation을 얻어내고, 학습된 generator와 discriminator를 지도학습(supervised learning) task에서 feature extractor로 활용할 수 있다.

 

하지만 GAN은 다음과 같은 문제를 가지고 있다.

 

  1. 학습시에 안정적이지 못하다.
  2. Generator가 종종 터무니 없는 output을 생성하기도 한다.
  3. GAN이 무엇을 학습하는지 시각화할 수 없다.

 

Approach & Model Architecture

DCGAN의 모델 구조는 다음과 같은 특징이 있다.

 

1. Pooling layer를 모두 없애고, 그 대신에 strided convolution을 사용하여 spatial downsampling을 하였다. 이 때 주의할 점은 discriminator는 strided convolution을 사용하고, generator는 fractional-strided convolution을 사용한다.

2. Fully-connected layer를 전혀 사용하지 않고 convolution을 활용하였다.

3. Batch normalization을 통해 깊은 네트워크에서도 안정적으로 gradient가 흐를 수 있도록 하였다. 단, 모든 layer 마다 BN을 추가하면 오히려 안정성을 저하시키므로 generator의 출력층과 discriminator의 입력층에는 BN을 넣지 않는다.

4. Generator에서는 Tanh를 사용하는 출력층을 제외하면 ReLU를 사용한다. Discriminator는 모든 레이어에서 leaky ReLU를 사용한다.

 

DCGAN의 generator 구조

 

왜 pooling layer를 모두 없앴는가?
CNN에서 pooling은 차원축소 자체를 위해서도 사용이 되지만 오버피팅을 방지하기 위한 목적으로도 사용된다. 즉, pooling 과정에서 위치와 관련된 정보 등을 의도적으로 버림으로써 이미지의 불변적인 특징(invariant feature)만을 뽑아낸다. 불변량(invariant)은 어떤 유형의 변형이 대상에게 가해지더라도 결코 변하지 않고 유지되는 성질을 의미한다. 예를 들어, 삼각형은 내각의 합이 180도라는 불변량을 갖는데, 이는 삼각형에 어떠한 변형이 가해지더라도 항상 만족하는 성질이다. CNN에서도 이와 같이 의도적인 transformation을 가하여 네트워크를 거치는 과정 속에서 더욱 불변적인 특징을 추출하는 것을 목적으로 한다.

이미지를 생성하는 것이 목적인 generative network는 이와 반대의 상황에 놓여 있다고 볼 수 있다. 즉 최대한 많은 디테일을 담은 정교한 이미지를 생성하기 위해서는 충분한 디테일들이 보존 되어야만 한다. 따라서 pooling과 같이 의도적으로 정보를 드랍하는 operation을 사용하지 않고 strided convolution을 사용한다. 사실 pooling의 역에 해당하는 operation을 할 수 있다면 더 좋겠지만 대부분의 pooling 연산은 비가역적이기 때문에 불가능하다. (Un-pooling이라는 연산을 특정 조건 하에서 사용 가능하긴 하다.)

 

Fractionally Strided Convolution (Transposed Convolution)

앞에서 discriminator는 strided convolution을 사용하고, generator는 fractional-strided convolution을 사용한다고 하였다. Strided convolution은 흔히 아는 convolution에서 stride를 준 것이므로 별다른 설명은 하지 않겠다. 좀 특이한 것은 fractionally strided convolution(transposed convolution)인데, 이는 deconvolution과 같이 convolution으로 추출한 feature를 다시 원본 데이터로 돌리는 작업을 수행한다. (단, 그 방법이 deconvolution는 다르다.)

 

Strided convolution을 수행하는 아래의 그림에서 초록색 사각형은 feature map이고, 파란색 사각형은 원본 데이터에 해당한다.

 

Strided convolution / 3x3 필터 / stride: 2

 

위에서 수행한 strided convolution을 통해서 2x2 크기의 feature map이 추출되었다. 이렇게 추출된  feature map을 다시 원본 이미지 크기로 복원하려면 아래 그림과 같이 feature 맵의 각 원소 사이, 그리고 바깥 부분에 모두 padding을 넣어준 채로 3x3 filter로 convolution을 수행하면 된다. 아래의 그림에선 입력에 해당하는 파란색 사각형이 위에서 추출한 feature map이라고 보면 된다.

 

Fractionally strided convolution

 

Generator에서는 fractionally strided convolution을 사용하고 discriminator에서는 strided convolution을 사용하는 이유를 다시 생각해보자. Generator는 noise를 입력으로 받아서 training set의 이미지와 같은 공간 해상도를 갖는 이미지를 생성해야 하기 때문에 공간을 확장시킬 수 있는 fractionally strided convolution을 사용한다. 반면, discriminator는 실제 training 이미지와 generator가 생성한 합성 이미지 사이에서 진짜를 판별해야 하기 때문에 feature를 추출할 수 있는 convolution 연산을 수행한다.

 

 

 

 

 

PyTorch로 작성한 모델 그래프

1. Generator 

 

 

2. Discriminator

 

 

 


Reference

 

딥러닝에서 사용되는 여러 유형의 Convolution 소개

An Introduction to different Types of Convolutions in Deep Learning을 번역한 글입니다. 개인 공부를 위해 번역해봤으며 이상한 부분은 언제든 알려주세요 :)

zzsza.github.io

 

What are deconvolutional layers?

I recently read Fully Convolutional Networks for Semantic Segmentation by Jonathan Long, Evan Shelhamer, Trevor Darrell. I don't understand what "deconvolutional layers" do / how they work. The re...

datascience.stackexchange.com