DCGAN (Deep Convolutional Generative Adversarial Nets)
논문 : Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
기존 공개한 GAN은 MNIST 같은 비교적 단순한 이미지에서는 잘 동작했지만 조금만 이미지가 복잡해져도 성능이 그닥 좋지 않았다.
또한 Deep neural network와 마찬가지로 black box model이었기 때문에 성능을 개선하기도 쉽지 않았다.
또한 GAN이 생성한 결과물이 얼마나 잘 만들었는지 평가할 수 있는 지표도 없었는데,
이를 해결하기 위해 등장한 모델이 DCGAN이다.
특정 latent vector z에서 시작은 하면서,
이 vector를 Project and reshape 을 통해 하나의 tensor로 만들어주고,
Upsampling 또는 Transposed convolution 을 통해 너비(width)와 높이(height)를 증가시키는 식으로 이미지를 만들어 나간다.
사실 이러한 모델은 분류 모델인 CNN을 거꾸로 뒤집은 것과 상당히 유사하다.
이러한 방법으로 학습을 했을 때, 이미지 도메인에서 높은 성능을 보이는 것을 발견했다.
DCGAN은 CNN 구조를 적용하였다.
Fully connected layer와 Pooling layer를 최대한 배제하고 Strided Convolution과 Transposed Convolution으로 네트워크 구조를 만들었습니다. Fully connected layer와 Max-pooling layer는 매개변수의 수를 줄일 수 있지만 이미지의 위치 정보를 잃어 버릴 수 있다는 단점이 있습니다.
Generator와 Discriminator에 배치 정규화(Batch Nomalization)을 사용하였습니다. 이는 입력 데이터가 치우쳐져 있을 경우의 평균과 분산을 조정해주는 역할을 합니다. 따라서 back propagation을 시행했을 때 각 레이어에 제대로 전달되도록해 학습이 안정적으로 이루어지는데 중요한 역할을 하였습니다.
마지막 layer를 제외하고 생성자의 모든 layer에 ReLU activation를 사용하였습니다. 마지막 layer에는 Tanh를 사용하였습니다.
Discriminator의 모든 레이어에 LeakyReLU를 사용하였습니다.
DCGAN은 학습이 잘 이뤄졌느지 확인하기 위해 여러가지 검증 방법을 도입했다.
그 중 하나가 잠재 공간 (latent space, z)에 실제 데이터의 특성이 투영됐는지 살펴보는 것이다.
사람 얼굴을 생성하는 모델이 잘 학습되면 성별, 머리 색깔, 얼굴 방향, 안경 착용 여부 등의 의미 있는 단위들이 잠재 공간에 드러나게 된다.
따라서 생성자의 입력인 100차원 짜리 'z'벡터의 값을 바꾸면 생성자의 출력인 이미지의 속성을 바꿀 수 있다.
아래 사진은 DCGAN이 생성한 사람 얼굴 이미지에서 얼굴 방향에 해당하는 'z' 벡터의 값을 바꾸어서 얼굴이 바라보는 방향을 바꾼 것이다.
이것이 가능하다는 것은 생성자의 얼굴의 의미적인 속성을 학습했다는 것을 뜻한다.
Project and reshape
입력으로 사용하는 latent variable 이 "가로 X 세로"의 형태가 아니기 때문에, CNN 연동을 위해 image feature-map 형태로 변형시킬 수 있는 "Project and reshape" Block 이 필요하다.
Fracionally-strided convolution
feature-map 의 크기가 작아지는 일반적인 CNN 과 다르게 크기를 키워야한다. 그래서 fracionally-strided convolution이 필요하다.
DCGAN에서의 벡터 연산 (Vector Arithmetic)
안경을 쓴 남자 사진의 정보를 닮고 있는 sementic vector 에서 안경을 쓰지 않은 사진에 대한 sementic 정보를 닮고 있는 벡터를 빼고, 안경을 쓰지 않은 사진을 닮고 있는 sementic vector 더했더니 안경을 쓴 여자에 대한 latent vector(분포)가 만들어졌다.
이러한 latent vector 를 다시 생성자에 넣고 사진을 출력하면 아래 그림과 같이 안경을 쓰고 있는 여자 사진이 출력된다.
이를 해석하자면 DCGAN은 벡터 연산도 성공적으로 지원한다.
httsp://github.com/jinseonggram
DCGAN은 새로운 이론에서 얻어진 것은 아니지만, 성능을 높이는데에 큰 역할을 했다.