Deep-Learning

[GAN] GAN 및 DCGAN 개념설명

호Tuck 2023. 1. 15. 21:51

 

안녕하세요

호떡

유튜브에서 설명했던 GAN DCGAN에 대해 설명하도록 하겠습니다.

 

 

 

 

---------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

1. Generative adversarial Networks(GAN) 이란 ? 

 

 

Gan을 제안했던 Ian Goodfellow는 GAN을 경찰과 위조지폐범 사이의 게임에 비유하여 설명하는데요.

위의 그림의 예시로 설명하자면

Generator(이미지 생성모델)는 노이즈 벡터 z로부터 Fake money(Fake image)를 생성하는 위조지폐범이라고 할 수 있고 Discriminator(판별 모델)는 Fake money(Fake image)와 Real money(Origin image)를 판별하는 경찰이라고 할 수 있습니다.

 

 

 

 

실제 네트워크에 적용해보면 아래와 같은 그림이라고 할 수 있죠.

 

Hamed Alqahtani. 2019. An Analysis Of Evaluation Metric Of GANs

 

 

 

 

이때 Discriminator Network는 실제이미지와 가짜 이미지를 받아 0~1 사이의 값을 내놓게 되는데,

1에 가까울 수록 Real image로 판단함을 뜻하며

0에 가까울 수록 Fake image로 판별하는 것을 뜻합니다. 

 

 

 

 

 

 

 

즉 Discriminator는 일반적인 이미지 분류 모델로 Label을 가지고 학습하는 지도학습 방식이며,

Generator는 noise vector z로부터 origin image data(training data)의 확률분포를 학습해 이미지를 생성하는 비지도 학습 방식이라고 할 수 있습니다.

 

 

 

 

 

여기서!!!!!!!!!!!!!!!!!!!!!!!!

Generator가 Origin 학습 데이터의 분포에 학습한 다는 것은 어떤 의미일 까요?

이에 대해 설명하기 전에, 기초적인 확률 분포에 대한 개념을 짚고 넘어가도록 하겠습니다.

 

 

 

 

 

 

예를들어, 주사위를 6번 던졌고 주사위 눈(1,2,3,5)가 한번씩, 주사위 눈 6이 2번 나왔다고 하면

아래와 같이 표현할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

1,2,3,5(Random variable)이 1/6(Probability mass function)의 확률, 6(Random variable)이 2/6(Probability mass function)의 확률이라고 할 수 있고 오른쪽 그림과 같이 확률 분포 함수를 시각화 할 수 있습니다.

이 예시에서는 경우의 수가 6이지만,

차원(Random variable)을 늘려 이미지의 차원을 학습하면 어떨까요? 이미지의 확률분포를 예측할 수 있을 까요?

 

 

 

 

이미지 데이터는 여러가지 특징을 가진 다차원 특징공간의 한 점으로 표현되죠. 위의 주사위 예시에서는 단순한 1차원 특징공간에서 표현된 것이구요.

따라서 사람의 얼굴 이미지를 예시로 들자면, 사람의 얼굴의 통계적인 평균치가 존재할 수 있게 됩니다.

눈의 길이, 코의 길이, 눈썹의 두께, 등등 얼굴상에 존재하는 특징은 수치적으로 표현될 수 있고 사람의 얼굴에는 통계적인 평균치가 존재할 수 있게 되는 것이죠.

 

 

 

 

이미지에서의 다양한 특징들이 각각의 확률 변수가 되게 되고, 예시로 아래와 같이 다변수 확률 분포로 시각화 할 수 있습니다. 

 

 

 

 

출처:https://www.youtube.com/watch?v=AVvlDmhHgC4&t=2020s

 

 

 

 

만약 우리가 Hidden layer의 노드의 개수를 2로 설정했다면,

얼굴 이미지의 특징들이 Catch가 될텐데

이때 코의 길이와 눈의 모양이 Catch될 수 있습니다.

이렇게 인간의 얼굴에 대한 특징을 다차원공간의 확률 분포로 표현 할 수 있습니다.

 

 

 

 

Generator는 이러한 확률분포(Training data)를 학습하게 되는 것이죠.

 

 

 

 

 

- Generative  Model  (G)

 

 

Generative model은 위에서 설명한 것과 같이 이미지의 확률 분포를 학습해 실제로 존재하지 않지만 있을 법한 이미지를 생성하는 것을 목표로 합니다.

 

 

 

 

 

출처:https://www.youtube.com/watch?v=AVvlDmhHgC4&t=2020s

 

 

 

 

 

만약 우리의 모델 G 가 Train data의 확률분포를 잘 학습했다면, 확률값이 높은 분포에서 샘플링 하여 위와 같은 사람에가까운 이미지를 생성하는 것이고, 확률 값이 낮은 곳에서 샘플링 하게 되면 어색한 이미지를 만들게 되는 것이죠. 

 

 

 

 

확률이 높은 곳에서부터 노이즈 벡터를 섞어가며 샘플링을 한다면 다양한 형태로 그럴싸한 이미지를 만들어내게 됩니다.

 

 

 

 

 

 

 

 

 

