요약

G모델 : Generative Model, 데이터 분포 Capture

D모델 : Discriminative Model, 실제 데이터와 G 데이터 차이 평가

G모델은 실제 데이터의 분포를 따라가도록 학습해야 함. 즉, 학습을 계속하면, 모델은 실제 데이터의 분포에 근사하도록 학습된다.

D모델은 어떤 데이터가 실제 데이터 분포인지 G 데이터 분포인지 구분하여 그 확률을 출력하도록 학습된다.

학습은 D모델을 이용하여 G의 데이터 분포를 실제 데이터와 구분할 수 있는지 확률을 가져온 뒤, 구분된다면 G 데이터 분포를 업데이트 하는 식으로 구현된다. 초기에는 G 데이터 분포가 실제 분포와 많이 다르다. 하지만, 학습을 할 수록 G 데이터 분포가 실제 데이터 분포로 수렴해 나가기 때문에, G모델을 만들 수 있다.

G가 실제 데이터에 수렴 $p_g = p_{data}$ 이고, D가 G 데이터와 실제 데이터의 차이를 구분할 수 없는 $D = \frac 1 2$ 값일 때, 최적해가 된다. GAN은 이 최적해를 찾아가도록 학습한다.

알고리즘 분석

$$ \underset{G}{min} \ \underset{D}{max} \ V(D, G) = E_x[\log D(x)] + E_z[\log(1-D(G(z)))] $$

알고리즘을 ****$D$, $G$ ****두 플레이어가 게임을 한다고 했을 때, $D$가 (데이터를 구분하는 능력이)최대가 되고, $G$가 (실제 데이터와의 차이가)최소가 될 때 각각 최적의 가치를 얻는 다는 뜻이다.

이 알고리즘에서는 $D$가 성능이 좋아야 한다. 그렇지 않으면, 위의 가치를 판별하기가 어렵다. 때문에 실제 학습 시에는 $D$를 k번 학습시킨다.

만약, $G$가 초기값과 많이 유사하다면, $D$는 확실히 $p_{data}$와 $p_g$를 구분할 것이다. 또한, $log(1-D(G(z)))$을 함수로 그려보면, 초반에 함수가 잘 변하지 않고, 이후에 급격하게 변하게 된다. 즉, 초반에는 $G$가 초기값(Noise)과 유사한 것이 많다. 따라서 $D$는 $G$의 초기값에 overfitting 될 것이다.

위 문제를 해결하기 위해서 $G$가 $log(1-D(G(z)))$를 최소화 하도록 하는 것이 아니라 $log\ D(G(z))$를 최대화 하도록 수정하면, 위의 문제를 해결할 수 있다. (학습 초기에 값이 급격하게 변하여, 학습 효율을 늘림.)

Algorithm 1

K = 1 # in paper using K=1
for epoch in range(EPOCH):
	for k in range(K):
		# mini batch update using gradiant descent
		trainD()
	trainG()

D Loss

$$ \nabla \theta_d \frac{1}{m} \sum_{i=1}^m [ \log D(x^{(i)}) + \log (1-D(G(z^{(i)}))) ] $$

G Loss