"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.title('Distribution of P_g(x)')\n",
+ "plt.hist(G.predict(np.random.uniform(0,1,10000)), 50, normed=1, facecolor='green', alpha=0.75)\n",
+ "l = plt.plot(bins1, y, 'r--', linewidth=1)\n",
+ "plt.axis([-5, 12, 0, 0.45])\n",
+ "plt.grid(True)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "\n",
+ "실습을 통해 다음과 같은 사실을 알 수 있습니다. \n",
+ "\n",
+ "1. 초록색 분포가 100줄짜리 프로그램(주석과 그림 그리는 부분 빼면 얼추 100줄;;;) 치고는 $p_{data}$ 분포를 꽤 잘 따라가고 있습니다.
\n",
+ "2. D의 정밀도가 처음에는 1.0으로 시작했다가(위 주황색 그래프) 점점 0.5 근처로 수렴하고 있습니다. 마지막 부분에 실제 softmax층에서 나온 출력을 보면 두 값 모두 0.5 근처로 뭐가 뭔지 모르겠다고 결과를 내보내고 있습니다.
\n",
+ "3. 하지만 G, D가 평형점을 정확히 찾지 못하고 왔다갔다 진동하고 있는 모습을 보입니다. 이에 대해서는
TF-KR의 유재준님 논문 발표[11]에서 확인할 수 있습니다. 계속 학습을 진행하면 결과가 오히려 나빠지는 경우도 많이 나타납니다.
\n",
+ "4. 학습이 초기조건에 꽤 민감하게 반응합니다. 위 결과는 한 서너번 반복해서 나온 괜찮은 결과입니다.
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 약간의 이론\n",
+ "
\n",
+ "\n",
+ "\n",
+ "논문에서 GANs의 이론적 논의는 D를 고정한 상태에서 G에 대한 코스트함수가 전역적 최소를 가지고 그것이 $p_{data}=p_{g}$일 때이며 상기 알고리즘으로 그 전역 최소에 도달할 수 있는지 보이는 것입니다. 크게 3가지 부분으로 이 문제를 설명합니다.
유재준님의 블로그[12]와 TF-KR의 논문 발표를 참고하여 내용을 정리하였습니다.\n",
+ "
\n",
+ "\n",
+ "> Proposition 1. *For G fixed, the optimal discriminator D is*\n",
+ "$$\n",
+ "D^{*}_{G}(\\boldsymbol{x}) = \\frac{p_{data}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})}\n",
+ "$$\n",
+ "\n",
+ "\n",
+ "Proposition 1은 G가 고정된 상태에서 최적의 D는 위 식으로 주어진다는 것을 이야기 하며 이를 보이기 위해서는 $\\frac{\\partial V(G,D)}{\\partial D(\\boldsymbol{x})}=0$ 또는 ($ V(G,D) = -J^{D}$ 이므로) $\\frac{\\partial J^{D}}{\\partial D(\\boldsymbol{x})}=0$ 인 $D(\\boldsymbol{x})$를 구하면 됩니다.\n",
+ "
\n",
+ "$$\n",
+ "\\begin{align}\n",
+ "\\frac{\\partial V(G,D)}{\\partial D(\\boldsymbol{x})} \n",
+ "&= \\frac{\\partial}{\\partial D(\\boldsymbol{x})} \\int_{\\boldsymbol{x}} p_{x \\sim data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) + p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}) \\log (1-D(\\boldsymbol{x})) d\\boldsymbol{x} \\\\\n",
+ "&= \\int_{\\boldsymbol{x}} \\frac{\\partial}{\\partial D(\\boldsymbol{x})} \\left[ p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) + p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}) \\log (1-D(\\boldsymbol{x})) \\right] d\\boldsymbol{x} \\\\\n",
+ "&= \\int_{\\boldsymbol{x}} p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x}) \\frac{1}{D(\\boldsymbol{x})} - p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}) \\frac{1}{1-D(\\boldsymbol{x})} d\\boldsymbol{x} \n",
+ "\\end{align}\n",
+ "$$\n",
+ "
\n",
+ "이므로\n",
+ "
\n",
+ "$$\n",
+ "\\int_{x} \\frac{p_{x \\sim data}(x)\\left( 1-D(x) \\right) - p_{x \\sim g}(x)D(x)}{D(x)\\left(1-D(x) \\right)} dx =0\n",
+ "$$\n",
+ "
\n",
+ "입니다. \n",
+ "위 적분식이 0이 되기 위해서는 Integrand의 분자가 0 인 경우를 생각해 볼 수 있습니다. 그런데 분자는 0보다 크거나 같다는 것을 알지 못하므로 꼭 분자가 0이 아니더라도 적분식이 0이 될 수 가 있습니다.(적당히 +,- 해서 총합이 0) 따라서 $\\frac{\\partial V(G,D)}{\\partial D(\\boldsymbol{x})}=0$를 만족하는 $D(\\boldsymbol{x})$가 지역 최소(또는 지역 최대)나 안장점이 아니기 위해서는 $V(G,D)$가 볼록함을(또는 오목함을) 보여야 합니다. $ V(G,D) = -J^{D}$ 이므로 $J^{D}$가 볼록함수인지를 보여도 되는데 만약 $J^{D}$가 엄격하게 볼록하다면 전역 최소를 가지며 분자가 0인 경우가 $\\frac{\\partial J^{D}}{\\partial D(\\boldsymbol{x})}=0$ 인 유일한 전역 최소라 할 수 있습니다.\n",
+ "
\n",
+ "$$\n",
+ "\\begin{align}\n",
+ "J^{D} &= -\\int_{x} p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x}) \\log D(x) + p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}) \\log (1-D(x)) dx \\\\\n",
+ "&= \\int_{x} p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x}) \\left(-\\log D(x)\\right) + p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}) \\left(-\\log (1-D(x))\\right) dx\n",
+ "\\end{align}\n",
+ "$$\n",
+ "
\n",
+ "$J^{D}$는 위 식과 같은데 위 식에서 $p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})$는 우리가 가진 샘플들에 의해 이미 결정된 확률분포 입니다. 그리고 지금 G가 주어진 상태, 즉, G가 고정된 상태에서 D(x)만 변화 시켜 $J^{D}$의 변화를 보고 있으므로 $p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}) $ 역시 고정입니다. 결국 $J^{D}$는 독립변수 $D(x)$에 대한 함수 $-\\log D(x)$와 $-\\log \\left(1-D(x)\\right)$의 조합이므로 $-\\log D(x)$와 $-\\log \\left(1-D(x)\\right)$가 볼록함수임을 보이면 $J^{D}$가 볼록함수임을 보일 수 있습니다. 이를 위해 $D(x)$에 대한 이계미분이 음이 아님을 보이면 되므로\n",
+ "
\n",
+ "$$\n",
+ "\\frac{\\partial}{\\partial D(x)}\\left(\\frac{\\partial \\{-\\log D(x)\\}}{\\partial D(x)}\\right) = \\frac{\\partial}{\\partial D(x)}\\left( -\\frac{1}{D(x)} \\right) = \\frac{1}{D^{2}(x)} \n",
+ "$$\n",
+ "
\n",
+ "$$\n",
+ "\\frac{\\partial}{\\partial D(x)}\\left(\\frac{\\partial \\{-\\log (1-D(x))\\}}{\\partial D(x)}\\right) = \\frac{\\partial}{\\partial D(x)}\\left( \\frac{1}{1-D(x)} \\right) = \\frac{1}{ (1-D(x))^2 } \n",
+ "$$\n",
+ "
\n",
+ "이고, 두 결과 모두 $D(x) = 0$를 제외하면 항상 양수이므로 두 함수 모두 볼록 함수이며 이 함수들이 0보다 큰 $p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})$, $p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}) $와의 곱의 합으로 나타나는 $J^{D}$ 역시 볼록함수임을 알 수 있습니다. \n",
+ "따라서\n",
+ "
\n",
+ "$$ p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x}) \\left( 1-D(\\boldsymbol{x}) \\right) - p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x})D(\\boldsymbol{x}) =0 $$\n",
+ "
\n",
+ "이며 최종적으로\n",
+ "
\n",
+ "$$ D^{*}(\\boldsymbol{x}) = \\frac{p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})}{p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})+p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x})}$$\n",
+ "
\n",
+ "임을 확인할 수 있습니다. \n",
+ "\n",
+ "\n",
+ "마지막으로 $D(\\boldsymbol{x})$는 $p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})$와 $p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x})$가 0이 아닌 집합에 대해서만 정의되면 되므로(어떤 샘플 $\\boldsymbol{x}$가 일어날 확률이 0인 것에 대해서는 참 거짖을 판별할 필요 없음) $Supp(p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})) \\cup Supp(p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}))$ 에서만 정의되면 된다 라고 논문에서 언급합니다. \n",
+ "논문에서 증명 하기를 $(a,b) \\in \\mathbb{R}^{2} \\backslash \\{0,0\\}$ 인 a, b에 대해서 $a \\log(y) + b \\log(1-y)$라는 함수를 [0,1]에서 y에 대해 미분해서 0인 점을 찾으면 최대값이 $ \\frac{a}{a+b}$에서 나타난다고 하고 이 식에서 a에 해당하는것이 $p_{\\boldsymbol{x} \\sim data}$이고 b에 해당하는 것이 $p_{\\boldsymbol{x} \\sim g}$ 니까 a, b가 0이 아니었듯이 $p_{\\boldsymbol{x} \\sim data}$, $p_{\\boldsymbol{x} \\sim g}$도 0이 아닌 경우에 대해서 생각하기 위해 $Supp(p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})) \\cup Supp(p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x}))$ 에서만 정의되면 된다고 언급하고 증명을 마무리한 것으로 생각됩니다.\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "\n",
+ ">Theorem 1. *The global minimum of the virtual training criterion $C(G)$ is achieved if and only if $p_g = p_{data}$. At that point, $C(G)$ achieves the value $−log4$*. \n",
+ "\n",
+ "\n",
+ "위 결과에 의해 $V(G,D)$를 최대화 하는 D를 찾았다고 하면 G에 대한 코스트 C(G)를 아래와 같이 쓸 수 있습니다.\n",
+ "
\n",
+ "$$\n",
+ "\\begin{align}\n",
+ "C(G) \n",
+ "& = \\underset{D}{max}V(G,D) \\\\\n",
+ "& = \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left[ \\log D^{*}_{G}(x) \\right] + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left[ \\log (1-D^{*}_{G}(x)) \\right] \\\\\n",
+ "& = \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left[ \\log \\frac{p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})}{p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})+p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x})} \\right] + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left[ \\log \\frac{p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x})}{p_{\\boldsymbol{x} \\sim data}(\\boldsymbol{x})+p_{\\boldsymbol{x} \\sim g}(\\boldsymbol{x})} \\right]\n",
+ "\\end{align}\n",
+ "$$\n",
+ "
\n",
+ "만약 $p_g = p_{data}$ 라면 C(G)는 아래와 같습니다.\n",
+ "
\n",
+ "$$\n",
+ "\\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left[ - \\log 2 \\right] + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left[ - \\log 2 \\right] = -\\log 4\n",
+ "$$\n",
+ "
\n",
+ "이제 $-\\log 4$가 C(G)의 전역 최소라는 것을 보이기 위해 아래처럼 $C(G)=V(D^{*}_{G}, G)$에서 위 식을 빼면\n",
+ "
\n",
+ "$$\n",
+ "\\begin{matrix} \n",
+ "& & \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left [ \\log \\frac{p_{data}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} \\right] & + & \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left [ \\log \\frac{p_{g}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} \\right] & = & C(G) & \\\\\n",
+ "- & ( & \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left[ - \\log 2 \\right] & + & \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left[ - \\log 2 \\right] & = & -\\log 4 & ) \n",
+ "\\end{matrix}\n",
+ "$$\n",
+ "
\n",
+ "$$\n",
+ "\\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left [ \\log \\frac{p_{data}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} \\right] - \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left[ - \\log 2 \\right] \n",
+ "+ \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left [ \\log \\frac{p_{g}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} \\right]-\\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left[ - \\log 2 \\right] = C(G)+\\log 4\n",
+ "$$\n",
+ "
\n",
+ "이 됩니다. 기대값 안에 $-\\log 2$에서 $-$를 끄집어 내고 정리하면\n",
+ "
\n",
+ "$$\n",
+ "\\begin{align}\n",
+ "C(G) &= -\\log 4 + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left [ \\log \\frac{p_{data}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} \\right] + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left[ \\log 2 \\right] \n",
+ "+ \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left [ \\log \\frac{p_{g}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} \\right]+\\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left[ \\log 2 \\right] \\\\\n",
+ "&= -\\log 4 + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left [ \\log \\frac{p_{data}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} + \\log 2\\right] + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left [ \\log \\frac{p_{g}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} + \\log 2\\right] \\\\\n",
+ "&= -\\log 4 + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left [ \\log \\frac{ 2\\,p_{data}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} \\right] + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left [ \\log \\frac{2\\, p_{g}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})} \\right] \\\\\n",
+ "&= -\\log 4 + \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left [ \\log \\frac{ p_{data}(\\boldsymbol{x})}\n",
+ "{ \\frac{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})}{2} } \\right] + \n",
+ "\\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{g}}} \\left [ \\log \\frac{p_{g}(\\boldsymbol{x})}\n",
+ "{ \\frac{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})}{2} } \\right] \\\\\n",
+ "&= -\\log 4 \n",
+ "+ \\int_{\\boldsymbol{x} \\sim p_{\\text{data}}} p_{data}(\\boldsymbol{x}) \\left [ \\log \\frac{ p_{data}(\\boldsymbol{x})}\n",
+ "{ \\frac{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})}{2} } \\right] d\\boldsymbol{x}\n",
+ "+ \n",
+ "\\int_{\\boldsymbol{x} \\sim p_{\\text{g}}} p_{g}(\\boldsymbol{x}) \\left [ \\log \\frac{p_{g}(\\boldsymbol{x})}\n",
+ "{ \\frac{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})}{2} } \\right] d\\boldsymbol{x} \\\\\n",
+ "&= -\\log 4 + KL \\left( p_{data} \\parallel \\frac{p_{data}+p_{g}}{2} \\right) + KL \\left( p_{g} \\parallel \\frac{p_{data}+p_{g}}{2} \\right)\n",
+ "\\end{align} \n",
+ "$$\n",
+ "
\n",
+ "가 됩니다. 마지막 줄은 앞서 살펴보았던 쿨벡-라이블러 발산의 정의를 그대로 이용한 것입니다. 앞서 쿨벡-라이블러 발산은 항상 0보다 크거나 같으며 볼록하다는 것을 확인했습니다. 따라서 위 식으로 부터 $C(G)$는 볼록함수이며 $p_{data}=p_{g}$일 때 전역적 최솟값 $-\\log 4$를 가진다는 것이 증명되었습니다.\n",
+ "\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 참고문헌\n",
+ "
\n",
+ "\n",
+ "[1] 칸아카데미 정보엔트로피 (https://ko.khanacademy.org/computing/computer-science/informationtheory/moderninfotheory/v/information-entropy)
\n",
+ "[2] Cross entropy, https://en.wikipedia.org/wiki/Cross_entropy
\n",
+ "[3] CSE 533: Information Theory in Computer Science, https://catalyst.uw.edu/workspace/anuprao/15415/86593
\n",
+ "[4] GANs in 50 lines of code (PyTorch), Dev Nag, https://medium.com/@devnag/generative-adversarial-networks-gans-in-50-lines-of-code-pytorch-e81b79659e3f
\n",
+ "[5] tensorflow-GAN-1d-gaussian-ex, 이활석, https://github.com/hwalsuklee/tensorflow-GAN-1d-gaussian-ex
\n",
+ "[6] 아주 간단한 GAN 구현하기, 홍정모, http://blog.naver.com/atelierjpro/220984758512
\n",
+ "[7] Generative Adversarial Networks, Ian J. Goodfellow et al, arXiv:1406.2661, 2014
\n",
+ "[8] KerasGAN, https://github.com/osh/KerasGAN
\n",
+ "[9] NIPS 2016 Tutorial:Generative Adversarial Networks, Ian J. Goodfellow, arXiv:1701.00160v3, 2017
\n",
+ "[10] Generative adversarial networks , 김남주, https://www.slideshare.net/ssuser77ee21/generative-adversarial-networks-70896091
\n",
+ "[11] PR12와 함께하는 GANs, 유재준, https://www.slideshare.net/thinkingfactory/pr12-intro-to-gans-jaejun-yoo
\n",
+ "[12] 초짜 대학원생 입장에서 이해하는 Generative Adversarial Nets, 유재준, http://jaejunyoo.blogspot.com/2017/01/generative-adversarial-nets-1.html\n",
+ "
"
+ ]
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": {},
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.5.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}