GAN(생성적 적대 신경망)

* Generative Adversarial Network

생성적 적대 신경망(GANs)이란 두개의 네트워크로 구성된 심층 신경망 구조입니다.

다른 네트워크와 겨루는 구조이기 때문에 적대적(Adversarial)이라는 이름에 포함되었습니다.

 

어떠한 분포의 데이터도 모방하는 학습을 할 수 있기 때문에 GANs의 잠재능력은 엄청나다고 할 수 있습니다.

즉 GANs은 이미지, 음악, 연설 등의 모든 분야에서 실제 우리의 세계와 놀랍도록 비슷한 새로운 세계를 창조하도록 학습 될 수 있습니다.

 

GAN이 만든 초상화

GANs을 이해하려면 생성(generative)알고리즘이 작동하는 방식을 알아야합니다.

이는 판별(discriminative) 알고리즘과 대조하여 더욱 쉽게 이해할 수 있습니다.

판별 알고리즘은 주로 입력 데이터를 분류하는 것에 집중합니다.

즉 데이터 인스턴스의 피쳐가 주어지면 해당 데이터가 속한 레이블 또는 카테고리를 예측하게 됩니다. 

 

예를 들어, 판별 알고리즘은 이메일의 모든 단어를 판별하여 메시지가 스팸인지 아닌지를 예측할 수 있습니다.

스팸은 하나의 레이블이고 이메일에서 수집된 *BoW(bag of Words)는 입력 데이터를 구성하는 피쳐입니다.

2020/02/12 - [분류 전체보기] - BoW

 

BoW

Bag of Words(BoW) Bag of Words(Bow)는 Bag of visual Words와 Bag of Features로 불리기도 합니다. 컴퓨터 비전 분야에서 BoW는 이미지 분류 과제에 주로 사용됩니다. 문서 분류 과제에서 Bag of Words (BoW) Bo..

settlelib.tistory.com

이 문제를 수학적으로 표현하면 y=레이블, x=피쳐가 됩니다.

공식p(y|x)는 "주어진 x에 대한 y의 확률'을 의미하고, 이 경우"이메일에 포함된 단어들이 주어졌을때 그 이메일이 스팸일 확률"로 해석됩니다.

 

따라서 판별 알고리즘은 피쳐를 레이블에 매핑합니다. 즉, 피쳐와 레이블간의 상관관계에만 집중하게 됩니다. 

반면 생성 알고리즘은 이와 반대로 작동합니다. 생성 알고리즘은 주어진 특정 피쳐로부터 레이블을 예측하는 대신 주어진 특정 레이블에서 피쳐를 예측하는 방식입니다.

 

생성 알고리즘이 대답하려는 질문은 다음과 같습니다.

이메일이 스팸이라고 가정했을 때, 그럴 가능성이 있는 피쳐가 얼마나 있을까요?

판별 모델이 y와 x의 관계를 중요시한다면, 생성 모델은 "x를 얻는 방법"을 중요시합니다.

이를 통해 주어진 y에 대한 x의 확률인 p(x|y) 또는 주어진 레이블 또는 카테고리에 대한 피쳐일 확률을 알 수 있게 해줍니다.

다시 말해 생성알고리즘은 입력 데이터를 단순히 분류하는 것 이상의 기능을 수행할 수 있습니다.

 

생성 알고리즘과 판별 알고리즘을 구분하는 또 다른 방법은 다음과 같습니다.

  • 판별 알고리즘은 클래스 간의 경계를 학습한다.
  • 생성 알고리즘은 각 클래스의 분포를 모델링 한다.

GAN의 작동 원리

앞서 언급한 바와 같이 GANs은 두 개의 신경망으로 구성되어 있습니다.

  • generator : 하나의 신경망이 새로운 데이터 인스턴스를 생성
  • discriminator: 데이터의 진위를 평가

즉 discriminator는 검토한 각각의 데이터 인스턴스가 실제 트레이닝 데이터 세트인지 아닌지를 판단하게됩니다.

 

예를 들어, MNIST데이터 세트와 같은 손글씨 숫자를 생성한다고 가정 했을 때 discriminator의 목표는 실제 MNIST 데이터세트 인스턴스를 보여줄 때 그것이 진짜인지 알아내는 것입니다.

 

한편 generator는 discriminator에게 전달하는 새로운 이미지를 생성합니다.

generator의 입장에서는 생성한 가짜 이미지가 진짜 이미지 인것처럼 보여지길 원합니다.

여기에서 generator의 목표는 discriminator가 진짜로 판별하게 만드는 손글씨 숫자를 생성하는 것입니다.

