머신러닝/Vision

Generative Adversarial Networks?

망나 2020. 8. 12. 15:57

Generative Adversarial Networks (GAN)은 2014년 Ian Goodfellow가 Generative Adversarial Nets 논문에서 처음 제안한 비지도 학습 인공지능 알고리즘입니다. 다른 딥러닝 알고리즘들과 다르게 데이터 생성에 목적을 둔 알고리즘으로 다른 알고리즘들에 비해 학습이 어렵다는 특징이 있지만, 지금까지 수많은 연구 끝에 성능을 향상할 수 있었고 다양한 분야에서 활용되고 있습니다. 

 

특히 Image 도메인에서 주로 활용되고 있으며 GAN하면 가장 쉽게 떠올릴 수 있는 Image-to-Image translation의 대표 모델 CycleGAN이 있습니다. 아래 이미지가 바로 CycleGAN을 통해 말을 얼룩말로 변환한 결과물입니다.

 

참조 (2)

 

GAN 모델 구조

GAN은 2개의 GeneratorDiscriminator 두 개의 네트워크를 포함한 구조입니다. 두 네트워크의 역할을 간단하게 설명하면, Generator가 random noise로부터 가짜 데이터를 생성하면 Discriminator가 이 가짜 데이터가 진짜인지 가짜인지를 판별하게 됩니다. 이때, Generator는 Discriminator를 속이도록 데이터를 최대한 진짜와 비슷하게 생성하도록 학습을 하고 Discriminator는 Generator가 생성한 가짜 데이터를 최대한 가짜로 잘 판별할 수 있도록 학습하게 됩니다. 

 

두 네트워크를 균형 있게 잘 학습을 해야 최종적으로 진짜 같은 가짜 데이터를 생성하는 모델을 얻을 수 있게 됩니다. 각 네트워크 학습 방법에 대해서 알아보기 전에 어떻게 Generator가 데이터를 생성하는지에 대해서 알아보도록 하겠습니다.

 

데이터(이미지) 생성을 위해서 먼저 normal or uniform distribution으로 샘플 노이즈 \(z\)를 얻습니다. 그리고 이 \(z\)를 입력으로 Generator \(G\)를 통해 이미지 \(x(x=G(z))\)를 생성합니다.

 

참조 (1)

\(z\)는 이미지의 색상이나 모양과 같은 latent feature들을 나타내고 네트워크 학습 과정에서 모델이 학습하는 feature들에 대해서 우리가 직접 관여하지 않습니다. 다른 딥러닝 모델들처럼 그저 다양한 학습 데이터를 통해서 모델이 스스로 학습할 수 있도록 하는 것입니다. 따라서 \(z\)의 각 값들이 어떤 feature를 의미하는지를 알아내기 위해서는 생성된 이미지를 직접 확인하는 것이 가장 효율적인 방법일 수 있습니다.

 

아래 모델 구조는 가장 유명한 모델 중 하나인 DCGAN의 Generator의 구조입니다. \(z\)를 통해 이미지를 생성하기 위해 여러 번의 transposed convolution을 수행하는 구조입니다.

참조 (3)

하지만, Generator만을 이용하면 제대로 된 이미지가 아닌 그저 random noise만을 생성하게 됩니다. 따라서 GAN에 포함된 Discriminator는 Generator가 진짜 같은 이미지를 생성할 수 있도록 가이드(?) 역할을 수행하게 됩니다. 

 

이를 위해서 Discriminator는 진짜 이미지를 통해서 이미지를 진짜로 판단하도록 하는 feature들을 학습합니다. 그리고 Generator가 만든 가짜 이미지와 학습된 진짜 이미지에 대한 feature들을 기반으로 Generator가 진짜 같은 이미지를 생성할 수 있도록 피드백을 줍니다.

참조 (2)

 

GAN 학습 방법

위에서 설명한 개념적인 방법들을 이제 기술적으로 한번 알아보도록 하겠습니다.

 

참조 (1)

Discriminator는 실제 이미지와 생성 이미지를 각각 받아 일반적인 딥러닝 분류기와 같이 학습이 진행됩니다. 즉, 실제 이미지를 입력으로 받으면 예측값을 1(\(D(x)=1\))로, 생성 이미지를 입력으로 받으면 예측값을 0(\(D(x)=0\))으로 되도록 학습이 진행됩니다.

 

Generator는 Discriminator가 1(\(D(x)=1\))로 예측할 이미지를 생성할 수 있도록 학습이 진행됩니다. 따라서 Generator는 \(D(x)\를 타깃으로 한 backpropagation을 통해 학습하게 됩니다. 즉, Discriminator가 실제 이미지로 판단하도록 이미지를 생성하는 것입니다.

 

Backpropagation에 대해서 더 자세히 알아보도록 하겠습니다. Discriminator의 목적은 실제 이미지를 실제로 판단하고 생성 이미지를 가짜로 판단할 확률을 최대화하는 것입니다(maximum likelihood). loss는 딥러닝에서 주로 사용되고 있는 corss-entropy를 사용합니다. 따라서 Discriminator의 목적 함수는 다음과 같습니다.

참조 (1)

Generator는 생성한 이미지를 Discriminator가 실제 이미지로 판단하도록 속이는 확률을 최대화하도록 학습해야 하기 때문에 목적 함수를 다음과 같이 정의할 수 있습니다.

참조 (1)

또한, 아래와 같이 minimax game으로 목적 함수를 정의할 수 있습니다.

참조 (1)

 

 

이렇게 목적 함수를 정의한 후, alternating gradient descent를 활용하여 Generator와 Discriminator를 번갈아가며 학습하게 됩니다.

 

먼저 Generator의 파라미터를 고정한 상태로 실제 이미지와 생성 이미지를 이용해서 Discriminator에 대해서 gradient descent를 한 번 수행합니다. 반대로, Discriminator의 파라미터를 고정한 상태로 Generator 학습을 한 번 수행합니다. 이 과정을 Generator가 실제 같은 이미지를 생성할 때까지 반복하게 됩니다.

 

참조 (1)

 

 

참조

(1) GAN - What is Generative Adversarial Networks GAN? 

(2) Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

(3) Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks

'머신러닝 > Vision' 카테고리의 다른 글

DCGAN  (0) 2020.08.18
LSGAN  (0) 2020.08.12
About GAN  (0) 2020.08.12
The Lottery Ticket Hypothesis  (4) 2019.06.24
ResNet 이해하기  (0) 2019.06.04