본문 바로가기
컴퓨터비전/GAN

[논문리뷰] DEEP CONVOLUTIONALGENERATIVE ADVERSARIAL NETWORKS(DCGANs)의 이해

by PIAI 2022. 11. 14.

 

소개

\( GAN \)의 이해 링크

 

[딥러닝] Generative Adversarial Nets(GANs)의 이해

소개 Generative Adversarial Networks We propose a new framework for estimating generative models via an adversarial process, in which we simultaneously train two models: a generative model G that captures the data distribution, and a discriminative model

lcyking.tistory.com

\( CNN \)의 이해 링크

 

[딥러닝] CNN(Convolutional Neural Network)의 이해

CNN(Convolutional Neural Network)의 필요성 기존 DNN의 경우에는 기본적으로 2차원이나 3차원 데이터를 Flatten으로 1차원 형태로 변형시켜 사용한다. 28 x 28의 흑백 이미지는 768개의 1차원 형태로 입력을 받

lcyking.tistory.com

DCGAN 논문 링크

 

Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks

In recent years, supervised learning with convolutional networks (CNNs) has seen huge adoption in computer vision applications. Comparatively, unsupervised learning with CNNs has received less attention. In this work we hope to help bridge the gap between

arxiv.org

\( GAN \) 논문이 나온 이후 많은 연구가 진행되었지만 \( MINIMAX \) 구조이므로 항상 불안정할 수밖에 없었습니다. 종종 무의미한 출력을 하기도 하였고, 중간 표현을 시각화하는데 많이 제한적이었습니다. 항상 안정화가 필요했습니다. 그래서 나온 논문이 \( DCGAN \)입니다. 최근 몇 년 동안 \( CNN \)을 통한 지도 학습은 컴퓨터 비전 분야에서 크게 채택되었습니다. 반면에 비지도 학습은 크게 주목받지 못했죠... 위 논문은 지도 학습과 비지도 학습의 격차를 해소하려 작성되었습니다. \( Generator \)와 \( Discriminator \) 둘 다 \( CNN \)의 기능을 장착하여 학습하여, 좋은 결과가 나왔습니다.

 

모델 목적

 

기존 연구들의 한계점

  • 비지도 학습은 많은 연구가 진행되었습니다. 고전적으로 \( clustering \)을 사용하고, 계층적 클러스터링, 오토 인코더 등을 사용했습니다. 자연의 이미지를 생성하는 \( GAN \) 모델이 발표됐지만 \( noise \)와 이해할 수 없는 이미지를 생성했습니다. 간혹 좋은 이미지가 생성될지라고, 학습에 활용될 만큼 좋은 활용은 되지 못했습니다.
  • DCGAN은 CNN을 사용하는데, CNN의 가장 큰 단점은 무엇을 하는지 이해할 수 없는 black-box 형식이라는 점입니다.

\( DCGAN \)의 특성

  • 불안정한 \( GAN \) 모델과는 달리 대부분 환경에서 안정적으로 훈련이 가능함.
  • 학습된 Discriminator가 다른 비지도 알고리즘과 비교된 성능을 보여줌.
  • 학습한 \( filters \)시각화가 가능하고, \( filters \)이 어떤 물체를 학습했는지 보여줌.
  • \( DCGAN \)은 벡터 산술 연산이 가능하고, \( Generator \)가 생성한 \( samples \)을 \(semantic \) 수준에서 조작이 가능

기존 \( GAN \) 모델의 경우 \( MINIMAX \) 구조로 상당히 불안정하다 말씀드렸습니다. 하지만 \( DCGAN \)의 경우는 안정적으로 훈련이 가능하다고 하네요. 기존 비지도 알고리즘들 보다 더 좋은 성능을 가졌다고 하고요.

\( Generator \)로 얻은 데이터를 클러스터링 하여 어떻게 평가하는지도 쓰이는 것 같습니다 ( 기존 \( GAN \)의 평가의 경우 되게 모호하고, 주관적인 경우가 많았음). 나중에 \( DCGAN \)의 결과를 살펴보면 \( Generator \) 가 \( Memorization \)이 일어나는 것이 아니라, 즉 overfitting이 일어나서 image를 외워서 출력하는 것이 아니라, 학습이 잘 된 \( Generator \)가 새로운 이미지를 만들어 내는 것입니다. 그리고 다양한 이미지를 만들어내지 못하고, 비슷한 이미지만 계속 생성하는 경우를 극복하려 합니다(Mode Collapse). 기존 \( GAN \) 모델의 해결방안인 \( DCGAN \)의 특성을 살펴봤으니, 이제 모델의 구조를 보겠습니다.

 

