[ML][GAN][paper] InfoGan
Goal : InfoGAN 이해하기
요약
엔트로피와 상호정보량(mutual information)이라는 “정보이론”에서 사용하는 개념이 있습니다. 이것을 GAN에 반영하여 비지도학습만으로 데이터의 특징을 적절히 표현할 수 있다고 합니다. 예를 들어서 강아지 사진 데이터를 Info GAN에 학습시키면 당연히 기존의 GAN과 마찬가지로 이를 모방하는 샘플을 만들어냅니다. 여기에 Info GAN은 추가적으로 이 데이터들을 잘 설명할 수 있는 변수들을 비지도학습합니다. 이때 비지도학습이 제대로 되었다면 학습한 변수로 데이터들을 분류하는 것이 가능해집니다. 즉 고양이 사진 데이터를 잘 분류할 수 있는 변수들, 귀, 눈, 털의 색 등을 개발자가 지정해주지 않고도 자동으로 학습합니다.
기존 GAN의 문제점
일반적인 GAN으로 MINIST 데이터를 생성해서 2D manifold를 해보면 Class 간의 구분이 명확하지가 않습니다. 이를 분포가 꼬여있다고 표현합니다. 일반적인 데이터의 노이즈는 이처럼 꼬여있고 이를 통해서 유의미한 정보를 얻는 것은 어렵습니다. 분포가 꼬여있기 때문에 노이즈를 연속적으로 변화시킨다고 해서 만들어지는 이미지가 연속적으로 변하지는 않게 됩니다.
만약 생성한 데이터가 꼬여있지 않고 일련의 클러스터를 구성하기 위해서는 데이터 각각에 label을 달아줘야합니다. 즉, 지도학습으로만 이러한 풀려 있는 분포를 만들어 낼 수 있습니다.
DCGAN과의 비교
DCGAN에서도 노이즈를 연속적으로 변화시켜서 만들어지는 이미지가 연속적을 변하는 결과를 보였습니다. DCGAN에서는 학습을 마친 뒤, 왼쪽으로 보는 얼굴을 생성한느 latent variable Zleft와 오른쪽으로 보는 얼굴을 생성하는 latent variable Zright를 가져와서 두 벡터의 차이를 구하여 나오는 벡터의 방향으로 latent space에서 변화를 주면, 그에 대응하는 방향으로 생성이미지가 회전했습니다.
Info GAN
Info GAN은 비지도학습만으로 꼬여있지 않은 데이터를 만드는 것이 목적입니다. 이를 위해서 데이터로부터 샘플을 만드는 과정을 생각해보겠습니다. 먼저 데이터가 입력되면 데이터의 특징을 학습하게 됩니다. 이 과정을 충실히 수행한 Gernerator는 입력 데이터의 특징을 잘 표현합니다. 그리고 특징을 잘 표현할 수 있다면 fake image를 잘 생성할 수 있습니다.
그러면 비지도학습으로 데이터의 특징을 잘 학습시키면됩니다. 하지만 쉽지 않습니다. 단순히 100차원의 노이즈에 몇 개의 값을 추가해서는 잘 학습이 되지 않습니다. Generator가 노이즈를 사용하는 방식에 어떤 제한도 없기 때문입니다. 즉, 단순히 노이즈를 추가하는 것은 노이즈의 차원이 늘어날 뿐입니다.
Info GAN은 Loss에 추가적인 항을 덧붙이는 방식으로 이러한 문제를 해결했습니다. Info GAN에서는 노이즈를 두 개의 값으로 구분합니다. 하나는 기존 GAN과 같은 방식으로 사용되는 노이즈 z와, 또 다른 하나는 latent code라고 부르면서, 데이터의 분포에서 중요한 값들을 표현하는데 사용하는 노이즈 c입니다. 비지도학습으로 데이터의 분포를 꼬여있지 않은 클러스터를 형성하겠다는 말은 이 c를 지도학습에서의 label로 사용할 수 있도록 학습시키겠다는 의미가 됩니다.
먼저 일반적인 GAN의 loss 식이 있습니다. 여기에 추가적인 항을 더해주기만 하면 c를 적절하게 학습시킬 수 있습니다.
(GAN 식)
이 과정에서 등장하는 것인 상호정보량Mutual Information입니다. X와 Y의 정보량은 I(X,Y)라고 표현합니다. 이는 Y를 알 때 X의 불확실성이 얼마나 감소하는가를 나타냅니다. 만약 x와 Y가 독립이라면, 둘 사이에는 연관성이 없기 때문에 둘 사이의 정보량 I(X,Y) = 0이 됩니다.
Info GAN의 Loss는 다음과 같이 정의됩니다.
(info GAN 식)
V(D,G)는 일반적인 GAN의 Loss입니다. 결국 위의 식은 일반적인 GAN의 Loss에 regularization term을 더해준 꼴입니다. G의 입장에서는 위 가치 함수를 최소화해야합니다. 따라서 뒤의 항을 최대화해야합니다. 이는 latent code c와 Generator가 만들어내야하는 샘플들의 분포 G(z,c)가 높은 상호정보량을 가져야함을 의미합니다. 바꿔 말하면 무의미한 c가 학습되는 것을 막기 위해서 생성 모델의 분포 G(x,c)와의 상호 정보량이 높도록 제약을 부여한 것입니다.
그런데 엔트로피 I(x,y)를 구하는 공식의 정의에 따라서 이 과정에서 P(c | x)를 알아야만 I(c,G(z,c)) 상호정보량을 구할 수 있습니다. |
따라서 어떤 분포 Q(c | x)를 이용해 L1(G,Q)를 I(c,G(z,c))의 lower bound가 되게 합니다. 상호정보량을 직접 구하는 대신 구하기 쉬운 Q를 사용해서 하한선을 표현하고, 이 하한선을 최대화하는 것입니다. 이 Q를 Loss를 써서 표현하면 |
(Q Loss)
가 됩니다.
Implementation
실제로 구현하는 과정에서는 Q를 신경망을 통해서 만듭니다. D와 Q는 대부분의 네트워크를 공유하기 때문에 증가하는 연산량은 많지 않습니다.
(MNIS 결과 InfoGAN)
위의 DCGAN 설명에서 회전하는 의미를 가지는 벡터를 Code라고 할 때, InfoGAN은 code에 약간씩 변화를 주면 결과가 어떤 식으로 바뀌는지 볼 수 있습니다. 같은 code를 써서 input을 넣어줄 때, 일반적인 GAN은 별 차이가 없습니다. 반면에 InfGAN에서는 0~9의 category를 나누는 code(c1 : 0~9에 대해서 각각 0.1의 확률)과 글자의 기울기,회전 그리고 너비를 학습한 code등을 잘 뽑아낸 것을 볼 수 있습니다.
즉, InfoGAN에서는 생성 모델이 회전과 같은 의미를 이해하고 이에 해당하는 code를 좀 더 잘 뽑아낼 수 있도록 기존 GAN에 엔트로피를 적용해서 학습합니다.
Discrete Code Dimension = 10 : Class 학습 Continuous Code Dimension = 1 : 기울기,너비, 회전 등의 특징 학습