DL) GAN

2022. 7. 20. 15:51ML_DL/DL

GAN이 뭔데?

생성모델 중 하나이며, Generative Adversarial Network를 줄여서 우리는 GAN 이라고 부른다.

사실 이름에서도 어느정도 많은 정보를 유추 할 수 있다.

 

Generative : 생성적인

Adversarial : 적대적으로

 

기본적으로 무엇인가를 생성하는 모델이며, 적대적이기에 생성하는것에 대응하는 무엇인가가 있나보다 정도로 의미를 파악할 수 있다.

 

그러면 GAN에 대해서 좀 더 자세하게 알아보자

z : 0과 1로 이루어진 마구 뿌려진 의미가 없는 상태이다.

G : 생성자 ( Noise를 통해서 뭔가를 만들어내는 것 )

G(z) : Noise 를 통해 G 가 만들어낸 결과물

x : 실제 있던 작품(데이터)

D : 판별자 ( 해당 데이터(작품)가 생성된 것인지 실제인지 판별하는 것 ) 

 

생성모델은 어떻게 img를 만드는가?

인간의 얼굴에 대한 분포를 위와 같이 구했다고 보자.

해당 확률분포는 결합확률분포를 통해서 도출된다고 한다.

그 후 확률이 높은 부분에서 이미지와 낮은 확률에 대한 이미지 샘플링은 위 그림과 같다.

그러면 확률이 높은 부분에서 부터 조금씩 노이즈만 섞어서 랜덤하게 샘플링하면 그럴싸한 이미지가 생성 된다는 것이다.

 

다시 GAN,

 

일상적으로 생각해보면 생성자는 판별자에게 쉽게 걸러지지 않을 퀄리티를 갖는 작품을 만드는 것이 목표가 되고 판별자는 생성자가 만들어낸 모조품을 정확히 판별하고자 한다. 

 

이 과정의 종착지는 어떻게 될까? 

 

결국 판별자의 정확도는 0.5 에 수렴하게 되는 것이 해당 모델의 목표이자 결과라고 볼 수 있다. 50%라는 것은 정확히 모르니 찍는다는 의미를 갖는다고 볼 수도 있다.

 

최종적으로는 G,D는 어떻게 생겨먹었고, 어떻게 학습하는지를 볼 것이다. 그에 앞서서 기본적으로 몇 가지를 되짚어보고자 한다.

 

학습데이터에 대한 확률분포라는건 무엇을 의미할까?

실제 이미지들에 대한 어느 특징에 따른 확률분포함수가 다음과 같다고 가정하자( 정규분포 형태는 의도하고 그린게 아니다. )

이미지들이 X축 , P(X)는 해당 X값에 대해 분포값( 많고,적음을 표현 )을 보여준다.

 

만약 사람얼굴을 기반으로 만든 모델이라고 보자. 

X2는 안경낀 사람들의 특징을 추출한 (픽셀) 벡터를 표현한다고 하면 이는 x1(긴 생머리를 갖는 여자)의 벡터 보다 많음을 알 수 있다.

이렇게 학습 데이터의 전체적인 모습을 표현 할 수 있다.

 

그러면 Generator의 목표는 뭘까? 위에서 언급한바와 같이 기존데이터와 비슷한 데이터를 생성해내는것이 목표이다.

이 말을 좀 더 수학적으로 표현하면 

 

학습데이터의 확률분포함수와 근사한 확률분포함수를 생성해내는 것이 목표이다. 

 

그럼 어떻게 이를 학습하는걸까?

다음은 GAN의 목적함수이다.

 

D는 V라는 함수를 최대로 만들고자하고, G는 함수를 최소로 만들고자 하는것이 목표이다.

 

E(x~pdata(x))는 진짜 데이터의 분포에서 추출된 값을 의미하고,

E(z~pz(z))는 noise로 부터 생성된 데이터 분포에서 추출된 값을 의미한다.

 

(사실 정확히하면, 해당 범위내에(실제, 노이즈)에서의 값을 D(x)에 넣고 log를 취한 뒤 기댓값을 구한것)

 

앞서서 log 함수를 살짝 보자

x = 0 , y = -inf 

x = 1 ,  y = 0 의 값을 갖는다는 것을 인지하자

 

(1) D의 입장에서 목적함수를 최적화해보자.

 