모델 구조

 

\( Generator \) 모델의 구조

1. \( Discriminator \)에서는 \( pooling layers \)를 \( stride convolutions \)로 변경, \( Generator \)에서는 \( fractional-stride convolutions \)로 변경
2. \( Generator \), \( Discriminator \) 둘다 \( Batch Normalization \)을 사용
3. \( Generator \)의 활성화함수로 \( ReLU \)를 사용하고, 마지막은 분류는 \( Tanh \)를 사용
4. \( Discriminator \)의 활성화함수로 \( LeakyReLU \)를 사용

 

Max Pooling과 같이 Pooling Layers를 사용하지 않고, Stride Convolutions을 사용한 이유는 Max Pooling을 하게 되면 그 layers는 미분이 가능하지 않게 되어, 사용했다고 합니다. 그리고 이렇게 했을 때 더 좋은 결과가 나왔다고 하네요.

CNN을 보면 항상 마지막에 FC(Fully Connected)로 되어있는데, 이것을 global Average pooling을 사용하여 안정성을 증대시켰답니다 (수렴 속도는 더 느려짐). Batch Normalization을 사용하면 잘못된 초기화로 발생하는 문제를 처리하고, 더 깊은 모델에서 안정화를 시킵니다(모든 레이어에 적용하면 오히려 불안정해지므로 입력출력층에는 사용하지 않음). GAN의 고질병인 Mode Collapsing를 완화해줍니다.

 

모델을 학습하는 과정에서 Input데이터에 역전파를 하면 활성화하는 이미지를 검사하고, CNN의 black-box 구조를 어느 정도 볼 수 있습니다. 학습 방법을 살펴보겠습니다.

 

모델 학습

 

  • 데이터 세트LSUN, Imagenet-1kFaces를 사용
  • \( Tanh \) 범위인 \( -1 ~ 1 \) 사이로 스케일링 외 전처리는 사용하지 않음
  • 모든 가중치는 평균 0, 표준 편차 0.02로 초기화
  • \( LeakyReLU \)의 \( slope \)은 0.2로 설정
  • 옵티마이저로 \( Adam \)을 사용하고, \( learning_rate \)는 0.0002를 사용. \( Momentum\beta_{1} \)  너무 크면 진동불안정성을 초래하여 0.5로 설정

 

데이터 종류

논문에서 사용한 데이터 세트를 살펴보겠습니다.

  • LSUN: 침실 데이터
  • Faces: 사람의 얼굴 데이터

LSUN은 이미지의 샘플 해상도가 올라갈수록 \( Overfitting \)및 \( Memorization \)의 확률이 올라갔답니다. 단순히 암기한 하는 것이 아닌 것을 보여주기 위해 오토 인코더를 이용하여 작은 크기로 변환하고, 비슷한 이미지들을 제외하여 약 275000을 제외하였습니다. 이제 결과를 살펴볼까요?

 

학습 결과

 

\( 1 Epoch \) \( LSUN \)의 결과

\( 1 Epoch \) 학습해도 생각보다 결과가 잘 나왔죠? 일반적으로 데이터를 암기할 수도 있는데, 작은 \( Learning_Rate \)와 \( SGD \)로 훈련하여 그럴 가능성은 낮다고 말합니다

\( 5 Epoch \) \( LSUN \)의 결과

훨씬 더 깔끔한 침실의 데이터가 만들어졌습니다. 자세히 들여다보면 노이즈 질감이 있다고 overfitting은커녕 underfitting이 일어났냐고 주장하고 있습니다.

Walking in the latent space

본 논문에서 "Walking in the latent space"라고 표현하였는데, 직역하면 잠재 공간을 걷는 것 ..?? 이라네요. 표현이 신박하긴 한데 이 표현은 \( noise \) \( z \)의 값을 조금씩 바꿔가며 계속 같은 이미지만 출력(Mode Collapsing)하는지 확인하는 것 같습니다. 변화된 \( z \) 값에 따라 객체사 생기거나 사라지거나 하죠? 6행의 사진을 보면 가면 갈수록 창문이 생기는 것을 볼 수 있습니다. 이렇게 \( z \) 값 변화에 따라 sementic 하게 변화된다면 모델이 잘 학습됐다고 말할 수 있습니다.

 

