수식에서 판별자 D는 실제 이미지 x를 입력받을 경우 D(x)를 1로 예측하고, 생성자가 잠재 벡터에서 생성한 모조 이미지 G(z)를 입력받을 경우 D(G(z))를 0으로 예측합니다. 따라서 판별자가 모조 이미지 G(z)를 입력받을 경우 1로 예측하도록 하는 것이 목표입니다.
다시 손실 함수 전체로 돌아오면, 눈으로 보는 것처럼 상당히 복잡해 보입니다. 따라서 판별자 D와 생성자 G 부분으로 나누어서 살펴보겠습니다. 판별자 D는 다음 식의 최댓값으로 파라미터를 업데이트하는 것을 목표로 합니다.
이때 판별자 입장에서는 D(x)=1, D(G(z))=0이 최상의 결과(진짜 이미지는 1, 가짜 이미지는 0을 출력할 경우)가 될 것이기 때문에 이 식의 최댓값이 될 것입니다.
또한, 생성자 G는 다음 식의 최솟값으로 파라미터를 업데이트하는 것을 목표로 합니다.
이때 생성자 입장에서는 D(G(z))=1이 최상의 결과(판별자가 가짜 이미지를 1로 출력한 경우)가 될 것이기 때문에 이 식의 최솟값이 될 것입니다.
따라서 logD(x)와 log(1-D(G(z))) 모두 최대가 되어야 합니다. 즉, D(x)는 1이 되어야 실제 이미지를 진짜라고 분류하며, 1-D(G(z))는 1이 되어야 생성자가 만든 모조 이미지를 가짜라고 분류합니다.
참고로 GAN을 학습시키려면 판별자와 생성자의 파라미터를 번갈아 가며 업데이트해야 합니다. 또한, 판별자의 파라미터를 업데이트할 때는 생성자의 파라미터를 고정시키고, 생성자의 파라미터를 업데이트할 때는 판별자의 파라미터를 고정해야 합니다.
그럼 이제 예제로 GAN의 구현 방법을 알아보겠습니다.