반면, discriminator의 목표는 generator로 부터 전달된 이미지를 가짜로 식별하는 것입니다.

 

GANs의 동작 단계는 다음과 같습니다.

  • generator가 임의의 수를 입력받아 생성한 이미지로 반환합니다.
  • 생성된 이미지는 실제 데이터 세트에서 가져온 이미지들과 함께 discriminator에 전달됩니다.
  • discriminator는 실제 이미지와 가짜 이미지를 판별하여 0과 1사이의 확률값으로 반환합니다.
  • 1은 실제 이미지, 0은 가짜 이미지를 의미함니다.

따라서 이중 피드백 루프를 갖게 됩니다.

  • discriminator는 이미지의 정답 값으로부터 피드백을 받는다.
  • generator는 discriminator로 부터 피드백을 받는다.

GAN이 두 개의 모델을 적대적(Adversarial)으로 경쟁시키며 발전시킨다는 것을 뜻합니다.

예로 위조지폐범과 경찰을 생각해봅니다.

이 둘은 적대적인 경쟁 관계이며 위조지폐범은 경찰을 속이기 위해 점점 지폐 위조 기술을 발전시킬 것이고,

경찰은 위조지폐범을 잡기 위해 점점 위폐를 찾는 기술을 발전시킬것 입니다.

시간이 흐르면 위조지폐범의 위폐 제조 기술은 완벽에 가깝게 발전 할 것입니다.

 

이처럼 GAN은 위조지폐범에 해당하는 생성자(Generator)와 경찰에 해당하는 구분자(Discriminator)를 경쟁적으로 학습시킵니다.

생성자의 목적은 그럴듯한 가짜 데이터를 만들어서 구분자를 속이는 것이며, 구분자의 목적은 생성자가 만든 가짜 데이터와 진짜 데이터를 구분하는 것입니다. 이 둘을 함께 학습시키면서 진짜와 구분할 수 없는 가짜를 만들어 내는 생성자를 얻을 수 있습니다. 이것이 GAN의 핵심적인 아이디어인 적대적 학습(Adversarial Training)입니다.

discriminator 네트워크가 전달된 이미지를 실제 이미지인지 가짜 이미지인지를 판별할 수 있는 일반적인 컨볼루션 네트워크라면 generator는 정반대의 컨볼루션 네트워크입니다.

일반 컨볼루션 분류기는 이미지를 입력받아 확률을 예측하기 위해 이를 다운 샘플링하는 반면 generator는 랜덤노이즈 벡터를 입력받아 이미지를 만드는 업샘플링을 합니다.

즉 일반적인 컨볼루션 네트워크는 maxpooling과 같은 다운 샘플링 기술을 사용하여 데이터를 처리하고 generator와 같은 inverse 컨볼루션 네트워크는 새로운 데이터를 생성합니다.

 

두 네트워크 모두 제로섬 게임처럼 서로 반대되는 목적함수 또는 손실함수를 통해 최적화하려고 시도합니다.

이것은 actor-critic model과 비슷합니다.

dicriminator의 행동이 바뀌면 generator의 행동도 변하고 그 반대의 경우도 마찬가지입니다.

각 에러는 서로에게 전달됩니다.

 

GANs, Autoencoders and VAEs

생성적 적대 신경망(generative adversarial networks)을 autoencoders와 VAEs와 같은 신경망에 비교해봅니다.

 

Autoencoders는 입력 데이터를 벡터로 암호화(encode)합니다.

미가공(raw) 데이터를 잠재된 차원(hidden representation)으로 압축한다는 것입니다.

즉, 잠재된 차원의 벡터는 미가공 데이터를 훨씬 낮은 차원으로 축소합니다.

Autoencoders는 decoder와 함께 사용되는데, decoder는 Boltzmann 분포를 활용한 Restricted Boltzmann Machines(RBM)처럼 잠재된 차원의 입력 데이터를 재구성(reconstruct)합니다.

 

Variational autoencoder는 입력 데이터 인코딩에 제약 조건을 추가하는 생성 알고리즘입니다.

즉, 잠재된 차원이 정규화 됩니다. Variational autoencoder는 데이터를 압축하는 autoencoder와 데이터를

생성하는 GAN, 두 가지 역할을 수행할 수 있습니다.

그러나 세부적인 데이터를 생성하는 GAN에 비해 VAE가 생성한 이미지는 더 흐린 경향이 있습니다.

 

생성 알고리즘은 세 가지 유형으로 나뉩니다.

  • 레이블이 주어지면 관련 피쳐를 예측한다.(Naive Bayes)
  • 잠재된 차원(hidden representation)으로 관련 피쳐를 예측한다.(VAE, GAN)
  • 주어진 피쳐들로 나머지(inpainting, imputation)를 예측한다.