D는 V라는 함수를 최대로 만들고자한다. E(x~pdata(x))는 진짜 데이터의 분포에서 추출된 값을 의미하고, E(z~pz(z))는 noise로 부터 생성된 데이터 분포에서 추출된 값을 의미한다.

 

위 식을 최대화하기 위해서는

log의 최댓값을 갖기 위해 D(x) 는 1의 값을 반환해야한다. => real image에 대해서 1로 판단을 해야한다는 의미이다. 

 

다음 항에서도 log(f(x)) =  1 이 되어야 최대값을 반환하는 것이다. 여기서 f(x) = 1-D(G(z)) 가 되므로, 1-D(G(z)) = 1 이어야 하고,

결국 D(G(z)) = 0의 값을 가져야한다.

 

의미를 보자면, D(판별자)는 G(z)[노이즈로 부터 G가 생성한 fake image]를 0으로 판단해야한다는 의미가 된다.

 

즉 결국에는 해당 목적함수를 최적화 시키기 위해 학습을 진행하는데 D는 fake = 0, real = 1 로 반환하기 위해 가중치를 조절한다는 의미이다.

 

(2) G의 입장에서 목적함수를 살펴보자

앞부분의 식은 단순 D로만 이루어진 식이기에 G와는 무관하다.

 

따라서 뒷 부분의 식만 살펴보면, G는 해당함수를 최소화 시키기 위해서 학습을 진행할 것이다. 최소화 시킨다는 의미는

위에서 말한 f(x) = 1-D(G(z)) 가 0이 되어야 -inf의 값을 갖기 때문에,

D(G(z)) = 1 로 반환 되는것이 목표가 된다.

 

이는 G가 만들어낸 fake img가 D에 의해서 real(1)로 판단되는 것이 목적인 것이다.

 

학습되는 일련의 과정은 다음과 같다.

* 주의 : 각각의 가중치를 조절하는데 있어서 G의 가중치를 조절시에는 D에 대한 가중치는 고정하고 D의 가중치 조절시에는 G에 대한 가중치는 고정하고 구하게 된다.

 

<해당 논문의 핵심>

 

근데 위에서 우리는 학습데이터의확률분포함수와 비슷하게 맞추는 것이 Generator의 목적이라고 말한바 있다. 

 

이에 대한 근거는 무엇일까?

min(G)max(D)V(D,G) == min(G,D) JSD(P(data) || P(g))

 

JSD (두 확률분포함수의 거리)를 최소화 시키는 것이 결국 위 목적함수에 대해서 G,D가 최적화 시키는 것과 같은 방향을 의미한다고 증명이 된다.

 

Global Optimality에 대한 증명을 찾아보면 나온다.

따라서 확률분포함수를 실제 데이터에 근접하게 만드는 것이 결국은 목적함수를 최적화하는 것과 같은 결론이 나오게 된다.

 

그럼 실제로 모델이 학습을 진행함에 따라 어떻게 변하는지 분포함수의 그래프를 통해 보자

 

검은색 점들은 원본데이터의 유한함을 표현하면서 분포를 보여주고 있다. 학습을 진행하면서 변하는 2가지를 볼 수있는데 생성 모델의 분포를 나타내는 초록색의 선이 점차 검은색의 원본 데이터의 분포를 닮아가고, 이에 따라 파란색의 판별모델의 분포는 0.5로 수렴하고있다.

 

판별모델이 0.5로 수렴한다는것은?

어느 데이터가 fake인지를 판별하는데 어려움이 생겼다는 의미고, 이 말은 결국 생성모델이 판별모델이 판별하지 못하는 정도의 퀄리티를 내고 있다는 것을 의미한다.

 

CycleGAN

원 논문에서 full name은 Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Netwokrs

즉 이미지를 어떠한 이미지로 변환할 것인데, paired하지 않아도 가능하다 라는 것이다.

 

이름에서도 알 수 있듯이 이는 GAN을 기반으로 만들어진 아키텍처이다.



 

CycleGAN을 알기 위해서는 2가지 모델을 미리 살펴볼 필요가 있다. 매우 간단하게만 살펴본다.

pix2pix는 cGAN이라는 모델을 기반으로 생성되었는데 

cGAN은 무엇일까?

z를 생성하는데 있어서 조건을 인가하여, y에 해당하는 z를 생성하게 만드는 모델이다.

 

학습을 하는데 있어서 다른점은 해당 img가 fake, real을 판단하는것이 아닌 y에 맞는 모델을 생성했는지도 판단하게 된다.

 