위의 그림은 GAN 논문에서 발췌해온 그림인데요

검정색은 Origin data(Train data)에 대한 확률 분포

초록색은 Generate model의 확률분포

파란색은 Discriminator가 origin image 와 generate 이미지를 판별한 label을 대략적으로 시각화 한 것입니다.

 

 

 

 

시간이 지날 수록 G모델은 원래 Origin Data의 이미지의 확률분포를 학습해 유사해지고, D모델은 그에 맞춰 Origin data와 Generated data 를 구분 못하는 것을 볼 수 있죠.

 

 

 

 

 

그렇다면 어떻게 !!!!!!!!!!!!!!!!!!!!!!!!!!!!

시간이 지날 수록 Generate Model이 Origin data의 확률분포와 유사해 지는 것 일까요????

 

 

 

 

 

 

이를 설명하기 전에, GAN의 Object function을 설명하도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

object function은 D와 G의 Minmax 함수로 정의할 수 있습니다.

차근차근 식을 뜯어보도록 하죠..

 

 

 

 

먼저 D의 입장에서 식을 보도록 하겠습니다.

 

 

 

 

D는 경찰의 역할을 하죠. 즉 이미지가 들어왔을 때 가짜인지 진짜인지 잘 구분해야 합니다.

진짜같다면 1에 가까운 값을,

가짜같다면 0에 가까운 값을 내놓아야 하죠.

 

 

 

 

실제 데이터 X가 들어왔을 때 큰 값(1)을 내뱉고 (왼쪽 Term이 커짐)

가짜 데이터 G(z)가 들어왔을 때 작은 값 (오른쪽 Term이 커짐)을 내뱉어야 하기 때문에

결론적으로 전체 식이 Maximize되어야 합니다.

 

 

 

 

그럼 G의 입장에서 식을 보도록 하죠.

 

 

G는 단순하게,

D가 답을 못맞추는 것을 목표로 합니다.

 

 

 

실제데이터(x)가 들어갔을 때 Fake 라고 판별하고(0),

내가 만든 데이터(G(z))가 들어갔을 때 Real이라고 판별해야(1) 하죠.

 

 

 

 

그래서 왼쪽 Term은 0에 가깝게(작아짐),

오른쪽 Term은 D(G(z))값이 1에 가깝게(결론적으로 오른쪽 Term은 작아짐) 나와야 하는 것이죠.

전체식이 Minimize되는 것이죠!!!!!!!!!!!!!!!!!!!!!

 

 

 

 

 

 

 

 

 

그래서 논문에 나와있는 학습 방식을 보면,

D는 위의 식대로,

G는 앞의 Term인 logD(x(i))가 의미 없기 때문에(g와 관련한 term이 아니라서 상수취급됨) 뒤에 term만 남긴채로 학습이 진행되는 것을 볼 수 있죠.

 

 

 

 

 

 

 

그럼!!! Object Function도 알아봤으니 Pg = Pdata로 학습이 될 수 있는 이유를 알아봅시다.

이에 관련해 논문에서도 수식적으로 정리가 되어있는데요.

조금 더 풀어서 설명해보도록 하겠습니다.

 

 

 

 

 

 

 

 

우선 D의 optimal point가 Pdata/(Pdata+Px)임을 증명해야 합니다. 

 

 

 

 

 

 

 

 

 

 

object function 은 연속 확률 분포에서 기댓값의 정의에 따라 식을 변환할 수 있고, G(z)는 노이즈 벡터로부터 x와 유사한 이미지를 만들기 때문에 x로 매핑 가능하고

최종적인 식이 alog(y) + blog(1-y)로 치환되는데,

이 식을 미분하면 극댓값을 얻을 수 있게 됩니다.

a/a+b에서 극댓값을 얻기 때문에

Dg(x) = Pdata(x)/(Pdata(x)+Pg(x))의 optimal point 로 수렴하게 됩니다.

 

 

 

그럼 Pg=Pdata가 되는 이유를 증명하도록 하겠습니다.

 

 

 

 

 

object function을 위에서 정의한 Dg(x)값에 따라 식을 변환할 수 있는데,

앞의 두 Term에 2를 곱하고 Log4를 빼줍니다.(이 과정은 정의의 편의성을 위해)

그럼 KL divergence라는 두 데이터의 확률분포의 차이를 기술하는 metric으로 치환하게 되고,

이를 Jensen–Shannon divergence라는 Distance metric으로 치환할 수 있습니다. 

두 확률 분포간의 유사성을 측정하는 것으로, 우리는 결론적으로 이 식을 Minimize해야 하기 때문에

Pdata=Pg (즉,  JSD=0)일 때 최솟 값을 가지게 됩니다.

 

 

 

 

 

 

 

 

 

위의 그림의 오른쪽 노란색 박스는 실제 데이터(Origin data, Train data)이며,

노란색 박스를 제외한 그림들이 Gan이 생성한 이미지입니다.

 

 

 

실제 데이터를 단순히 외운 것이 아니라 그럴 듯한 이미지를 생성한 것을 볼 수 있죠.

 

 

 

 

 

 

그렇지만!!!!!!!!!!!!!!!

 