GAN 트레이닝 팁

discriminator를 트레이닝할 때 generator의 파라미터 값을 고정 시키고, generator를 트레이닝할 때는 discriminator의 파라미터 값을 고정시킵니다.

discriminator와 generator는 각각 고정된 상대 네트워크의 결과값을 통해 학습하게 됩니다.

예를 들어, 이로 인해 generator가 반드시 학습해야 하는 gradient를 더 잘 반영할 수 있게 됩니다.

 

generator 트레이닝을 시작하기 전에 discriminator를 MNIST데이터를 통해 미리 학습시키면 더 명확한 gradient값을 얻을 수 있습니다.

 

GAN의 두 개의 네트워크를 트레이닝 하다 보면 문제가 생길 수 있습니다.

   1. discriminator가 너무 뛰어나면 0이나 1에 매우 가까운 gradient값을 반환하게 되어,

      generator가 gradient값을 제대로 반영하기 어렵게 됩니다.

   2. generator가 너무 뛰어나면 discriminator가 진짜 데이터를 가짜 데이터로 판단할 확률이 높아집니다.

 

이런 문제는 두 신경망의 학습률(learning rates)을 각각 설정하여 완화할 수 있습니다.

두 개의 신경망은 항상 비슷한 학습 수준을 유지해야합니다.

일반적으로 GAN을 트레이닝하는데는 오랜 시간이 걸립니다.

DCGAN(Deep Convolutional GAN)

GAN은 학습이 불안정하기로 악명이 높은데 학습이 어렵다는 점은 GAN 모델이 다양한 곳에 응용되는 것을 가로막는 큰 장애물이기도 합니다.

이런 상황에서 수많은 실험을 통해 찾아낸 것이 DCGAN입니다.

 

※ 특징

 *선형 레이어와 풀링레이어를 최대한 배제하고 합성곱과 'Transposed Convolution(Fractional - Strided Convolution)'

  으로 네트워크 구조를 만들었습니다.

  이미지를 생성하기 위해서는 위치 정보가 중요하기 때문에 DCGAN은 풀링 레이어를 배제하였습니다.

  (풀링레이어는 이미지의 위치 정보를 잃어버린다는 단점이 존재함)

  선형 레이어 역시 위치정보를 잃어버리므로 모델의 깊은 레이어에서는 선형 레이어를 사용하지 않았습니다.

DCGAN의 생성자 네트워크 구조

* 배치 정규화를 사용했습니다.

  배치 정규화는 레이어의 입력 데이터 분포가 치우쳐져 있을 때 평균과 분산을 조정 해주는 역할을 합니다.

  이는 역전파가 각 레이어에 쉽게 전달되도록 해 학습이 안정적으로 이뤄지도록 돕는 역할을 합니다.

 

DCGAN은 마지막 레이어를 제외하고 생성자의 모든 레이어에 ReLU를 사용했고, 구분자의 모든 레이어에 LeakyReLU를 사용하였습니다.

또한, 가장 좋은 최적화 기법과 적절한 학습 속도등을 찾아내기도 하였습니다.

 

네트워크 구조는 기존 GAN에서 생성자와 구분자만 교체하는 것만으로 간단히 구현할 수 있습니다.

DCGAN의 생성자는 GAN과 마찬가지로 랜덤 벡터 z를 받고 가짜 이미지를 생성하는 함수입니다.

다만 그 구현에서 ‘Transposed Convolution’과 배치 정규화 등을 사용한다는 점이 다릅니다.

 

DCGAN의 또 다른 혁신은 학습이 잘 이뤄졌는지 확인하기 위한 여러 가지 검증 방법을 도입했다는 점입니다.

그 중 하나가 잠재 공간에 실제 데이터의 특성이 투영됐는지 살펴보는 것입니다.

예를 들어 사람 얼굴을 생성하는 모델이 잘 학습되면 단순히 사람 얼굴을 잘 만들어내는 것뿐만 아니라 성별, 머리 색깔, 얼굴방향, 선글라스를 썼는지 여부 등 의미 있는 단위들이 잠재 공간에 드러나게 되는데 생성자의 입력인 100차원짜리 ‘z’ 벡터의 값을 바꿔보는것으로 생성자의 출력인 이미지의 속성을 바꿔볼 수 있다는 것입니다.

예를 들어 잠재공간에서 얼굴 방향에 해당하는 특성을 찾아낼 수 있고, ‘z’ 벡터에서 이에 해당하는 값을 바꿈으로써 이미지에서 얼굴이 바라보고 있는 방향을 바꿔볼수 있습니다.