이번에는 pix2pix에 대해서 보자.

몇 가지 살펴봐야 할 것이 있는데, 먼저 여기서 조건은 무엇일까? 

pix2pix에서 조건은 이미지x 자체를 조건을 받게 된다. 

 

우리는 앞서서 pix2pix를 보완하고자 unpaired img to img model (cycleGAN)을 만들었다고 했는데, 이를 통해서 알 수 있듯이 여기서는 손그림과 같이 해당하는 이미지가 하나의 쌍을 이루게 되고 손그림에 해당하는 정답이미지가 있는 것이다.

 

해당 목적함수는 아래와 같다.

여기 목적함수에서 L1 손실함수에 대한 추가적인 식이 있는데 이를 보고도 알 수 있듯이 정답이 정해져있음을 확인할 수 있고, 해당 정답을 통해서 생성하는 이미지가 보다 현실적이게 된다.

 

다음은 손실함수별 output의 결과이다. 이를 통해 L1만을 사용하면 blurry한 부분이 있었음을 볼 수 있다.

 

근데 뭐가 문제이길래 CycleGAN이 나왔을까?

당연하겠지만 실생활에서 paired한 데이터를 구하기는 쉽지않다.

좀 더 자세하게 예를 들면, 고흐가 이 풍경을 그리면 어땠을까? 하는 질문에서 출발했다고 봐도 무방하다. ( 물론 수 많은 상황 중 하나 일뿐)

 

그러면 어떤 손실함수를 이용해야 할까? 

GAN의 손실함수를 그대로 이용하면 왜 안될까?

각기 다른 x임에도 불구하고 항상 동일한 y를 낼 수있다는 것이다. 하지만 여기서 y는 판별자 입장에서는 매우 타당할 수 있다.

 

하지만 우리가 하고 싶은건 아래와 같다.

x domain / y domain / x domain

모델을 어떻게 구성해야 할지 생각해보면 real to Generated img 의 생성자Generated to Reconstructed img의 생성자 2개의 생성자가 필요하고 각각 생성자에 대한 판별을 위한 2개의 판별자가 필요하게 된다.

 

input x -> output(G(x)) -> reconstruction (F(G(x)))

 

G : X -> Y

F : Y -> X 인 두개의 생성자

 

그러면 제약조건이 좀 더 필요하겠다.. 어떤 제약을 걸면 좋을까?

 

" 입력 x 에 대해서 변환을 시킬 때 다시 기존 입력x로 돌아올수 있을 정도만 변환을 시키자 " 라는 것이 해당 논문의 핵심적인 부분이다.

 

그래서 어떻게 하는데?

Lgan 첫번째를 풀어서 보면, 생성자 G를 X domain의 img를 Y domain의 img로 변경 하는데 이를 그럴싸하게 만들기 위해 학습하는것이다. 이에 대한 판별자는 D(y)가 된다. 즉 y 도메인에 있음직한가를 보는것과 같다.

 

Lcyc는 식과 같이 변환시킨 이미지가 원본이미지로 돌아 올 수 있도록 학습을 진행하는 것이다.

왜냐면 G(x) = Y 이고 F(Y) = X 이기에 X-X 를 최소화하는 것이 결국 같은 의미이기 때문이다.

 

전체적인 과정은 아래와 같다.

 

Reference

https://hyunsooworld.tistory.com/entry/%EC%B5%9C%EB%8C%80%ED%95%9C-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%9C-GAN

 

최대한 쉽게 설명한 GAN

* 개인적으로, GAN에 대해 이해하기 위해서는 AE, VAE에 대한 기본적인 지식이 있어야 한다고 생각합니다. * - References 나동빈님의 Generative Adversarial Networks (꼼꼼한 딥러닝 논문 리뷰와 코드 실습) Na.

hyunsooworld.tistory.com

https://www.youtube.com/watch?v=dr9Yf8EY4J4&ab_channel=%EB%8F%99%EB%B9%88%EB%82%98 

 

'ML_DL > DL' 카테고리의 다른 글

Deep Learning -> CNN 복습  (0) 2022.09.13
DL) CNN  (0) 2022.07.15
DL) RNN 구조와 Attention  (0) 2022.07.12
DL) RNN , LSTM  (0) 2022.07.12
DL) 단어의 분산 표현(Distributed Representation)  (0) 2022.07.11