"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Z = np.linspace(0,1,1000)\n",
"X = G.predict(Z)\n",
"\n",
"fig = plt.figure()\n",
"fig.suptitle('G(z)', fontsize=14, fontweight='bold')\n",
"ax = fig.add_subplot(111)\n",
"ax.set_xlabel('z')\n",
"ax.set_ylabel('x')\n",
"plt.plot(Z,X)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"위 그래프를 보면 $z$=0 근방에서 기울기가 급하고 0.2~0.8까지 기울기가 완만하다가 0.8 이상에서 다시 기울기가 증가하는 모습을 확인할 수 있습니다. 히스토그림 결과를 보면 8 근방의 값이 목표보다 많이 생성되고 있는것이 확인되는데 이는 $G(\\boldsymbol{z})$의 매핑상태가 0.0~0.2구간보다 기울기가 완만하게 이루어져 있어서 그렇게 된 것입니다. 좀 더 이상적인 함수 $G(\\boldsymbol{z})$는 다음과 같은 모양이 될 것입니다.\n",
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"어쨌거나 우리는 분포를 아는 확률변수 $\\boldsymbol{z}$로 부터 어떤 매핑을 통해 $p_{g}(\\boldsymbol{x})$를 분포로 가지는 확률변수 $\\boldsymbol{x}$를 만들어주는 함수 $G(\\boldsymbol{z})$를 찾아냈습니다. (일반 적으로 $\\boldsymbol{z}$도 벡터 변수인데 우리 예제에서는 0~1사이의 숫자라서 엄밀히 말하면 볼드 $\\boldsymbol{z}$가 아니라 그냥 $z$ 임)\n",
"
\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의 이론적 논의는 $\\max_{D} V(G,D)$가 G에 대해 전역적 최소를 가지고 그것이 $p_{data}=p_{g}$일 때이며 상기 알고리즘으로 그 전역 최소에 도달할 수 있는지 보이는 것입니다. 크게 3가지 부분으로 이 문제를 설명합니다. 이미 TF-KR의 유재준님께서 이론 부분을 리뷰한 훌륭한 문서들이 존재하는데
[11][12] 여기서는 이 문서들을 참고하고 조금 더 친철하게 내용을 보충하여 설명해보도록 하겠습니다. 각각 알아보기 앞서 우선 한가지 짚어야 할 부분이 있습니다. \n",
"
\n",
"\n",
">*The generator G implicitly defines a probability distribution $p_g$ as the distribution of the samples $G(z)$ obtained when $z ∼ p_z$.* \n",
"\n",
"\n",
"\n",
"바로 위 부분인데요. $G$와 $p_g$가 동일한 것이 아니라는 것입니다. $G$는 제너레이터고 $p_g$는 그 제너레이터가 암시적으로 정의하는 확률 분포입니다. 다시말하면 실제로 $G$는 잠재변수 $\\boldsymbol{z}$로 부터 샘플 $G(\\boldsymbol{z})$를 생성할 뿐이지 $p_g$를 직접적으로 정의 하지 않는다는 것입니다. 우리의 학습 알고리즘이 $G$의 매개변수를 변경하면서 샘플의 분포를 변경하면 암시적으로 $p_g$가 변할 것이고 그것이 $p_{data}$와 비슷하기를 바라는 것입니다. \n",
"확률밀도함수 $p_{\\boldsymbol{z}}(\\boldsymbol{z})$를 정확히 알고 있는 확률변수 $\\boldsymbol{Z}$로부터 어떤 함수 관계 $\\boldsymbol{x}=G(\\boldsymbol{z})$에 의해 또다른 확률변수 $\\mathbf{X}$가 정의될 때 \"Change of variable formula\"에 의해 $\\mathbf{X}$의 확률밀도함수를 구할 수 있습니다.
[13][14]\n",
"하지만 우리는 $p_g$를 구할 것이 아니라 $p_g$를 따르는 $\\boldsymbol{X}$를 생성하는 $G$ ($\\boldsymbol{z}$를 적절한 $\\boldsymbol{x}$로 바꿔주는)를 구할 것입니다. 이 개념을 확실히 새기고 각각 하나씩 살펴보도록 하겠습니다. \n",
"($p_g$를 명시적으로 구하는 경우에 있어서 함수 $G(\\boldsymbol{z})$의 역함수 존재 여부가 문제가 될 수 있는데 역함수가 존재하지 않더라도 역함수가 존재하는 구역으로 세분화해서 \"Change of variable formula\"를 적용하여 $p_g$를 구할 수 있습니다. 역함수의 존재 여부는 문제가 되지 않는다는
TF-KR의 토론이 있었습니다.)\n",
"
\n",
"\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 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})$를 구하면 됩니다. 우선 논문의 식(3)은 다음과 같습니다. \n",
"
\n",
"$$\n",
"\\begin{align}\n",
"V(G,D) &= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) d\\boldsymbol{x} + \\int_{z} p_{z}(z) \\log (1-D(g(z))) dz \\\\\n",
"&= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) + p_{g}(\\boldsymbol{x}) \\log (1-D(\\boldsymbol{x})) d\\boldsymbol{x}\n",
"\\end{align}\n",
"$$\n",
"
\n",
"두번째 적분항의 적분 도메인이 $z$에서 $\\boldsymbol{x}$로 바뀌게 되는데 \n",
"이 때 특정 도메인 $Z$가 있어서 $z \\in Z$에 대한 확률 $P(z \\in Z)$는 $x = g(z)$에 의해 변환된 도메인 $X$에서 $x \\in X$에 대한 확률 $P(x \\in X)$와 같으므로 \n",
"
\n",
"$$\\int_{z \\in Z} p(z) dz = \\int_{x=g(z) \\, \\in \\, X=g(Z)} p(x) dx$$\n",
"
\n",
"이고 따라서 다음이 성립합니다.\n",
"\n",
"
\n",
"$$\\int_{z \\in Z} p(z)f(g(z)) dz = \\int_{x \\in X} p(x)f(x) dx$$\n",
"
\n",
"이에 대해서는 요슈아 벤지오 교수에게 메일로 질문을 해서 아래와 같은 답변을 받아 정리를 했습니다.\n",
"
\n",
"\n",
">There is no need for the change of variable formula. $\\int p_x(x) f(x) dx = \\int p_z(z) f(g(z)) dz$ because $ \\int p_x(x) dx$ is already equal by definition to $\\int_{z: x=g(z)} p_z(z) dz$ \n",
"\n",
"\n",
"또는 다음과 같이 유도할 수도 있습니다.
[14]\n",
"
\n",
"$$\n",
"\\begin{align}\n",
"V(G,D) \n",
"&= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) d\\boldsymbol{x}+ \\int_{z} p_{z}(z) \\log (1-D(g(z))) dz \\\\[4pt]\n",
"&= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) d\\boldsymbol{x}+ \\int_{\\boldsymbol{x}} p_{z}(g^{-1}(\\boldsymbol{x})) \\log (1-D(g(g^{-1}(\\boldsymbol{x})))) \\left| \\frac{dz}{d\\boldsymbol{x}} \\right| d\\boldsymbol{x} \\quad \\because z = g^{-1}(\\boldsymbol{x}),\\text{change of variable} \\\\[4pt]\n",
"&= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) d\\boldsymbol{x}+ \\int_{\\boldsymbol{x}} p_{z}(g^{-1}(\\boldsymbol{x}))\\left| \\frac{dz}{d\\boldsymbol{x}} \\right| \\log (1-D(\\boldsymbol{x})) d\\boldsymbol{x} \\\\[4pt]\n",
"&= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) d\\boldsymbol{x} + \\int_{\\boldsymbol{x}} p_{g}(\\boldsymbol{x}) \\log (1-D(\\boldsymbol{x})) d\\boldsymbol{x} \\quad \\because p_{g}(\\boldsymbol{x})=p_{z}(g^{-1}(\\boldsymbol{x}))\\left| \\frac{dz}{d\\boldsymbol{x}} \\right| \\\\[4pt]\n",
"&= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) + p_{g}(\\boldsymbol{x}) \\log (1-D(\\boldsymbol{x})) d\\boldsymbol{x} \n",
"\\end{align}\n",
"$$\n",
"
\n",
"이제 미분을 하면 \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_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) + p_{g}(\\boldsymbol{x}) \\log (1-D(\\boldsymbol{x})) d\\boldsymbol{x} \\\\[3pt]\n",
"&= \\int_{\\boldsymbol{x}} \\frac{\\partial}{\\partial D(\\boldsymbol{x})} \\left[ p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) + p_{g}(\\boldsymbol{x}) \\log (1-D(\\boldsymbol{x})) \\right] d\\boldsymbol{x} \\\\[3pt]\n",
"&= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\frac{1}{D(\\boldsymbol{x})} - p_{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_{data}(\\boldsymbol{x})\\left( 1-D(\\boldsymbol{x}) \\right) - p_{g}(\\boldsymbol{x})D(\\boldsymbol{x})}{D(\\boldsymbol{x})\\left(1-D(\\boldsymbol{x}) \\right)} d\\boldsymbol{x} =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_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log D(\\boldsymbol{x}) + p_{g}(\\boldsymbol{x}) \\log (1-D(\\boldsymbol{x})) d\\boldsymbol{x} \\\\[3pt]\n",
"&= \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\left(-\\log D(\\boldsymbol{x})\\right) + p_{g}(\\boldsymbol{x}) \\left(-\\log (1-D(\\boldsymbol{x}))\\right) d\\boldsymbol{x}\n",
"\\end{align}\n",
"$$\n",
"
\n",
"$J^{D}$는 위 식과 같은데 위 식에서 $p_{data}(\\boldsymbol{x})$는 우리가 가진 샘플들에 의해 이미 결정된 확률분포 입니다. 그리고 지금 $G$가 주어진 상태, 즉, $G$가 고정된 상태에서 $D(x)$만 변화 시켜 $J^{D}$의 변화를 보고 있으므로 $p_{g}(\\boldsymbol{x}) $ 역시 고정입니다. 결국 $J^{D}$는 독립변수 $D(\\boldsymbol{x})$에 대한 함수 $-\\log D(\\boldsymbol{x})$와 $-\\log \\left(1-D(\\boldsymbol{x})\\right)$의 조합이므로 $-\\log D(\\boldsymbol{x})$와 $-\\log \\left(1-D(\\boldsymbol{x})\\right)$가 볼록함수임을 보이면 $J^{D}$가 볼록함수임을 보일 수 있습니다. 이를 위해 $D(\\boldsymbol{x})$에 대한 이계미분이 음이 아님을 보이면 되므로\n",
"
\n",
"$$\n",
"\\frac{\\partial}{\\partial D(\\boldsymbol{x})}\\left(\\frac{\\partial \\{-\\log D(\\boldsymbol{x})\\}}{\\partial D(\\boldsymbol{x})}\\right) = \\frac{\\partial}{\\partial D(\\boldsymbol{x})}\\left( -\\frac{1}{D(\\boldsymbol{x})} \\right) = \\frac{1}{D^{2}(\\boldsymbol{x})} \n",
"$$\n",
"
\n",
"$$\n",
"\\frac{\\partial}{\\partial D(\\boldsymbol{x})}\\left(\\frac{\\partial \\{-\\log (1-D(\\boldsymbol{x}))\\}}{\\partial D(\\boldsymbol{x})}\\right) = \\frac{\\partial}{\\partial D(\\boldsymbol{x})}\\left( \\frac{1}{1-D(\\boldsymbol{x})} \\right) = \\frac{1}{ (1-D(\\boldsymbol{x}))^2 } \n",
"$$\n",
"
\n",
"이고, 두 결과 모두 $D(\\boldsymbol{x}) = 0$를 제외하면 항상 양수이므로 두 함수 모두 볼록 함수이며 이 함수들이 0보다 큰 $p_{data}(\\boldsymbol{x})$, $p_{g}(\\boldsymbol{x}) $와의 곱의 합으로 나타나는 $J^{D}$ 역시 $D(\\boldsymbol{x})$에 대해 볼록함수임을 알 수 있습니다. \n",
"따라서\n",
"
\n",
"$$ p_{data}(\\boldsymbol{x}) \\left( 1-D(\\boldsymbol{x}) \\right) - p_{g}(\\boldsymbol{x})D(\\boldsymbol{x}) =0 $$\n",
"
\n",
"이며 최종적으로\n",
"
\n",
"$$ D^{*}(\\boldsymbol{x}) = \\frac{p_{data}(\\boldsymbol{x})}{p_{data}(\\boldsymbol{x})+p_{g}(\\boldsymbol{x})}$$\n",
"
\n",
"임을 확인할 수 있습니다. \n",
"\n",
"\n",
"마지막으로 $D(\\boldsymbol{x})$는 $p_{data}(\\boldsymbol{x})$와 $p_{g}(\\boldsymbol{x})$가 0이 아닌 집합에 대해서만 정의되면 되므로(어떤 샘플 $\\boldsymbol{x}$가 일어날 확률이 0인 것에 대해서는 참 거짖을 판별할 필요 없음) $Supp(p_{data}(\\boldsymbol{x})) \\cup Supp(p_{g}(\\boldsymbol{x}))$ 에서만 정의되면 된다 라고 논문에서 언급합니다. \n",
"논문에서 증명 하기를 $(a,b) \\in \\mathbb{R}^{2} \\backslash \\{0,0\\}$ (집합 (a,b)는 집합 {0,0}을 제외한 실수쌍인 집합)인 a, b에 대해서 $a \\log(y) + b \\log(1-y)$라는 함수를 [0,1]에서 y에 대해 미분해서 0인 점을 찾으면 최대값이 $ \\frac{a}{a+b}$에서 나타난다고 하고 이 식에서 a에 해당하는것이 $p_{data}$이고 b에 해당하는 것이 $p_{g}$ 니까 a, b가 0이 아니었듯이 $p_{data}$, $p_{g}$도 0이 아닌 경우에 대해서 생각하기 위해 $Supp(p_{data}(\\boldsymbol{x})) \\cup Supp(p_{g}(\\boldsymbol{x}))$ 에서만 정의되면 된다고 언급하고 증명을 마무리합니다.\n",
"
\n",
"\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
">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)$라 하면 아래와 같이 쓸 수 있습니다. 여기서 $C(G)$를 *virtual training criterion*이라고 표현하는데 $C(G)$는 $G$에 대한 함수인데 존재하는 모든 $G$에 대해서 $D$가 모조리 최대화 되어있는 상태의 함수입니다. 말 그대로 $max_{D} V(G,D)$인 것입니다. 이 함수를 우리가 정식화해서 구할 수 있으면 이 함수를 가지고 경사하강을 하면 될테지만 이런 함수를 미분가능할 정도로 정식화할 수 없기 때문에 $G$에 대한 \"virtual training criterion\"이라고 표현했습니다. 자세한 그림은 Proposition 2에서 다시 살펴보도록 하겠습니다. \n",
"
\n",
"$$\n",
"\\begin{align}\n",
"C(G) \n",
"& = \\underset{D}{max}V(G,D) \\\\[3pt]\n",
"& = \\mathbb{E}_{\\boldsymbol{x} \\sim p_{\\text{data}}} \\left[ \\log D^{*}_{G}(x) \\right] + \\mathbb{E}_{p_{\\boldsymbol{x} \\sim \\text{g}}} \\left[ \\log (1-D^{*}_{G}(x)) \\right] \\\\[3pt]\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]\n",
"\\end{align}\n",
"$$\n",
"
\n",
"위 식에서 확인할 수 있듯이 $C(G)$는 $C(G)$에 어떤 $G$가 들어와도 $D$는 $D^{*}_{G}$로 이미 최대화가 되어 있는 그런 함수라는 것을 확인할 수 있습니다. 만약 $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)$에서 위 식을 빼면 ('that by subtracting this expression from $C(G)=V(D^{*}_{G}, G)$, we obtain')\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] \\\\[4pt]\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] \\\\[3pt]\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] \\\\[4pt]\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] \\\\[4pt]\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} \\\\[4pt]\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$를 가진다는 것이 증명되었습니다. 여기서 중요한 부분은 $C(G)$가 $G$에 대해 볼록함수라는 사실 보다는 그 볼록함수가 유일한 전역 최적점(unique global optima)을 가진다는 것입니다.\n",
"\n",
"
\n",
"\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
">Proposition2. * If G and D have enough capacity,and at each step of Algorithm 1,the discriminator is allowed to reach its optimum given G, and $p_g$ is updated so as to improve the criterion*\n",
"
\n",
"$$\n",
"\\mathbb{E}_{\\boldsymbol{x} \\sim p_{data}} \\left[ \\log D^{*}_{G}(\\boldsymbol{x}) \\right] +\n",
"\\mathbb{E}_{\\boldsymbol{x} \\sim p_{g}} \\left[ \\log (1-D^{*}_{G}(\\boldsymbol{x})) \\right]\n",
"$$\n",
"
\n",
"then $p_g$ converges to $p_{data}$\n",
"\n",
"\n",
"이제 이 논문에서 이해하기 가장 난해한 부분인 Proposition 2입니다. 내용은 앞서 소개한 알고리즘 $p_g$를 잘 변경시켜서 $p_{data}$에 수렴시킬 것인가? 하는 것입니다. $p_g$를 잘 변경시켜서 $p_{data}$에 수렴시킨다는 말은 Thm 1에서 증명한 바와 같이 $C(G)$함수는 유니크 글로벌 옵티마를 가지는데 그것을 Algorithm 1이 찾을 수 있을 것인가? 하는 말과 동치 입니다. 그리고 그 전제 조건은 \"$G$가 주어졌을 때 최적의 $D$에 도달할 수 있다면\" 입니다.
\n",
"최대한 쉽게 그림과 함께 알아보도록 하겠습니다. 일단 $U(p_{g}, D) = V(G,D)$인 함수 $U$를 생각하도록 하겠습니다. $U$는 $p_g$와 $D$를 변수로 가지는 함수가 됩니다.\n",
"
\n",
"$$\n",
"U(p_{g}, D) = \\int_{\\boldsymbol{x}} p_{data}(\\boldsymbol{x}) \\log (D(\\boldsymbol{x}))+p_{g}(\\boldsymbol{x}) \\log \\left( 1-D(\\boldsymbol{x}) \\right) d\\boldsymbol{x}\n",
"$$\n",
"
\n",
"$U(p_{g}, D)$는 위와 같은데 이는 $p_g$에 대해서 볼록함수입니다. 이는 Integrand를 $p_g$에 대한 함수로 보고 함수의 볼록성 정의를 그대로 이용하여 보여줄 수 있습니다. 또는 간단하게 그냥 $p_g$에 대해 선형이기 때문이라고 생각하여도 됩니다. 상황을 그림으로 대충 그려보기 위해 $U$가 모양이 $p_g$방향으로는 아래로 볼록한 볼록함수이고 $D$방향으로는 임의의 모양을 가지는 움푹한 배수로같은 모양의 함수라 생각해보겠습니다. 엄밀하게는 $D$와 $p_g$가 함수공간이므로 이를 실변수로 취급해서 $U(p_{g}, D)$를 2변수 스칼라함수로 취급 할 수 는 없지만 그림으로 개념을 알아보기 위해 실변수처럼 가정하도록하겠습니다. \n",
"
\n",
"
\n",
"
\n",
"앞서 가정한 모양의 $U(p_{g}, D)$가 있다고 했을 때 임의의 구간 $\\mathcal{A}$에 대해서 3개의 $D$를 정해서 그 $D$를 고정시킨 체 $p_g$에 대한 함수를 그려보면 위 그림과 같이 각각 밥그릇 모양의 함수가 나올 것입니다. 물론 구간 $\\mathcal{A}$ 무수히 많은 이런 밥그릇 모양의 함수가 있지만 설명의 편의를 위해 3개만 예를 들도록 하겠습니다. 이 함수들을 $p_g$축 방향에서 보면 아래 왼쪽 그림과 같습니다. \n",
"
\n",
"
\n",
"
\n",
"
\n",
"\n",
">*The subderivatives of a supremum of convex functions include the derivative of the function at the point where the maximum is attained.*\n",
"\n",
"\n",
"위 문장에서 supremum of convex functions이라 함은 위 왼쪽 그림에서 3개의 함수는 모두 convex function인데 그것들의 수프리멈
[15]이니까 위 그림에서 오른쪽 그림입니다. 오른쪽 그림은 모든 $p_g$에 대해서 3개 함수중에 max값을 취한 함수입니다. 여기서는 수프리멈이라고 일반화 시켜서 이야기 했지만 이 함수가 Thm 1에서 $C(G)$함수가 됩니다. 구간 $\\mathcal{A}$가 개구간일 경우 특정 $p_g$에서 무수히 많은 $U(p_{g}, D)$에 대해 맥시멈이 없을 수 있기 때문에 엄밀하게 Proposition 2에서는 수프리멈을 사용합니다. 이렇게 $D$에 대해 수프리멈을 찾았으면 이 수프리멈에서 $p_g$에 대해 미니멈을 찾으면 우리가 찾고자 하는 최적점을 찾는 것입니다.(그림에서 별표로 표시) 이 수프리멈은 부분 부분 각각 다른 함수들로 조합되는데 이를 pointwise maximum 또는 pointwise supremum이라 합니다. 이 수프리멈은 볼록함수에 대한 수프리멈이므로 역시 볼록함수입니다.
[16] 이는 Thm 1에서 증명한 바이기도 합니다.(볼록함수들의 수프리멈이 볼록함수가 된다는 정리를 증명한것은 아님) 또 이 수프리멈은 함수가 조합되는 지점에서 미분 불가능한 점이 생기는데 이 미분불가능 지점에서 subderivative는 무수히 많이 존재합니다.
[17] (예로 든 그림은 piecewise 처럼 보이는데 실제로는 pointwise로 거의 쪼각쪼각(?)나는 함수임) 위 그림에서 검은색 동그라미 표시한 지점입니다. 이렇게 정리를 하면 위 문장의 의미를 파악할 수 있습니다. 그림 하나를 더 보면서 이야기하도록 하겠습니다.\n",
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"위 그림에서 보면 수프리멈은 구간별로 $ sup_{D} U(p_{g}, D) = U(p_g, D_{k}) $ 이라는 것을 알 수 있습니다. 그림에서 가장 왼쪽 구간은 $U(p_{g}, D_{3}) = sup_{D} U(p_{g}, D)$, 가운데 구간에서는 $U(p_{g}, D_{1}) = sup_{D} U(p_{g}, D)$, 왼쪽 구간에서는 $U(p_{g}, D_{2}) = sup_{D} U(p_{g}, D)$라는 것을 알 수 있습니다. 위에서 말했듯이 함수가 바뀌는 지점이외의 점에서는 유일한 미분값이 존재하고 함수가 바뀌는 지점에서는 무수히 많은 미분값이 subderivative를 이루므로 각 함수 $U(p_{g}, D_{1})$, $U(p_{g}, D_{2})$, $U(p_{g}, D_{3})$의 subderivative를 $sup_{D} U(p_{g}, D)$의 subderivative가 다 포함하게 됩니다. 그래서 어떤 임의의 $p_{g}$에서 맥시멈이 달성된 그 함수의 미분(the derivative of the function at the point where the maximum is attained.)은 $sup_{D} U(p_{g}, D)$의 subderivative(The subderivatives of a supremum of convex functions)가 다 포함하게 됩니다. 그림으로 다시 특정 예를 들어보겠습니다.\n",
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"$\\hat{p}_{g}$에서 맥시멈이 달성된 함수는 $U(p_{g}, D_{3})$입니다. $U(p_{g}, D_{3})$의 미분은 $sup_{D} U(p_{g}, D)$의 subderivative에 다 포함됨은 명백합니다. 이 상황을 논문에서 좀 더 포멀하게 다시 한번 더 이야기합니다.\n",
"
\n",
"\n",
">In other words, if $f(x) = sup_{\\alpha \\in \\mathcal{A}} f_{\\alpha}(x)$ and $f_{\\alpha}(x)$ is convex in $x$ for every $\\alpha$, then $\\partial f_{\\beta}(x) \\in \\partial f$ if $\\beta = argsup_{\\alpha \\in \\mathcal{A}}f_{\\alpha}(x)$.\n",
"\n",
"\n",
"위 문장은 노테이션이 주욱 써오던 것을 쓰지 않고 갑자기 일반적인 노테이션으로 바뀌어서 좀 혼란스러울수도 있는데(논문을 구구절절 친절히 쓰기 엄청 귀찮았나 봄;;;) 계속 써오던 노테이션을 [ ]에 넣고 다시 생각해보면 결국 같은 이야기라는 것을 알 수 있습스다. 다시 생각해보면 \"$x$ [$p_g$]에 대해 볼록함수인 $f_{\\alpha}(x)$ [$U(p_{g},D)$]에 대한 수프리멈을 $f(x)$라 하면 $x$ [$\\hat{p}_g$]에 대해서 수프리멈을 달성하게 하는 아규먼트 $\\beta$ [$D_{3}(x)$]에 대해 $\\partial f_{\\beta}(x)$ [$\\partial U(p_{g}, D_{3})$]은 $\\partial f$에 포함된다\" 라는 것입니다. 여기서 $\\partial$을 집합 subderivative 라는 의미로 사용했습니다.\n",
"\n",
"
\n",
"\n",
">*This is equivalent to computing a gradient descent update for $p_g$ at the optimal $D$ given the corresponding $G$.*\n",
"\n",
"\n",
"수프리멈은 미분 가능한 정도로 정식화 되지 않아 경사하강법 등으로 최솟점을 찾을 수 없는데 수프리멈의 subderivatives가 그 수프리멈을 구성하는 함수의 미분을 포함하기 때문에 수프리멈을 구성하는 각 $U(p_{g}, D^{*})$(여기서 $D^{*}=argsup_{D}U(p_{g}, D)$)에 대해서 경사하강법을 적용하는 것은 수프리멈의 최솟점을 향해 수렴한다는 동일한 결과를 줍니다.\n",
"그리고 다행스럽게도 수프리멈은 Thm 1에서 이미 유니크 전역 최적점(unique global optima)을 가지고 있다고 증명하였으므로(여기서 말하고 있는 수프리멈이 Thm 1에서 $C(G)$) 단계적으로 $U(p_{g}, D^{*})$에 대해서 경사하강법을 적용해서 전역 최적점으로 $p_g$를 수렴 시킬 수 있습니다. \n",
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"위 그림에 그 과정을 나타내었습니다. 우선 임의의 $\\hat{p}_{g}$가 있을 때 1번 과정으로 $D$에 대해 최대화 시키고 그 상태에서 2번 과정으로 $p_g$에 대해 최소화를 시킵니다. 업데이트된 $p_g$에서 3번 과정으로 $D$에 대해 최대화 시키고 다시 4번 과정으로 $p_g$에 대해 최소화를 시켜서 수프리멈의 전역 최솟점을 찾을 수 있습니다. 이는 Algorithm 1에서 제안했던 방식과 정확히 일치하는 방식입니다. 이런 방식으로 $p_{g}=p_{data}$가 되는 최적점으로 수렴한다는것을 보인것 입니다. 다만 위 그림처럼 순차적으로 $D$에 대해 최대화, $p_g$에 대해 최소화를 반복하면 어떤 $U(p_{g}, D_{k_{1}})$, $U(p_{g}, D_{k_{2}})$의 최소점 사이를 왔다 갔다 할 수 있습니다. 실제로 그런 현상이 일어나는 것을 위에 실험 결과로 정리했습니다.\n",
"
\n",
"실제로 Algorithm 1은 $p_{g}$를 업데이트하는것이 아니라 $G$의 $\\boldsymbol{\\theta}_{g}$를 업데이트하게 됩니다. 하지만 위 증명은 $p_g$ 도메인에서 되었으므로 앞서 짚었듯이 $G$와 $p_g$간의 암시적 정의 관계때문에 실제로 $\\boldsymbol{\\theta}_{g}$를 업데이트 해서는 $p_g$가 $p_{data}$로 수렴하지 않을 수 있습니다. 하지만 $G$를 MLP(Multi-Layer Perceptrons)으로 구성하면 잘 되니까 합리적인 수준에서 사용할 수 있다할 수 있습니다.\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 마무리\n",
"
\n",
"\n",
"\n",
"어설프나마 end-to-end 방식으로 GANs를 이해할 수 있는 문서를 만들기 위해 주저리 주저리 적어봤습니다. 비전공자로써 내용을 이해하고 정리하는데 많은 어려움이 있었는데 TF-KR에서 많은 도움을 받아서 글을 작성할 수 있었습니다. 오류가 있다면 메일로 지적 부탁드리겠습니다.\n",
"
\n",
"작성자 조준우(metamath@gmail.com)\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",
"[13] PennState, STAT 414 / 415 Intro Probability Theory, https://onlinecourses.science.psu.edu/stat414/node/157
\n",
"[14] Change of continuous random variable, 조준우, http://nbviewer.jupyter.org/github/metamath1/ml-simple-works/blob/master/GAN/change_of_variable.ipynb
\n",
"[15] Wasserstein GAN 수학 이해하기 I, 임성빈, https://www.slideshare.net/ssuser7e10e4/wasserstein-gan-i
\n",
"[16] Pointwise maximum, Pointwise supremum, https://cs.uwaterloo.ca/~yuying/Courses/CS870_2012/May15_12.pdf
\n",
"[17] Subderivative, https://en.wikipedia.org/wiki/Subderivative
\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"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
}