이것이 가능하다는 것은 생성자가 얼굴의 의미적인 속성을 학습했다는 것을 뜻합니다.

이미지를 새로운 이미지로 변형하는 cGAN

때때로 이미지를 처음부터 생성하기보다 이미 있는 이미지를 다른 영역의 이미지로 변하고 싶은 경우가 있습니다.

예를 들어, 스케치에 채색하거나, 흑백 사진을 컬러로 만들거나, 낮 사진을 밤 사진으로 바꾸고 싶을때 등이 있습니다.

 

기존의 GAN의 생성자가 랜덤 벡터를 입력으로 받는 것에 비해 cGAN의 생성자는 변형할 이미지를 입력으로 받습니다.

그 뒤 생성자는 입력 이미지에 맞는 변형된 이미지를 출력 합니다.

예를 들어 스케치 사진을 받은 생성자는 그 스케치에 맞는 색을 칠한 뒤 채색된 이미지를 출력하는 것입니다.

구분자는 스케치와 채색된 이미지를 모두 보고 그 채색된 이미지가 과연 스케치에 어울리는 지를 판단합니다.

첫째, 진짜 같은 이미지를 만들어야 하고 둘째, 스케치에 맞는 이미지를 만들어야 한다.

cGAN의 생성자와 구분자

cGAN의 혁신은 주어진 이미지를 새로운 이미지로 변형하는 수많은 문제를 하나의 간단한 네트워크 구조로 모두 풀었다는 점입니다.

모든 문제는 이미지에서 의미적인 정보를 찾아내어 다른 이미지로 바꾸는 문제로 볼 수 있기 때문입니다.

이렇게 한 영역의 이미지를 다른 영역의 이미지로 변형하는 문제의 경우 cGAN이 유용하게 쓰일 수 있습니다.

cGAN으로 가능한 이미지 처리 예시

다양한 종류의 GAN

앞서 소개한 모델 외에도 GAN의 성능을 높이고 새로운 분야에 응용하려는 다양한 종류의 GAN 모델이 있습니다.

WGAN(Wasserstein GAN) : GAN에서 실제 데이터 분포와 근사하는 분포가 얼마나 다른지 측정하는 거리 개념을 바꿔

                                   안정적인 학습을 가능하게 만듬.

EBGAN(Energy-based GAN) : GAN을 에너지 관점에서 바라봄으로써 역시 더 안정적인 학습을 추구함

BEGAN(Boundary Equilibrium GAN): WGAN과 EBGAN을 발전시켜 생성하는 이미지의 퀄리티를 획기적으로 높이고

                                                이미지의 퀄리티와 다양성을 컨트롤 할 수 있게함.

BEGAN으로 만든 작품

GAN의 한계점

GAN은 많은 기대를 받고 있는 모델이지만 아직 여러 가지 한계점도 존재합니다.

앞서 소개한 많은 모델이 GAN의 학습을 안정화시키기 위해 노력했지만, 아직도 GAN을 실제로 적용하려 할 때 가장 큰 걸림돌은 학습이 어렵다는 점입니다. GAN학습이 잘 되기 위해서는 서로 비슷한 수준의 생성자와 구분자가 함께 조금씩 발전해야 하는데 한쪽이 너무 급격하게 강력해지면 이 관계가 깨져버려서 GAN 학습이 이루어지지 않습니다.

경찰이 너무 강력하면 위조지폐범의 씨가 말라버리는 것입니다.

 

GAN이 제대로 학습을 하지 못하고 있을 때 나타나는 모드붕괴(Mode Collapse)라는 현상이 있습니다. 이는 생성자가 다양한 이미지를 만들어내지 못하고 비슷한 이미지만 계속해서 생성하는 경우를 뜻합니다.

GAN을 학습시킬 때는 이런 모드 붕괴 현상이 벌어지지 않는지, 생성자와 구분자 중 한 쪽이 너무 강해지지 않는지 유의해야 합니다.

 

GAN의 또 다른 한계점은 아직 텍스트를 생성하는 데는 적용하기 어렵다는 점입니다.

이미지나 음성 분야에서는 GAN의 성공 사례가 많이 있지만, 영어나 한국어 같은 자연어를 생성하는 문제에는 GAN의 성공 사례를 찾아보기 어렵습니다.

이는 텍스트가 이미지와 달리 불연속적이기 때문입니다.

이미지는 실수값인 픽셀로 이루어져 있기 때문에 미분을 통해 조금씩 값을 바꿔보며 개선해 나갈 수 있지만 텍스트는 단어로 이뤄져 있기 때문에 이런 방식이 불가능 합니다.