Advanced GANs
21 Dec 2017 | GAN
이번 글에서는 Generative Adversarial Network(이하 GAN)의 발전된 모델들에 대해 살펴보도록 하겠습니다. GAN은 학습이 어려운 점이 최대 단점으로 꼽히는데, 아키텍처나 목적함수를 바꿔서 성능을 대폭 끌어올린 모델들입니다. 이 글은 전인수 서울대 박사과정이 2017년 12월에 진행한 패스트캠퍼스 강의와 위키피디아 등을 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다.
vanilla GAN
GAN이란 생성자(generator, $G$)와 구분자(discirimiator, $D$), 두 네트워크를 적대적(adversarial)으로 학습시키는 비지도 학습 기반 생성모델(unsupervised generative model)입니다. $G$는 Zero-Mean Gaussian으로 생성된 노이즈 $z$를 받아서 실제 데이터와 비슷한 데이터를 만들어내도록 학습됩니다. $D$는 실제 데이터와 $G$가 생성한 가짜 데이터를 구별하도록 학습됩니다. GAN의 궁극적인 목적은 실제 데이터의 분포에 가까운 데이터를 생성하는 것입니다. GAN을 도식화한 그림은 다음과 같습니다.
GAN의 목적함수는 다음과 같습니다. 게임이론 타입의 목적함수로 두 명의 플레이어($G$와 $D$)가 싸우면서 서로 균형점(nash equilibrium)을 찾아가도록 하는 방식입니다.
\[\min _{ G }{ \max _{ D }{ V\left( D,G \right) } } ={ E }_{ x\sim { p }_{ data }\left( x \right) }\left[ \log { D\left( x \right) } \right] +{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ \log { \left\{ 1-D\left( G\left( z \right) \right) \right\} } \right]\]
실제 학습을 진행할 때는 두 네트워크를 동시에 학습시키지 않고 따로따로 업데이트를 합니다. 각각의 목적함수는 다음과 같습니다.
\[\begin{align*}
\max _{ D }{ V\left( D \right) } =&{ E }_{ x\sim { p }_{ data }\left( x \right) }\left[ \log { D\left( x \right) } \right] +{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ \log { \left\{ 1-D\left( z \right) \right\} } \right] \\ =&\frac { 1 }{ m } \sum _{ i=1 }^{ m }{ \log { D\left( { x }^{ i } \right) } } +\frac { 1 }{ m } \sum _{ i=1 }^{ m }{ \log { \left\{ 1-D\left( G\left( { z }^{ i } \right) \right) \right\} } } \\ \min _{ G }{ V\left( G \right) } =&{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ \log { \left\{ 1-D\left( G\left( z \right) \right) \right\} } \right] \\ =&\frac { 1 }{ m } \sum _{ j=1 }^{ m }{ \log { \left\{ 1-D\left( G\left( { z }^{ j } \right) \right) \right\} } }
\end{align*}\]
DCGAN
Deep Convolutional GAN(DCGAN)은 GAN을 개선한 모델입니다. GAN은 학습이 어렵다는 점이 최대 단점인데요. DCGAN은 대부분의 상황에서 안정적으로 학습이 되는 아키텍처로, Deep Generative Model 연구는 DCGAN 등장 이전과 이후로 나뉠 정도로 파급력이 컸습니다. DCGAN 이후 소개된 GAN 논문은 DCGAN 아키텍처에서 크게 벗어나지 않습니다. DCGAN 특징과 아키텍처 개요는 다음과 같습니다.
구분
Generator
Discriminator
Pooling Layers
Not Used. But use strided convolutions instead.
same
Batch Normalization
Use except output layer
Use except input layer
Fully connected hidden layers
Not used
Not used
Activation function
ReLU for all layers except for the output, which uses Tanh
LeakyReLU for all layers
disentangled latent code
DCGAN 논문에서는 $G$의 인풋 역할을 하는 $z$ 벡터를 활용해 semantic 연산이 가능하다는 점을 언급해 주목을 받았습니다. 예컨대 선글라스를 낀 남자들을 발생시키는 $z_1$에 선글라스를 안 낀 남자에 해당하는 $z_2$를 빼고, 여기에 선글라스를 안 낀 여자들을 발생시키는 $z_3$를 더해 선글라스를 낀 여자들과 관련한 사진을 생성한 것입니다. 이밖에 $z$로 rotation 등 다양한 효과를 내어서 이목을 사로 잡았습니다.
하지만 위 그림이 나타내는 바와 같이 $z$가 속한 벡터공간의 각 차원별 특징은 해석하기 어렵습니다(entangled). 위의 DCGAN의 경우 생성된 이미지를 사람이 일일이 확인해 찾은 결과입니다. 이후 해석하기 쉬운(disentangled) 특징량(latent code)에 의존하는 Deep Generative Model이 잇달아 제안됐습니다. 앞으로 설명해 드릴 conditional GAN, InfoGAN, ACGAN 등이 바로 여기에 속합니다.
conditional GAN
conditional GAN에서는 $x$뿐 아니라 데이터의 정답 레이블 정보 $y$를 GAN에 적용한 최초의 시도입니다. 아키텍처는 아래 그림과 같습니다.
conditional GAN의 목적함수를 vanilla GAN과 비교해서 보면 $y$가 $D$와 $G$에 추가된 것 외에 같은 점을 확인할 수 있습니다.
\[\min _{ G }{ \max _{ D }{ V\left( D,G \right) } } ={ E }_{ x\sim { p }_{ data }\left( x \right) }\left[ \log { D\left( x,y \right) } \right] +{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ \log { \left\{ 1-D\left( G\left( z,y \right), y\right) \right\} } \right]\]
conditional GAN과 같이 아키텍처를 구성할 경우 Zero-Mean Gaussian으로 생성한 $z$와, 우리가 생성하고 싶은 범주의 레이블 정보에 해당하는 벡터 $y$를 함께 넣어 원하는 데이터를 생성할 수 있게 됩니다. $G$는 $z$뿐 아니라 $y$의 정보도 함께 고려하여 데이터를 생성하기 때문에 $z$가 속한 벡터공간을 해석하기 쉬워졌다는 의미로 받아들여도 되지 않을까 싶습니다.
semi-supervised GAN
semi-supervised GAN은 $D$를 multinomial classifier로 구성했습니다. 정답이 있는 실제 데이터는 해당 정답을 맞추도록 $D$가 학습됩니다. 정답이 없는 실제 데이터의 경우 fake를 제외하고, 거기에 제일 비슷한 범주가 예측되도록 합니다(예컨대 $K$개 범주가 있다면 예측된 범주 y-hat은 {$1,2,…K$} 가운데 하나가 됨). $G$가 생성한 가짜 데이터의 경우 $D$는 fake class로 예측하게 됩니다. 이 아키텍처는 레이블 정보가 일부 데이터에 한정된 semi-supervised 환경에서 작동할 수 있고, 범주 정보로 $z$ 공간을 해석할 수 있다는 장점이 있습니다.
ACGAN
Auxiliary Classifier GAN(ACGAN)은 $D$를 두 개의 classifier로 구성했습니다. 하나는 데이터가 실제인지 가짜인지 판별합니다. 나머지 하나는 해당 데이터의 범주를 분류합니다. 이 덕분에 ACGAN로 생성된 데이터는 다른 분류기에 넣어도 범주 분류가 잘 된다고 합니다. 바꿔 말해 이치에 맞는 데이터를 만들어낼 수 있다는 얘기죠. $G$는 conditional GAN처럼 레이블 정보와 $z$를 합쳐 가짜 데이터를 생성합니다. 아키텍처는 다음과 같습니다.
ACGAN의 목적함수는 다음과 같습니다. $L_S$는 기존 GAN의 $D$ 목적함수와 동일합니다. 다시 말해 해당 데이터가 진짜인지 가짜인지 판별해내는 것과 관련이 있습니다. $L_D$는 해당 데이터의 범주를 분류하는 것에 해당합니다. $D$는 $L_S+L_C$를, $G$는 $L_C-L_S$를 최대화하도록 학습됩니다.
\[\begin{align*}
&{ L }_{ S }=E\left[ \log { p\left( S=real|{ X }_{ real } \right) } \right] +E\left[ \log { p\left( S=fake|{ X }_{ fake } \right) } \right] \\ &{ L }_{ C }=E\left[ \log { p\left( C=c|{ X }_{ real } \right) } \right] +E\left[ \log { p\left( C=c|{ X }_{ fake } \right) } \right]
\end{align*}\]
catGAN
categorical GAN(catGAN)은 다음과 같은 조건부 엔트로피(conditional entropy)를 목적함수로 활용합니다.
\[\begin{align*}
H\left( X|Y \right) &\equiv \sum _{ x\in \chi }^{ }{ p\left( x \right) H\left( Y|X=x \right) } \\ &=-\sum _{ x\in \chi }^{ }{ p\left( x \right) \sum _{ y\in \Psi }^{ }{ p\left( y|x \right) \log { p\left( y|x \right) } } }
\end{align*}\]
catGAN의 학습 목표를 직관적으로 나타낸 그림은 다음과 같습니다. 우선 $D$ 입장에서 살펴보겠습니다. $D$는 다음 세 가지 과업을 잘 수행하도록 학습됩니다.
- $(i)$ 실제 데이터($x$)의 경우 $D$ 스스로 범주 구분을 확실하게 한다. 즉 조건부 엔트로피(entropy) $H[p(y$|$x,D)$를 최소화한다.
- $(ii)$ 가짜 데이터($G(z)$)의 경우 $D$ 스스로 범주 구분을 잘 하지 못하게 한다. 즉 조건부 엔트로피 $H[p(y$|$x,G(z))$를 최대화한다.
- $(iii)$ $D$ 스스로 $N$개 전체 진짜 데이터를 $K$개 범주에 균등하게 할당하도록 한다. 즉 주변확률 엔트로피 $H[p(y$|$D)]$를 최대화한다.
$G$는 다음 두 가지 과업을 잘 수행하도록 학습됩니다.
- $(ii)$ 가짜 데이터($G(z)$)라도 $D$가 범주 구분을 확실하게 하도록 한다. 즉 조건부 엔트로피 $H[p(y$|$x,G(z))$를 최소화한다.
- $(iii)$ $D$가 $M$개 전체 가짜 데이터를 $K$개 범주에 균등하게 할당하도록 한다. 즉 주변확률 엔트로피 $H[p(y$|$D)]$를 최대화한다.
catGAN의 목적함수는 다음과 같습니다.
\[\begin{align*}
{ L }_{ D }=&\max _{ D }{ { H }_{ \chi }\left[ p\left( y|D \right) \right] -{ E }_{ x\sim \chi }\left[ H\left[ p\left( y|x,D \right) \right] \right] +{ E }_{ z\sim p\left( z \right) }\left[ H\left[ p\left( y|G\left( z \right) ,D \right) \right] \right] } \\ { L }_{ G }=&\min _{ G }{ -H_{ G }\left[ p\left( y|D \right) \right] +{ E }_{ z\sim p\left( z \right) }\left[ H\left[ p\left( y|G\left( z \right) ,D \right) \right] \right] }
\end{align*}\]
위 식 가운데 $L_D$의 우변 두번째 항은 실제로 다음과 같이 계산됩니다. 다시 말해 레이블이 없는 실제 데이터 $N$개를 $D$에 넣고 계산한 조건부 엔트로피를 가리킵니다.
\[\begin{align*}
{ E }_{ x\sim \chi }\left[ H\left[ p\left( y|x,D \right) \right] \right] =&\frac { 1 }{ N } \sum _{ i=1 }^{ N }{ H\left[ p\left( y|x,D \right) \right] } \\ =&\frac { 1 }{ N } \sum _{ i=1 }^{ N }{ -\sum _{ k=1 }^{ K }{ p\left( y=k|{ x }^{ i },D \right) \log { p\left( y=k|{ x }^{ i },D \right) } } }
\end{align*}\]
레이블이 있는 데이터를 보유하고 있을 경우 위 항과 별도로 아래와 같은 크로스엔트로피(cross entropy)를 추가할 수도 있습니다. 다시 말해 catGAN은 (semi)supervised learning 과업 또한 수행할 수 있다는 이야기입니다.
\[CE\left[ y,p\left( y|x,D \right) \right] =-\sum _{ i=1 }^{ K }{ { y }_{ i }\log { p\left( y={ y }_{ i }|x,D \right) } }\]
$L_D$ 우변 세번째 항은 실제로 다음과 같이 계산됩니다. 모든 $z$에 대해 조건부 엔트로피를 구할 수 없기 때문에 몬테카를로 방법을 활용합니다. 즉 $p(z)$로부터 $M$개 $z$를 뽑은 뒤 이를 $G$에 넣어 조건부 엔트로피를 구하는 것입니다. 이 다음부터는 위 항 계산 방식과 동일합니다.
\[{ E }_{ z\sim p\left( z \right) }\left[ H\left[ p\left( y|G\left( z \right) ,D \right) \right] \right] \approx \frac { 1 }{ M } \sum _{ i=1 }^{ M }{ H\left[ p\left( y|G\left( { z }^{ i } \right) ,D \right) \right] }\]
주변확률 엔트로피는 다음과 같이 계산합니다.
\[{ H }_{ \chi }\left[ p\left( y|D \right) \right] =H\left[ \frac { 1 }{ N } \sum _{ i=1 }^{ N }{ p\left( y|x^{ i },D \right) } \right] \\ H_{ G }\left[ p\left( y|D \right) \right] \approx H\left[ \frac { 1 }{ M } \sum _{ i=1 }^{ M }{ p\left( y|G\left( { z }^{ i } \right) ,D \right) } \right]\]
InfoGAN
Information GAN(InfoGAN)은 기존 GAN 목적함수에 상호정보량(mutual information)을 추가한 형태입니다. 상호정보량이란 두 확률변수들이 얼마나 의존적(dependent)인지 측정하는 지표로, 두 확률변수의 독립성을 쿨백-라이블러 발산(KLD)으로 측정합니다. 서로 독립일 경우 그 값이 0이 됩니다.
\[I\left( X;Y \right) ={ D }_{ KL }\left( p\left( x,y \right) ||p\left( x \right) p\left( y \right) \right)\]
기존 GAN 목적함수를 $V(D,G)$라고 했을 때 InforGAN의 목적함수는 다음과 같습니다.
\[\min _{ G }{ \max _{ D }{ { V }_{ I }\left( D,G \right) } } =V\left( D,G \right) -\lambda I\left( c;G\left( z,c \right) \right)\]
InfoGAN에서는 $G$의 입력 노이즈 $z$를 두 개로 분리했습니다. 노이즈 종류에 대한 설명과 아키텍처를 나타낸 그림은 다음과 같습니다.
- $c$ : latent code, 즉 설명 가능한 피처(semantic features)
- $z$ : incompressible noise, 즉 나머지 모든 부분
목적함수에서 확인할 수 있듯 $c$와 $G(z,c)$ 사이의 상호정보량을 최대화한다는 것은, $c$에 의존적인 데이터를 $G$가 생성하도록 한다는 의미입니다. 다시 말해 $c$가 변함에 따라 가짜 데이터 또한 여기에 맞춰 바뀔 수 있도록 학습을 진행한다는 겁니다.
그러나 상호정보량을 단박에 최대화하는 것은 어렵습니다. 이에 변분추론(Variational Inference)을 수행해 $I(c;G(z,c))$의 하한(lower bound)를 구하여 이렇게 구한 하한을 최대화하는 방식으로 학습을 진행하게 됩니다. 구체적인 전개 과정에 대해서는 이곳을 참고하면 좋을 것 같습니다.
Least Squares GAN
vanilla GAN에서는 $p(x)$와 $p(z)$ 간의 거리를 KLD로 측정했습니다. 그런데 Least Squares GAN(LSGAN)은 이름 그대로 거리 측정 지표로 least Square를 씁니다. LSGAN의 목적함수는 다음과 같습니다.
\[\begin{align*}
\min _{ D }{ { V }_{ LSGAN }\left( D \right) } =&\frac { 1 }{ 2 } { E }_{ x\sim { p }_{ data }\left( x \right) }\left[ { \left( D\left( x \right) -b \right) }^{ 2 } \right] +\frac { 1 }{ 2 } { E }_{ z\sim { p }_{ z }\left( z \right) }\left[ { \left( D\left( G\left( z \right) \right) -a \right) }^{ 2 } \right] \\ \min _{ G }{ { V }_{ LSGAN }\left( G \right) } =&\frac { 1 }{ 2 } { E }_{ z\sim { p }_{ z }\left( z \right) }\left[ { \left( D\left( G\left( z \right) \right) -c \right) }^{ 2 } \right]
\end{align*}\]
목적함수를 이렇게 만들면 $D$는 진짜 데이터 $x$를 입력받았을 때 $b$를 출력하도록, 가짜 데이터 $G(z)$의 경우 $a$가 되도록 합니다. $G$는 $D$가 가짜 데이터를 받았을 때 $c$를 출력하도록 유도합니다. 이 말은 어떤 의미일까요? 다음 그림을 보면서 생각해 보겠습니다.
위 그림에서 KLD를 거리 함수로 쓰게 되면 진짜 데이터의 분포 중심과 가짜 데이터의 중심이 같아서 더 이상 최적화하기 어렵습니다. 하지만 가짜 데이터들 가운데서도 실제 데이터와 멀리 떨어져 있는 것이 있을 수 있습니다. 예컨대 핑크색 포인트들이 바로 그런 경우입니다. least Square를 쓰게 되면 이러한 데이터들도 실제 데이터의 분포 쪽으로 가깝게 끌어올 수 있게 됩니다. least Square는 $x$가 loss에 대해 strictly convex하기 때문(함수 꼴이 빗살무늬 토기 모양의 그림이 됨)에 유일한 최적해를 가지며 이 점 덕분에 LSGAN이 좀 더 안정적인 학습이 가능하다고 합니다.
Wasserstein GAN
GAN을 학습하면 $G$가 생성하는 분포 $p_g(x)$가 실제 데이터 분포 $p_{data}(x)$에 근사합니다. 그 이유는 최적의 $D$를 가정했을 때 $G$에 대한 GAN의 목적함수는 $p_g(x)$와 $p_{data}(x)$ 사이의 젠슨-섀넌 다이버전스(Jensen Shannon Divergence) 최소화와 동일하기 때문입니다. 이와 관련해서는 이곳을 참고하시면 좋을 것 같습니다.
어쨌거나 젠슨-섀넌 다이버전스는 두 확률 분포 간 차이를 측정하는 함수인데요. 불행하게도 언제나 잘 작동하는 건 아닙니다. 다음 예시를 보겠습니다.
\[{ p }_{ real }=\left( 0,y \right) ,y\sim U\left[ 0,1 \right] \\ { p }_{ fake }=\left( \theta ,y \right) ,y\sim U\left[ 0,1 \right]\]
다소 극단적인 설정이긴 하지만 위와 같은 상황에서 젠슨-셰넌 다이버전스는 $θ$가 0일 때만 0, $θ$가 0이 아닌 모든 지점에서 $\log2$의 값을 갖습니다. $θ$가 0에 가까울 수록 두 확률 분포 사이의 차이가 줄어드는 건 분명한데 젠슨-섀넌 다이버전스라는 측정 기법은 이러한 변화를 포착해내지 못한다는 뜻이지요. 이것이 GAN 학습이 잘 안되는 한 원인이 될 수 있겠습니다. 그러나 WGAN에서 제시하는 Wasserstein Distance(이하 WDist)는 두 분포 간 차이가 |$θ$| 꼴이 되어서 이러한 변화 캐치에 능동적입니다. 다음 그림과 같습니다.
WDist를 직관적으로 설명하면 이렇습니다. $P_r$과 $P_θ$ 사이의 WDist는 $P_r$을 $P_θ$로 옮길 때 필요한 양과 거리의 곱을 가리킵니다. 산등성이 전체를 옮기는 것 같다고 하여 Earth Mover Distance라고도 불립니다.
하지만 WDist를 바로 계산하는 것은 어렵기 때문에 몇 가지 수학적 증명 과정을 통해 WDist를 근사하게 됩니다. 결과적으로 도출된 목적함수는 다음과 같습니다.
\[\begin{align*}
&\max _{ D }{ { V }_{ WGAN }\left( D \right) } ={ E }_{ x\sim { p }_{ data }\left( x \right) }\left[ D\left( x \right) \right] -{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ D\left( G\left( z \right) \right) \right] \\ &\max _{ G }{ { V }_{ WGAN }\left( G \right) } ={ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ D\left( G\left( z \right) \right) \right] \\ &{ \theta }_{ D }\leftarrow clip\left( -0.01,0.01 \right)
\end{align*}\]
위 목적함수가 기존 GAN과의 차이를 보이는 점은 다음과 같습니다.
- log(sigmoid(logits)) 대신 logits를 그대로 사용한다.
- $D$는 임의의 $k$-lipschitz function이어야 한다. 이에 $D$의 모든 파라메터들을 임의의 $[-c,c]$로 클리핑한다. 이 때 $c$는 작은 상수값.
WGAN은 거의 모든 GAN 데이터셋에서 학습이 잘 돼 많은 주목을 받았습니다. WGAN은 $D$와 $G$ 사이의 균형 문제를 걱정할 필요 없이 $D$가 수렴할 때까지 학습을 진행해도 될 정도로 안정적이라고 합니다.
이번 글에서는 Generative Adversarial Network(이하 GAN)의 발전된 모델들에 대해 살펴보도록 하겠습니다. GAN은 학습이 어려운 점이 최대 단점으로 꼽히는데, 아키텍처나 목적함수를 바꿔서 성능을 대폭 끌어올린 모델들입니다. 이 글은 전인수 서울대 박사과정이 2017년 12월에 진행한 패스트캠퍼스 강의와 위키피디아 등을 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다.
vanilla GAN
GAN이란 생성자(generator, $G$)와 구분자(discirimiator, $D$), 두 네트워크를 적대적(adversarial)으로 학습시키는 비지도 학습 기반 생성모델(unsupervised generative model)입니다. $G$는 Zero-Mean Gaussian으로 생성된 노이즈 $z$를 받아서 실제 데이터와 비슷한 데이터를 만들어내도록 학습됩니다. $D$는 실제 데이터와 $G$가 생성한 가짜 데이터를 구별하도록 학습됩니다. GAN의 궁극적인 목적은 실제 데이터의 분포에 가까운 데이터를 생성하는 것입니다. GAN을 도식화한 그림은 다음과 같습니다.
GAN의 목적함수는 다음과 같습니다. 게임이론 타입의 목적함수로 두 명의 플레이어($G$와 $D$)가 싸우면서 서로 균형점(nash equilibrium)을 찾아가도록 하는 방식입니다.
\[\min _{ G }{ \max _{ D }{ V\left( D,G \right) } } ={ E }_{ x\sim { p }_{ data }\left( x \right) }\left[ \log { D\left( x \right) } \right] +{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ \log { \left\{ 1-D\left( G\left( z \right) \right) \right\} } \right]\]실제 학습을 진행할 때는 두 네트워크를 동시에 학습시키지 않고 따로따로 업데이트를 합니다. 각각의 목적함수는 다음과 같습니다.
\[\begin{align*} \max _{ D }{ V\left( D \right) } =&{ E }_{ x\sim { p }_{ data }\left( x \right) }\left[ \log { D\left( x \right) } \right] +{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ \log { \left\{ 1-D\left( z \right) \right\} } \right] \\ =&\frac { 1 }{ m } \sum _{ i=1 }^{ m }{ \log { D\left( { x }^{ i } \right) } } +\frac { 1 }{ m } \sum _{ i=1 }^{ m }{ \log { \left\{ 1-D\left( G\left( { z }^{ i } \right) \right) \right\} } } \\ \min _{ G }{ V\left( G \right) } =&{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ \log { \left\{ 1-D\left( G\left( z \right) \right) \right\} } \right] \\ =&\frac { 1 }{ m } \sum _{ j=1 }^{ m }{ \log { \left\{ 1-D\left( G\left( { z }^{ j } \right) \right) \right\} } } \end{align*}\]DCGAN
Deep Convolutional GAN(DCGAN)은 GAN을 개선한 모델입니다. GAN은 학습이 어렵다는 점이 최대 단점인데요. DCGAN은 대부분의 상황에서 안정적으로 학습이 되는 아키텍처로, Deep Generative Model 연구는 DCGAN 등장 이전과 이후로 나뉠 정도로 파급력이 컸습니다. DCGAN 이후 소개된 GAN 논문은 DCGAN 아키텍처에서 크게 벗어나지 않습니다. DCGAN 특징과 아키텍처 개요는 다음과 같습니다.
구분 | Generator | Discriminator |
---|---|---|
Pooling Layers | Not Used. But use strided convolutions instead. | same |
Batch Normalization | Use except output layer | Use except input layer |
Fully connected hidden layers | Not used | Not used |
Activation function | ReLU for all layers except for the output, which uses Tanh | LeakyReLU for all layers |
disentangled latent code
DCGAN 논문에서는 $G$의 인풋 역할을 하는 $z$ 벡터를 활용해 semantic 연산이 가능하다는 점을 언급해 주목을 받았습니다. 예컨대 선글라스를 낀 남자들을 발생시키는 $z_1$에 선글라스를 안 낀 남자에 해당하는 $z_2$를 빼고, 여기에 선글라스를 안 낀 여자들을 발생시키는 $z_3$를 더해 선글라스를 낀 여자들과 관련한 사진을 생성한 것입니다. 이밖에 $z$로 rotation 등 다양한 효과를 내어서 이목을 사로 잡았습니다.
하지만 위 그림이 나타내는 바와 같이 $z$가 속한 벡터공간의 각 차원별 특징은 해석하기 어렵습니다(entangled). 위의 DCGAN의 경우 생성된 이미지를 사람이 일일이 확인해 찾은 결과입니다. 이후 해석하기 쉬운(disentangled) 특징량(latent code)에 의존하는 Deep Generative Model이 잇달아 제안됐습니다. 앞으로 설명해 드릴 conditional GAN, InfoGAN, ACGAN 등이 바로 여기에 속합니다.
conditional GAN
conditional GAN에서는 $x$뿐 아니라 데이터의 정답 레이블 정보 $y$를 GAN에 적용한 최초의 시도입니다. 아키텍처는 아래 그림과 같습니다.
conditional GAN의 목적함수를 vanilla GAN과 비교해서 보면 $y$가 $D$와 $G$에 추가된 것 외에 같은 점을 확인할 수 있습니다.
\[\min _{ G }{ \max _{ D }{ V\left( D,G \right) } } ={ E }_{ x\sim { p }_{ data }\left( x \right) }\left[ \log { D\left( x,y \right) } \right] +{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ \log { \left\{ 1-D\left( G\left( z,y \right), y\right) \right\} } \right]\]conditional GAN과 같이 아키텍처를 구성할 경우 Zero-Mean Gaussian으로 생성한 $z$와, 우리가 생성하고 싶은 범주의 레이블 정보에 해당하는 벡터 $y$를 함께 넣어 원하는 데이터를 생성할 수 있게 됩니다. $G$는 $z$뿐 아니라 $y$의 정보도 함께 고려하여 데이터를 생성하기 때문에 $z$가 속한 벡터공간을 해석하기 쉬워졌다는 의미로 받아들여도 되지 않을까 싶습니다.
semi-supervised GAN
semi-supervised GAN은 $D$를 multinomial classifier로 구성했습니다. 정답이 있는 실제 데이터는 해당 정답을 맞추도록 $D$가 학습됩니다. 정답이 없는 실제 데이터의 경우 fake를 제외하고, 거기에 제일 비슷한 범주가 예측되도록 합니다(예컨대 $K$개 범주가 있다면 예측된 범주 y-hat은 {$1,2,…K$} 가운데 하나가 됨). $G$가 생성한 가짜 데이터의 경우 $D$는 fake class로 예측하게 됩니다. 이 아키텍처는 레이블 정보가 일부 데이터에 한정된 semi-supervised 환경에서 작동할 수 있고, 범주 정보로 $z$ 공간을 해석할 수 있다는 장점이 있습니다.
ACGAN
Auxiliary Classifier GAN(ACGAN)은 $D$를 두 개의 classifier로 구성했습니다. 하나는 데이터가 실제인지 가짜인지 판별합니다. 나머지 하나는 해당 데이터의 범주를 분류합니다. 이 덕분에 ACGAN로 생성된 데이터는 다른 분류기에 넣어도 범주 분류가 잘 된다고 합니다. 바꿔 말해 이치에 맞는 데이터를 만들어낼 수 있다는 얘기죠. $G$는 conditional GAN처럼 레이블 정보와 $z$를 합쳐 가짜 데이터를 생성합니다. 아키텍처는 다음과 같습니다.
ACGAN의 목적함수는 다음과 같습니다. $L_S$는 기존 GAN의 $D$ 목적함수와 동일합니다. 다시 말해 해당 데이터가 진짜인지 가짜인지 판별해내는 것과 관련이 있습니다. $L_D$는 해당 데이터의 범주를 분류하는 것에 해당합니다. $D$는 $L_S+L_C$를, $G$는 $L_C-L_S$를 최대화하도록 학습됩니다.
\[\begin{align*} &{ L }_{ S }=E\left[ \log { p\left( S=real|{ X }_{ real } \right) } \right] +E\left[ \log { p\left( S=fake|{ X }_{ fake } \right) } \right] \\ &{ L }_{ C }=E\left[ \log { p\left( C=c|{ X }_{ real } \right) } \right] +E\left[ \log { p\left( C=c|{ X }_{ fake } \right) } \right] \end{align*}\]catGAN
categorical GAN(catGAN)은 다음과 같은 조건부 엔트로피(conditional entropy)를 목적함수로 활용합니다.
\[\begin{align*} H\left( X|Y \right) &\equiv \sum _{ x\in \chi }^{ }{ p\left( x \right) H\left( Y|X=x \right) } \\ &=-\sum _{ x\in \chi }^{ }{ p\left( x \right) \sum _{ y\in \Psi }^{ }{ p\left( y|x \right) \log { p\left( y|x \right) } } } \end{align*}\]catGAN의 학습 목표를 직관적으로 나타낸 그림은 다음과 같습니다. 우선 $D$ 입장에서 살펴보겠습니다. $D$는 다음 세 가지 과업을 잘 수행하도록 학습됩니다.
- $(i)$ 실제 데이터($x$)의 경우 $D$ 스스로 범주 구분을 확실하게 한다. 즉 조건부 엔트로피(entropy) $H[p(y$|$x,D)$를 최소화한다.
- $(ii)$ 가짜 데이터($G(z)$)의 경우 $D$ 스스로 범주 구분을 잘 하지 못하게 한다. 즉 조건부 엔트로피 $H[p(y$|$x,G(z))$를 최대화한다.
- $(iii)$ $D$ 스스로 $N$개 전체 진짜 데이터를 $K$개 범주에 균등하게 할당하도록 한다. 즉 주변확률 엔트로피 $H[p(y$|$D)]$를 최대화한다.
$G$는 다음 두 가지 과업을 잘 수행하도록 학습됩니다.
- $(ii)$ 가짜 데이터($G(z)$)라도 $D$가 범주 구분을 확실하게 하도록 한다. 즉 조건부 엔트로피 $H[p(y$|$x,G(z))$를 최소화한다.
- $(iii)$ $D$가 $M$개 전체 가짜 데이터를 $K$개 범주에 균등하게 할당하도록 한다. 즉 주변확률 엔트로피 $H[p(y$|$D)]$를 최대화한다.
catGAN의 목적함수는 다음과 같습니다.
\[\begin{align*} { L }_{ D }=&\max _{ D }{ { H }_{ \chi }\left[ p\left( y|D \right) \right] -{ E }_{ x\sim \chi }\left[ H\left[ p\left( y|x,D \right) \right] \right] +{ E }_{ z\sim p\left( z \right) }\left[ H\left[ p\left( y|G\left( z \right) ,D \right) \right] \right] } \\ { L }_{ G }=&\min _{ G }{ -H_{ G }\left[ p\left( y|D \right) \right] +{ E }_{ z\sim p\left( z \right) }\left[ H\left[ p\left( y|G\left( z \right) ,D \right) \right] \right] } \end{align*}\]위 식 가운데 $L_D$의 우변 두번째 항은 실제로 다음과 같이 계산됩니다. 다시 말해 레이블이 없는 실제 데이터 $N$개를 $D$에 넣고 계산한 조건부 엔트로피를 가리킵니다.
\[\begin{align*} { E }_{ x\sim \chi }\left[ H\left[ p\left( y|x,D \right) \right] \right] =&\frac { 1 }{ N } \sum _{ i=1 }^{ N }{ H\left[ p\left( y|x,D \right) \right] } \\ =&\frac { 1 }{ N } \sum _{ i=1 }^{ N }{ -\sum _{ k=1 }^{ K }{ p\left( y=k|{ x }^{ i },D \right) \log { p\left( y=k|{ x }^{ i },D \right) } } } \end{align*}\]레이블이 있는 데이터를 보유하고 있을 경우 위 항과 별도로 아래와 같은 크로스엔트로피(cross entropy)를 추가할 수도 있습니다. 다시 말해 catGAN은 (semi)supervised learning 과업 또한 수행할 수 있다는 이야기입니다.
\[CE\left[ y,p\left( y|x,D \right) \right] =-\sum _{ i=1 }^{ K }{ { y }_{ i }\log { p\left( y={ y }_{ i }|x,D \right) } }\]$L_D$ 우변 세번째 항은 실제로 다음과 같이 계산됩니다. 모든 $z$에 대해 조건부 엔트로피를 구할 수 없기 때문에 몬테카를로 방법을 활용합니다. 즉 $p(z)$로부터 $M$개 $z$를 뽑은 뒤 이를 $G$에 넣어 조건부 엔트로피를 구하는 것입니다. 이 다음부터는 위 항 계산 방식과 동일합니다.
\[{ E }_{ z\sim p\left( z \right) }\left[ H\left[ p\left( y|G\left( z \right) ,D \right) \right] \right] \approx \frac { 1 }{ M } \sum _{ i=1 }^{ M }{ H\left[ p\left( y|G\left( { z }^{ i } \right) ,D \right) \right] }\]주변확률 엔트로피는 다음과 같이 계산합니다.
\[{ H }_{ \chi }\left[ p\left( y|D \right) \right] =H\left[ \frac { 1 }{ N } \sum _{ i=1 }^{ N }{ p\left( y|x^{ i },D \right) } \right] \\ H_{ G }\left[ p\left( y|D \right) \right] \approx H\left[ \frac { 1 }{ M } \sum _{ i=1 }^{ M }{ p\left( y|G\left( { z }^{ i } \right) ,D \right) } \right]\]InfoGAN
Information GAN(InfoGAN)은 기존 GAN 목적함수에 상호정보량(mutual information)을 추가한 형태입니다. 상호정보량이란 두 확률변수들이 얼마나 의존적(dependent)인지 측정하는 지표로, 두 확률변수의 독립성을 쿨백-라이블러 발산(KLD)으로 측정합니다. 서로 독립일 경우 그 값이 0이 됩니다.
\[I\left( X;Y \right) ={ D }_{ KL }\left( p\left( x,y \right) ||p\left( x \right) p\left( y \right) \right)\]기존 GAN 목적함수를 $V(D,G)$라고 했을 때 InforGAN의 목적함수는 다음과 같습니다.
\[\min _{ G }{ \max _{ D }{ { V }_{ I }\left( D,G \right) } } =V\left( D,G \right) -\lambda I\left( c;G\left( z,c \right) \right)\]InfoGAN에서는 $G$의 입력 노이즈 $z$를 두 개로 분리했습니다. 노이즈 종류에 대한 설명과 아키텍처를 나타낸 그림은 다음과 같습니다.
- $c$ : latent code, 즉 설명 가능한 피처(semantic features)
- $z$ : incompressible noise, 즉 나머지 모든 부분
목적함수에서 확인할 수 있듯 $c$와 $G(z,c)$ 사이의 상호정보량을 최대화한다는 것은, $c$에 의존적인 데이터를 $G$가 생성하도록 한다는 의미입니다. 다시 말해 $c$가 변함에 따라 가짜 데이터 또한 여기에 맞춰 바뀔 수 있도록 학습을 진행한다는 겁니다.
그러나 상호정보량을 단박에 최대화하는 것은 어렵습니다. 이에 변분추론(Variational Inference)을 수행해 $I(c;G(z,c))$의 하한(lower bound)를 구하여 이렇게 구한 하한을 최대화하는 방식으로 학습을 진행하게 됩니다. 구체적인 전개 과정에 대해서는 이곳을 참고하면 좋을 것 같습니다.
Least Squares GAN
vanilla GAN에서는 $p(x)$와 $p(z)$ 간의 거리를 KLD로 측정했습니다. 그런데 Least Squares GAN(LSGAN)은 이름 그대로 거리 측정 지표로 least Square를 씁니다. LSGAN의 목적함수는 다음과 같습니다.
\[\begin{align*} \min _{ D }{ { V }_{ LSGAN }\left( D \right) } =&\frac { 1 }{ 2 } { E }_{ x\sim { p }_{ data }\left( x \right) }\left[ { \left( D\left( x \right) -b \right) }^{ 2 } \right] +\frac { 1 }{ 2 } { E }_{ z\sim { p }_{ z }\left( z \right) }\left[ { \left( D\left( G\left( z \right) \right) -a \right) }^{ 2 } \right] \\ \min _{ G }{ { V }_{ LSGAN }\left( G \right) } =&\frac { 1 }{ 2 } { E }_{ z\sim { p }_{ z }\left( z \right) }\left[ { \left( D\left( G\left( z \right) \right) -c \right) }^{ 2 } \right] \end{align*}\]목적함수를 이렇게 만들면 $D$는 진짜 데이터 $x$를 입력받았을 때 $b$를 출력하도록, 가짜 데이터 $G(z)$의 경우 $a$가 되도록 합니다. $G$는 $D$가 가짜 데이터를 받았을 때 $c$를 출력하도록 유도합니다. 이 말은 어떤 의미일까요? 다음 그림을 보면서 생각해 보겠습니다.
위 그림에서 KLD를 거리 함수로 쓰게 되면 진짜 데이터의 분포 중심과 가짜 데이터의 중심이 같아서 더 이상 최적화하기 어렵습니다. 하지만 가짜 데이터들 가운데서도 실제 데이터와 멀리 떨어져 있는 것이 있을 수 있습니다. 예컨대 핑크색 포인트들이 바로 그런 경우입니다. least Square를 쓰게 되면 이러한 데이터들도 실제 데이터의 분포 쪽으로 가깝게 끌어올 수 있게 됩니다. least Square는 $x$가 loss에 대해 strictly convex하기 때문(함수 꼴이 빗살무늬 토기 모양의 그림이 됨)에 유일한 최적해를 가지며 이 점 덕분에 LSGAN이 좀 더 안정적인 학습이 가능하다고 합니다.
Wasserstein GAN
GAN을 학습하면 $G$가 생성하는 분포 $p_g(x)$가 실제 데이터 분포 $p_{data}(x)$에 근사합니다. 그 이유는 최적의 $D$를 가정했을 때 $G$에 대한 GAN의 목적함수는 $p_g(x)$와 $p_{data}(x)$ 사이의 젠슨-섀넌 다이버전스(Jensen Shannon Divergence) 최소화와 동일하기 때문입니다. 이와 관련해서는 이곳을 참고하시면 좋을 것 같습니다.
어쨌거나 젠슨-섀넌 다이버전스는 두 확률 분포 간 차이를 측정하는 함수인데요. 불행하게도 언제나 잘 작동하는 건 아닙니다. 다음 예시를 보겠습니다.
\[{ p }_{ real }=\left( 0,y \right) ,y\sim U\left[ 0,1 \right] \\ { p }_{ fake }=\left( \theta ,y \right) ,y\sim U\left[ 0,1 \right]\]다소 극단적인 설정이긴 하지만 위와 같은 상황에서 젠슨-셰넌 다이버전스는 $θ$가 0일 때만 0, $θ$가 0이 아닌 모든 지점에서 $\log2$의 값을 갖습니다. $θ$가 0에 가까울 수록 두 확률 분포 사이의 차이가 줄어드는 건 분명한데 젠슨-섀넌 다이버전스라는 측정 기법은 이러한 변화를 포착해내지 못한다는 뜻이지요. 이것이 GAN 학습이 잘 안되는 한 원인이 될 수 있겠습니다. 그러나 WGAN에서 제시하는 Wasserstein Distance(이하 WDist)는 두 분포 간 차이가 |$θ$| 꼴이 되어서 이러한 변화 캐치에 능동적입니다. 다음 그림과 같습니다.
WDist를 직관적으로 설명하면 이렇습니다. $P_r$과 $P_θ$ 사이의 WDist는 $P_r$을 $P_θ$로 옮길 때 필요한 양과 거리의 곱을 가리킵니다. 산등성이 전체를 옮기는 것 같다고 하여 Earth Mover Distance라고도 불립니다.
하지만 WDist를 바로 계산하는 것은 어렵기 때문에 몇 가지 수학적 증명 과정을 통해 WDist를 근사하게 됩니다. 결과적으로 도출된 목적함수는 다음과 같습니다.
\[\begin{align*} &\max _{ D }{ { V }_{ WGAN }\left( D \right) } ={ E }_{ x\sim { p }_{ data }\left( x \right) }\left[ D\left( x \right) \right] -{ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ D\left( G\left( z \right) \right) \right] \\ &\max _{ G }{ { V }_{ WGAN }\left( G \right) } ={ E }_{ z\sim { p }_{ z }\left( z \right) }\left[ D\left( G\left( z \right) \right) \right] \\ &{ \theta }_{ D }\leftarrow clip\left( -0.01,0.01 \right) \end{align*}\]위 목적함수가 기존 GAN과의 차이를 보이는 점은 다음과 같습니다.
- log(sigmoid(logits)) 대신 logits를 그대로 사용한다.
- $D$는 임의의 $k$-lipschitz function이어야 한다. 이에 $D$의 모든 파라메터들을 임의의 $[-c,c]$로 클리핑한다. 이 때 $c$는 작은 상수값.
WGAN은 거의 모든 GAN 데이터셋에서 학습이 잘 돼 많은 주목을 받았습니다. WGAN은 $D$와 $G$ 사이의 균형 문제를 걱정할 필요 없이 $D$가 수렴할 때까지 학습을 진행해도 될 정도로 안정적이라고 합니다.
Comments