본 글은 Ian J.Goodfellow의 Deep Learning책과 14년도에 발표된 Generative Adversarial Nets의 내용을 기반으로 작성되었으며 제 주관적인 의견이 반영되어있습니다.
현재 시점에서, 약 2512건의 논문에 reference로 등록된 Generative Adversarial Net을
간단한 논문 소개, 모델설명을 한 후, 수학식들을 전개해가면서 수학적으로 접근해보도록 하겠습니다.
Generative Adversarial Net (이하 GAN)은 14년도에 Ian J.Goodfellow가 NIPs에서 발표한 생성모델입니다.
GAN이 어떻게 데이터를 생성해내는지 직관적으로 이해하기 위하여 구조를 그려보면 아래와 같습니다.
GAN의 구조도에 GAN의 동작원리 이해를 위하여 순서번호를 매겨보았습니다.
각 번호별로 간단하게 설명을 하자면 다음과 같습니다.
1. Noise 확률 분포로부터 Noise샘플(z)을 추출하여 Generative model(생성모델, 이하 G)의 입력값으로 넣습니다.
2. 미분가능한 파라메트릭함수인 G는 1로부터 입력된 Noise샘플을 내부 신경망을 거치게 하여 새로운 벡터값(G(z))을 생성하고 출력합니다. 이때 생성되는 벡터 G(z)의 크기는 Discriminator 모델 안에서 실측데이터 샘플인 x와 비교를 해야하기 때문에 x의 크기와 동일해야합니다.
3. 실측데이터 분포로부터 data샘플(x)를 추출합니다.
4. Discriminator(판별모델, 이하 D)는 미분가능한 파라메트릭함수로써, 3에서 추출한 샘플 x와 2에서 출력된 G(z)를 입력받습니다.
5. D는 입력된 x와 G(z)를 내부 신경망을 거치게 하여, G(z)가 실측데이터 분포로부터 온것인지(1) 생성모델로부터 온것인지(0) 예측(판별)하는 확률 값(스칼라)을 뱉어냅니다.
6. 따라서 출력된 D의 결과 값은 0과 1사이가 되고 0에 가까울수록 D가 G(z)가 생성된 데이터다(정확하게 식별한것)라고 판다는 한 것이고, 1에 가까울수록 G(z)가 실측데이터로부터 왔다고 판단한 것(속은것)이 됩니다.
G는 D의 결과값이 1이되도록 D는 자신이 0을 뱉어내도록 학습을 하게 되죠.
즉 G는 데이터를 생성하여 자신이 생성한 데이터를 최대한 실제 데이터 처럼 만들어서 D를 속이려고 하는 것이고, D는 최대한 정확하게 구별해 내려는 방식으로 학습이 진행되며, GAN 논문에서는 이를 감식반을 속이려는 위조지폐범과 위조지폐를 정확하게 판별해내려는 감식반의 관계로 표현하고 있습니다. 여기서 G와 D의 관계가 마치 '적대적이다' 라는 것에서 adversarial이라는 단어가 붙게 된 것이죠.
GAN 논문에서는 G와 D의 관계를 two-player minimax game으로 정의를 하며 다음과 같은 수식으로 나타내고 있습니다.
위 수식을 해석하자면 다음과 같습니다.
G부분에 해당하는
를 minimize 하고,
D에 해당하는
를 maximize 하는 방향으로 학습하게 됩니다.
two-player minimax game 의 value function V(G,D)를 설명하기에 앞서서 정보량과 엔트로피에 대하여 간단하게 짚고 넘어가도록 하겠습니다.
========================================================================
Ian Goodfellow의 Deep Learning 3장 13절에서는 information theory에 대해서 다룹니다.
해당 내용에 기반하여 정보량과 엔트로피에 대하여 다루겠습니다.
먼저 정보량은 어떠한 일이 일어날 사건이 얼마나 많은 정보를 가지고 있는 가를 의미합니다.
정보량은 사건이 일어날 확률이 높은, 결정적인 사건일수록 정보량이 낮고, 일어날지 안일어날지 모르는 확률이 낮은 사건일수록 정보량이 높다고 표현합니다.
예시를 들자면, 삼시세끼를 반드시 챙겨먹는다는 전제에서, '저녁을 먹을 확률'과 '저녁에 한식집에서 불고기를 먹을 확률'의 차이로 생각하시면 될 것 같습니다. 삼시세끼를 반드시 챙겨먹기 때문에 저녁을 먹을 확률은 1에 가깝겠죠. 그런데 그사람이 저녁을 일식,중식,양식, 한식에서 한식을 고르고 그중에서도 불고기를 먹을 확률은 극히 낮다고 할수 있겠죠. 이러한 측면에서 정보가 더 많이 담겨있다라는 것입니다.
정보량은 수식으로 표현하면 다음과 같습니다.
(log의 밑이 e이면 단위가 nat, 2이면 bit, shannon이라는 단위를 사용합니다)
-를 취해준 이유는 P(x)는 확률값이기 때문에 1보다 작아 log를 취해주면 음의 값을 띄기에 양의 성질을 띄는 양적 성질을 만족시키기 위해서 취해준 것입니다.
샤넌 엔트로피(Shannon Entropy )는 모든 사건의 정보량에 대하여 얻을 수 있는 기대값을 의미합니다(분산의 개념을 활용하면 좋을 것 같습니다.). 따라서 이산 랜덤 변수 x에 대한 확률질량함수 P(x)의 샤넌 엔트로피는 다음과 같은 수식으로 정의됩니다.
기대값은 확률 분포 P(x)에 대한 특정함수 f(x)에 기대할 수 있는 값을 의미하는 것으로 특정사건이 일어날 확률과 특정 사건에 대한 f(x)값의 곱에 대하여 sigma를 취해준 값이며, 이는 곧 f가 P에 기반한 x를 취하여 얻을 수 있는 평균 값을 의미합니다. 수식은 다음과 같습니다.
위의 그래프는 이진 랜덤 변수 x에 대한 확률질량함수 P(x)의 샤넌 엔트로피 지수 그래프이며, P(x)의 엔트로피식은 다음과 같이 표현됩니다.
위의 그래프를 통해 D를 표현하면 다음과 같을 수 있습니다. x축이 D가 출력하는 확률값(스칼라)입니다. D는 입력된 G(z)가 G로부터 왔다라고 100% 판단을 하면 0.0을 출력하고, G(z)가 실측데이터 분포로부터 왔다고 100% 판단하면 1.0을 출력합니다. 0.5는 G가 학습이 잘되어 D가 입력된 G(z)가 어디서왔는지 정확하게 구분하지 못하여 생성됬을 확률과 실측데이터 분포로부터 왔을확률을 각각 0.5로 출력하는 것입니다. 그리고 이때 학습이 잘되어 D가 출력하는 확률이 1/2이 되는 지점(uniform 한 분포를 그리는 형태)에서 가장 큰 엔트로피값(가장 높은 정보량)을 얻을 수 있음을 알 수 있습니다.
========================================================================
다시 two-player minimax game의 value function으로 돌아와서,
GAN모델에서 학습이 이뤄지는 것은 D가 입력된 두 데이터의 차이를 계산하면서부터입니다. 따라서
D에 입력되는 데이터를 x'라고 가정하면 D(x')라고 표현을 할 수 있습니다.
이때 이진확률변수에 대한 D(x')의 정보량은 log(D(x'))로 표현을 할 수 있게됩니다. 이제 이 식을 가지고 D로 입력되는 두 변수에 대하여 정리를 하면,
먼저 실측데이터샘플 x에 대한 D의 정보량은
생성된 데이터 샘플 G(z)에 대한 D의 정보량은 G(z)를 x분포로부터 왔을 확률의 정보량이기에 1-D(G(z))에 log를 취해준
입니다. (D(x)와 D(G(z))는 p(실측데이터로부터 왔거나)와 1-p(실측데이터로부터 온것이 아니거나)의 관계)
이 두 데이터에 대한 평균 정보량을 얻어내기 위해 기대값을 취하여 엔트로피를 구하고, 전체 정보량을 계산하기 위해 합하면,
로 전개됩니다.
즉, GAN모델의 two-player minimax game의 value function은 D의 입력되는 두 데이터에 대하여 얻어지는 확률의 정보량을 계산하기 위한 수식임을 알 수 있습니다.
two-player minimax game의 value function이 어떻게 설계되었는지 살펴보았으니, 다음으로 학습 알고리즘을 살펴보도록 하겠습니다.
GAN논문에서는 D를 k번 학습시킨 후, G를 한번 학습시키고, 다시 D를 k번 학습시킨 후, G를 학습시키는 것을 n번 반복하는 방식으로 GAN을 학습시켰다고 적혀있습니다.
D의 학습과정을 자세하게 살펴보면 다음과 같습니다.
1. m개의 Noise 샘플을 Noise 분포로부터 추출하고,
2. m개의 실측데이터 샘플을 실측데이터 분포로부터 추출한 후,
3. D를 SG(stochastic gradient) 값만큼 상승(ascending, D를 maximize하기 때문)시켜서 update 해주고
1,2,3동작을 k번 반복한다.
3번에서
의 형태인 이유는 SG(stochastic gradient)를 활용하기 때문입니다.
=========================================================================
* 일반 GD(gradient descent)는 전체 데이터에 대하여 일일이 gradient값을 구하고, 평균을 낸다음
weight와 bias값들을 update해주는데, 이는 너무나 비용이 많이들기(cost expensive) 때문에 확률에 기반하여 실험자가 설정한 mini batch 값 만큼의 데이터들만 추출하여 각각의 gradient를 계산한다음 전체 weight와 bias값들을 update해주는 SG(stochastic gradient) 방식을 사용합니다.
=========================================================================
G의 학습과정을 자세하게 살펴보면 다음과 같습니다.
1. m개의 Noise 샘플을 Noise 분포로부터 추출하여,
2. G를 SG값 만큼 하강(descending, G를 minimize해야 하기 때문)시켜서 update 해주고
다음 epoch로 넘어간다.
2번에서
의 형태인 이유는 D에서와 마찬가지로 SG를 활용하기 때문입니다.
** 그런데, GAN의 수식대로 학습을 하게되면 문제가 하나 발생하게 됩니다.
학습 초반에는 G의 weight 들과 bias들이 제대로 학습되어있지 않기 때문에, 실측데이터와 너무나 확연하게 다른 데이터를 생성해내게 됩니다. 이로인해 D는 입력된 G(z)의 값에 대하여 거의 0에 가까운 값을 출력하게 되면서 gradient값이 너무 낮아 학습이 제대로 이루어지지 않는 현상이 발생합니다.
논문에서는 'D reject samples with high confidence because they are clearly different from the training Data. In this case, log(1-D(G(z))) saturates(학습이 정체되는 현상)' 으로 표현하고 있습니다.
따라서 결론적으로는 같은 의미지만 다른 방식의 학습방법을 사용하여 GAN을 학습시켜야하는데,
D(G(z))를 maximize하는 방향으로 학습을 시키는 것이 그 해결책입니다.
를 minimize 하는 것은
를 maximize 하면, 1-D(G(z))가 0으로 수렴하여,
log함수 그래프에 따라서 minimize하게 수렴되기 때문에,
결국 두가지 학습방법은 같은 결론을 이끌어낸다고 할 수 있습니다.
위의 4개 그래프는 실측데이터 분포(검정색)와 GAN이 학습 알고리즘에 따라서 학습이 되어가면서 변화하는 Discriminative 분포, Generative 분포의 모습입니다.
(a) Discriminative 분포가 난잡한 형태를 그리고 있으며, Generative분포와 실측데이터분포의 차이가 크게 존재하는 것을 확인할 수 있습니다.
(b) k번의 횟수만큼 D가 학습된 상태로, 일정 구간에서 Uniform함을 보이고 있습니다. D는 학습이 진행되면서 GAN의 학습 목표는 Pdata(실측데이터 분포)와 Pg(Generative 분포)분포가 일치(Pdata = Pg)하도록 하는것이고, 이때 최대정보량인 1/2 확률에 도달해야 함으로,
로 수렴해가게 됩니다.
(c) k번 학습된 D가 고정된 상태에서 G가 학습이 되어 Generative 분포가 실측데이터분포에 가까워진 모습입니다.
(d) b와 c가 몇번 반복되면서 Generative 분포와 실측데이터 분포가 일치(Pdata = Pg)하게 되고, 이때 Discriminative 분포는 uniform함을 보이게 되며, D(x) = 1/2에 도달합니다.
이제 GAN논문의 4.1절 Global Optimality of Pg = Data 에 대한 수식들을 살펴보겠습니다.
G의 파라메터들이 고정이 되어있다는 전제에서, 최적화된 D는
과 같습니다. [위 그림의 (b) 내용 참고]
그러면 주어진 G(G가 고정된 상태)에 대한 D의 학습은 V(G,D)를 maximize 해야하므로,
의 수식에서 x와 z는 이산확률분포인데 근사한다는 가정하에 연속확률분포로 가정하면, sigma를 integral로 치환이 가능해집니다.
이때, Pg분포가 Pdata와 일치되는 방향으로 변화해가기 때문에 Pz(z) -> Pg , z -> x, D(G(z)) -> D(x) 로 치환될 수 있고 이에 따라 다음의 식이 전개됩니다.
다음으로, GAN논문에서는 'D의 학습 목적은 주어진 데이터 x에 대한 y(y가 1일때 x는 Pdata의 분포로부터, y가 0일때 x는 Pg의 분포로부터 온것으로 판단)의 조건부 확률 P(Y=y | x) 의 평가에 대한 log-likelihood를 maximizing하는 것과 같다'라고 적혀있습니다. 즉 주어지는 실측 데이터 x의 분포와 최대한 유사한 함수로 학습이 되어 생성된 데이터(Pg로부터 온 데이터)들을 실측데이터로부터 최대한 잘 구별해내도록 하는 것이 목표라는 것입니다.
이는 다음과 같은 수식으로 정리됩니다.
이는 Pg분포가 Pdata와 일치하는 방향으로 변화함에 따라서, z->x, Pz->Pg, D*G(G(z))->D*G(x)로 치환될 수 있고 이에 따라 다음의 식으로 전개됩니다.
이때
이므로,
로 전개됩니다.
C(G)가 학습되면서 최종적으로 Global minimum에 빠지게 되는 것은 Pg = Pdata가 될 때이며, 이때
값이 1/2가 되므로, 이때 C(G)는
가 됩니다.
KL Divergence (Kullback - Leibler Divergence)는 두 확률분포가 얼마나 다른지 그 차이를 측정하기 위해 사용되는 식입니다.
KL Divergence는 비교하려는 확률질량함수의 정보량에서 기준이 되는 확률질량함수의 정보량을 뺀값에 기준이 되는 확률질량함수의 확률분포에 대한 기대값을 씌워준 것을 의미합니다. 이는 곧 다음과 같은 수식으로 표현될 수 있습니다.
비교하려는 확률질량함수를 Q(x), 기준 확률 질량함수를 P(x)라고 할때,
두 정보량의 차이는 다음과 같을 수 있습니다.
그리고 전개된 식에 P분포에 대한 기대값을 씌워주면,
로 표현될 수 있습니다.
=========================================================================
다시 C(G)의 식으로 돌아가서,
에서 Pg=Pdata일때,
로써 분자와 분모의 규모가 1:2의 비율을 이룹니다.
이지만, Pdata(x)와 Pdata(x) + Pg(x)의 규모가 서로 다르기 때문에, Pg = Pdata가 되더라도 DKL값은 0이 아닌 값이 됩니다. 따라서 Pg=Pdata에서 DKL값이 0이 되도록 분모와 분자에 1/2을 취해주고, 다음과 같은 방식으로 식이 전개됩니다.
다음항도 마찬가지로 똑같은 조치를 취해줄 수 있습니다.
최종적으로 두식을 다시 합하면,
이고,
Pg = Pdata 일때, Pdata(x)와 (Pdata(x) + Pg(x))/2는 차이가 없으므로 0이 되기 때문에,
C(G)가 Pg=Pdata일때 얻어지게 되는 값인 -log4가 얻어지는 것을 확인 할 수 있습니다.
위의 수식은 Jenson-Shannon divergence로 다시 정리가 될수 있기 때문에, 마지막으로 정리해주면,
로 전개됩니다.
결국 고정된 G에 대하여 D의 학습은 Pdata 분포와 Pg 분포의 차이를 계산해내기 위한 것으로 이해할 수 있고, JSD는 Pdata와 Pg가 일치할때 0 그외의 모든 경우에서 양수값을 지니기 때문에 C(G)의 global minimum은 Pg = Pdata 일 때라는 것을 다시한번 확인할 수 있습니다.
Convergence of Algorithm은 앞의 내용이 이해되셨다면, 이해에 큰 어려움이 없어보이기 때문에, 생략하도록 하겠습니다.
혹시 잘못된 부분이 있다면 피드백 주시면 감사하겠습니다.