이때의 Gan은 구조가 다소 불안정하며,

Neural Net으로 학습이 진행되었기 때문에 Black Box(중간 과정을 볼 수가 없다 ㅠㅠ)가 지니는 한계점을 가지게 됩니다.

 

 

 

이 당시 학계의 주요 고민거리가 Gan의 안정화 였다고 하네요..

그래서 Facebook 에서 안정화된 Convolution을 사용하는 Deep Convolutional Generative Adversarial Network(DCGAN)을 제안하게 됩니다.

 

 

 

DCGAN이 Contribute하는 점들을 보자면,

 

 

1. D(Discriminator)모델이 일반적인 이미지 분류에서 다른 비지도 알고리즘과 비교하였을 때 성능이 좋으며,

2. DCGAN들이 학습한 filter를 Viz할 수 있고, Filter가 특정 Object를 생성하는 역할을 한다는 것을 알아내게 됩니다.

3. 또한 벡터산술연산이 가능하다는 성질을 알아내었고,

4. 대부분의 상황에서 안정적으로 학습이 가능하다고 합니다.

 

 

 

https://arxiv.org/pdf/1511.06434v2.pdf

 

 

 

 

 

위의 그림이 Generator의 구조인데요, 

NN을 사용했던 기존 구조와는 달리 Convolution을 사용해 구성한 것을 알 수 있습니다.

 

 

 

 

이때 Convolution은 이미지의 사이즈를 작게하는 metric인데,

Generator는 latent vector z로부터 이미지를 생성하는 것이잖아요?

이 문제를 Fractional convolution을 통해 해결했다고 합니다.

 

 

 

Fractional covolution은 Transposed Convolution으로 정기적인 Convolution을 수행하며 공간의 변화를 되돌립니다.

일반적인 Convolution의 연산

위의 그림이 일반적인  Convolution의 연산 과정이라고 할 수 있는데요,

Transposed Convolution은 

Transposed convolution

 kernel matrix를 Transpose해주어 원래의 input형태로 되돌릴 수 있습니다.

 

DCGAN은 이와 같은 구조를 적용해 이미지의 사이즈를 키울 수 있었 던 것이죠.

 

 

 

 

 

그리고 몇가지 metric을 더 추가하는데요.

D Network에는 Strided Convolution을, G Network에는 Fractional-strided convolution 을 추가하고

두개의 네트워크에 Batchnormalization을 적용하여 학습이 더 빠르고 안정되게 이루어질 수 있도록 하였습니다.

그리고 원래의 Hidden Layer를 다 지우고,

G에는 Relu activation, 마지막 Output에는 Tanh,

D에는 LeakyRelu를 적용하고 마지막 Output에는 Sigmoid를 사용하였습니다.

 

 

이렇게 모든 과정을 노가다(?)를 구현했다고 하고, Sensitive하게 왜 잘 되는지는 설명이 되어있지 않다고 합니다. 즉 결과를 통해 얻어낸 최적 파라메터 값들인 것이죠.

 

 

 

 

 

 

 

기존 NN은 Blackbox모델이기 때문에 왜 잘 되는지 알 수 없었다면,

DCGAN은 필터를 뽑아냄으로써 필터가 특정 Object를 잡아내고 있는 것을 확인 할 수 있었죠.

 

 

 

 

 

또한 위의 그림과 같이

벡터산술 연산이 가능합니다.

(이 또한 의도 한 것이 아닌 네트워크를 만들고 보니 가능했다고 하네요..)

 

 

 

 

latent vector z에서 안경을 쓰는 남자들을 그리게 하는 입력값을 모아 평균치를 구하고,

마찬가지로 안경을 안쓴 남자와 안경을 안쓴 여자에 대해 z값의 평균치를 구해 빼고 더해주면

새로운 입력값(산술 연산된 z)을 다시 네트워크에 넣었을 때 놀랍게도 안경 쓴 여자들 이미지가 나옵니다.

 

 

 

 

 

 

 

 

이 위의 그림이 DCGAN이 생성한 그림입니다.

기존 Gan에 비해 훨씬 실제와 유사한 그림을 생성해 내는 것을 볼 수 있죠

--------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

그럼 GAN과 DCGAN에 대한 포스팅을 마치도록 하겠습니다!

 

 

 

 

 

감사합니다

 

 

 

 

 

 

 

 

 

 

 

 

참고 블로그 및 유튜브

 

[1] https://zzsza.github.io/data/2018/02/23/introduction-convolution/

 

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

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

zzsza.github.io

[2] https://jaejunyoo.blogspot.com/2017/02/deep-convolutional-gan-dcgan-1.html

[3]https://memesoo99.tistory.com/32p

 

[GAN] DCGAN - 논문 리뷰, Paper Review, 설명 (1)

오늘 다룰 논문은 2016년에 발표된 DCGAN -Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks에 대한 리뷰입니다. 논문에 흥미로운 Figure들이 많아 재미있게 읽은 논문입니다. DCGA

memesoo99.tistory.com

[4] https://www.youtube.com/watch?v=odpjk7_tGY0

[5] https://www.youtube.com/watch?v=AVvlDmhHgC4