Discirminator의 시각화

CNN은 Black-Box 모델이라 어떻게 돌아가는지 확인하기 힘들다고 말씀드렸습니다. 근데 \( DCGAN \) 은 \( Input \)까지 역전파를 하여 \( Discriminator \)가 어느 Feature의 부분을 ActivateActivate 하였는지 보여주고 있습니다. 아래의 그림을 보시죠.

왼쪽의 Random 한 filters는 무작위의 filters를 사용한 것이고, 오른쪽은 filters가 무엇을 학습했는지 보는 것입니다. Trained Filters를 보시면 침실 데이터셋인 만큼 침대의 윤곽을 학습한 것을 볼 수 있습니다. 자세히 보시면 창문도 약간 학습이 되었네요.

 

FORGETTING TO DRAW CERTAIN OBJECTS

\( Generator \)는 침대, 창문, 문과 같은 주요 장면의 구성 요소를 학습하여 가짜 이미지를 만들어냅니다. 그럼 여기서 특정한 요소를 제거해서 학습한다면 어떻게 될까요? 본 논문에서 창문을 없애는 예시를 들었습니다. 창문이 있는 곳을 \( Sigmoid \) 함수를 사용하여 양수, 없는 곳을 음수로 하였습니다. 창문이 있는 곳의 \( Feature Maps \)이 삭제되어 학습이 진행되면 어떤 결과가 나오는지 살펴보겠습니다.

놀랍게도 창문이 있던 곳을 다른 특징으로 채우려고 하였네요. 창문이 없어졌어도 그렇게 어색하지 않은 데이터가 만들어진 것 같네요.

 

얼굴 샘플의 벡터 연산

아까 \( DCGAN \)은 벡터 산술 연산이 가능하다고 말씀드렸습니다. 그럼 이 벡터 산술 연산이 무엇이냐?? 아래의 수식으로 쉽게 설명하겠습니다.

\( Vector("King") - Vector("Man") + Vector("Woman") = Vector("Queen") \)

위의 수식이 가능할까요? 정답은 가능합니다. Queen이라는 데이터가 존재하지 않아도 King, Man, Woman 이 데이터 세 개로 만들어낼 수 있습니다. 아래의 그림을 볼까요? 

단일 \( z \) \( vector \)로 만든 이미지
3가지 \( z \) \( vector \)의 평균으로 만든 이미지

 

단일 \( z \) \( vector \)로 만든 이미지가 보이시나요?? 좀 많이 흉측하네요....  \( z \) \( vector \) 하나로는 잘 안돼서 3개 정도를 평균한 \( \bar{z} \)를 사용해야 괜찮은 결과가 나왔답니다. \( z \) \( input \)은 \( Gaussian Noise \)로 위 이미지들은 전부 \( Generator \)가 만들어낸 이미지입니다. 단순한 1:1 matching이 아닌 다양한 이미지들이 잘 만들어진 것을 볼 수 있습니다. 

 

이미지 회전

위 그림을 보면 네트워크가 단순 overfitting이 일어나지 않은 것을 볼 수 있죠? 

왼쪽을 보고 있는 얼굴 \( vector z_{left} \) 들의 평균 \( vector \bar {z}_{left} \), 오른쪽을 보고 있는 얼 \( vector z_{right} \) 들의 평균 \( vector \bar {z}_{right} \)가 있습니다. \( vector \bar {z}_{left} \)와 \( vector \bar {z}_{right} \) 사이의 축을 Interpolation 하여 \( Generator \)에 넣으면 이미지가 회전하는 것처럼 볼 수 있습니다. 

 

결론

 

 

DCGAN이 기존 GAN보다 좋은 이미지를 생성한다는 것에는 부정을 하지 못합니다. 하지만 오래 학습할 시 Mode Collapsing, Oscillating Mode 등의 불안정한 문제가 있습니다. 그래도 기존 \( GAN \)과 비교할 때 훨씬 나은 성능을 기대하고 있습니다.

 

다음에는 코드 구현으로 넘어가 볼까요.

긴 글 읽어주셔서 감사합니다.

댓글