# Generative Model
생성형 모델은 지금까지 배운 CV와 학습 형태가 다르다. 우선 타겟 라벨이 없다. 이에 우리가 아는 형태의 Loss를 만들 수 없어 GD가 불가능하다.
그럼 어떻게 만들까?
먼저 GAN은 확률분포와 샘플링을 기반으로 한다. 여기서 확률분포란 각 경우들이 나올 수 있는 확률을 나타낸 분포로,

주사위의 각 눈이 각각 1/6 확률로 나오기에 확률분포는 위와 같이 그려지게 된다.
샘플링은 위에서 실제로 추출한 것. 즉, 위에서 샘플링을 통해 1~6 사이의 하나로 나오게 될 것이다.


주사위를 두 번 굴려 나오게 될 눈의 합의 확률분포는 위와 같다.
정리하면, 우리는 어떤 확률 분포를 구해서, 이 확률 분포에서 랜덤으로 하나 뽑는 것을 샘플링으로 볼 수 있다.
이제 생성형 AI에 대해 한마디로 정의할 수 있겠다.
예를 들어 사람 얼굴의 생김새가 다양할텐데, 생김새에 대해 여러 벡터로 확률 분포를 그릴 수 있을 것이고, 여기서 마치 회귀처럼 무작위의 x축의 값을 통해 하나를 샘플링 한다면? -> 바로 생성형 AI의 원리가 되겠다!!

문제는 이 확률 분포를 어떻게 '학습'시킬 것이냐이다..
사실 매우 쉽지 않은 태스크인게, 앞서 언급한 것처럼 정답이라고 알려줄 타겟 라벨이 없고, 매우 고차원 벡터값들에 대한 확률분포가 위처럼 깔끔하게 구할 수가 없다,, (데이터가 소규모이고, 전수조사가 불가하기 때문이다)
즉, 확률 분포도 직접 못찾고 샘플링도 불가하다.
여기서 중요한 개념으로 알고 가야 할게 Workaround라는 것이 있다.

설명하자면 가우시안 확률분포(좌측 하단 그래프)에서 무작위로 하나를 뽑아 이를 Generative 함수(G라 부르겠다)에 넣어 G(z)로 우리가 원하는 뭔가로 생성해주는 것인데 입력값 z가 무작위이므로 생성되는 출력 G(z)도 랜덤하게 생성될 것이기 때문이다.
위에 언급한 생성 모델의 정규분포는 아니지만 위처럼 해도 동작하는 것을 Workaround라고 한다.
이게 왜 되냐면 실제로 컴퓨터에서 rand()도 엄밀히 말하면 무작위가 아닌, 일종의 시퀀스에 따라 우리가 보기에만 랜덤한, 실제로는 랜덤하지 않은데 여기서부터 이런저런 다른 랜덤값들을 또 추출하게 된다. 즉 결국에는 가짜 랜덤이라는 거지만 실제 랜덤처럼 동작한다는 건데 저 가우시안 정규분포와 GAN 모델의 확률분포를 마치 합성함수처럼 매핑한다고 생각하면 가우시안에서 랜덤값을 뽑아도 잘 동작한다고 직관적으로 알 수 있다.(항상 그래왔으니까..)
그래서 일단은 정규분포 문제는 해결된 셈 치자.
다음은 학습 모델인데, 앞서 말한 것처럼 Loss 자체를 구성하기가 어렵다. 여기서 매우 신박한 아이디어가 등장하는데, 바로 경찰과 도둑이다..!

위조지폐범(generator)과 탐정(discriminator)을 하나씩 만들어 각각 위조 지폐를 만들면 검사를 하고, 왜 위조지폐로 판정했는지에 대한 정보를 G가 받으면서 다시 위조를 시도하고.. 를 반복하면서 성능을 향상해나가는 구조이다.
처음에는 탐정이 구분을 잘할 것이다. 이에 어떻게 구분했는지 정보를 함께 위조지폐범에게 넘겨주면, 이를 보완해서 다시 위조를 시도할 것이고 이러면서 양측 모두 실력이 늘게 될 것이다. 끝내 탐정은 위조와 진짜를 구분하지 못하게 되고, 이게 우리가 아는 GAN 모델이라고 볼 수 있겠다.
좀 더 구체적인 이미지로 보면 아래와 같다.

위에서 보면 알 수 있듯, GAN에는 두 개의 NN이 존재한다. 순서는 다음과 같다.
1. 먼저 G에서 하나를 생성해서 보낸다.
2. D에서 진짜 사진과 구분해 판별을 한다.
3. 이제 D를 끈다.
4. Cross Entropy 값을 반대로 주고 G를 몇 차례 학습시킨다.(1, 0 주던 것을 0, 1로 주는 것. 이는 곧 가짜를 진짜처럼 만들어!!가 된다)
5. 다시 D를 키고 확인한다.
6. 위 과정을 반복하며 학습한다.
처음에는 당연히 잘 못만들겠지만 학습을 거듭하며 점차 우리가 생각하는 분포와 맞게 생성물이 나오게 될 것이다.

이에 Loss도 다음과 같이 나타낼 수 있다.

위의 E는 sample mean으로 샘플값들의 총합/샘플링 횟수라고 볼 수 있다.
min과 max가 각각 하나씩 붙어있는데 d의 가중치는 최대화하면서 g는 최소화하는, 그렇게 볼 수 있다. 이유는 단순하다. 서로 적대적이니까..
생성기와 판별기가 정확히 반대의 목표를 가지고 경쟁하고 있고 판별기는 D(x)를 최대한 키워야 할 것이고 반대로 생성기는 G(z)를 최대한 줄여야 할 것이기 때문이다!
여기에는 실험적으로 나온 재밌는 특징이 있다.

바로 DC-GAN에서 나온 건데, 평균 z 벡터끼리 가감을 하게되면 위처럼
웃는 여자 - 보통 여자 + 보통 남자 = 웃는 남자와 같은 결과가 나온다고 한다. (확률 분포에서의 z 벡터가 자연어 처리 모델에서 embedding vector와 비슷하게 동작하는 거 같다. 그러면 이해될지도??)
다음은 GAN 중에서 VAE에 대해 다뤄보겠다.