GAN网络经常会见到或用到,但感觉对其理解不够深入,写此博客记录一下,方便今后查阅。只看笔记估计很难看懂,推荐两个视频:
晟腾CANN训练营
GAN论文精读
#pic_center =x250)
GAN的整个训练对抗过程可以由下式表示出来:
min G max D V ( D , G ) = E x ∼ p data ( x ) [ log D ( x ) ] + E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \min _G \max _D V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))] minGmaxDV(D,G)=Ex∼pdata (x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
其中G(generator)是想让整个式子的值V尽可能小,而D(discriminator)想让V尽可能大。
观察G和D都有的损失项:
J ( G ) = 1 2 E z log ( 1 − D ( G ( z ) ) ) J^{(G)}=\frac{1}{2} \mathbb{E}_{\boldsymbol{z}} \log (1-D(G(\boldsymbol{z}))) J(G)=21Ezlog(1−D(G(z)))
图中Minimax(零和博弈)线是该损失项关于D(G(z))的曲线,在网络训练初期,G所生成的图像很好判断,D会给他很低的置信度,这时梯度是很小的,网络的学习很慢,只有当后期时D较难判断时,更新梯度才会较大。
但我们肯定希望是G生成较差时(训练初期)会有较大梯度进行更新才对。
所以实际使用中,我们选择非饱和启发式博弈(Non-saturating heuristic):
J ( G ) = − 1 2 E z log D ( G ( z ) ) J^{(G)}=-\frac{1}{2} \mathbb{E}_{\boldsymbol{z}} \log D(G(\boldsymbol{z})) J(G)=−21EzlogD(G(z))
观察它的梯度,是更合适的:初期训练时梯度较大,后期较小。
P data ( x ) P_{\text {data }}(\mathrm{x}) Pdata (x) :真实图片分布,
P G ( x , θ ) : G P_G(x, \theta): G PG(x,θ):G 生成的图片分布, θ \theta θ是生成器G的参数,
在真实分布中取一些数据 { x 1 , x 2 , … , x m } \left\{x^1, x^2, \ldots, x^m\right\} {x1,x2,…,xm},
生成模型的最大似然估计: L = ∏ i = 1 m P G ( x i ; θ ) L=\prod_{i=1}^m P_G\left(x^i ; \theta\right) L=∏i=1mPG(xi;θ)
θ ∗ = arg max θ ∏ i = 1 P G ( x i ; θ ) = arg max θ log ∏ i = 1 m P G ( x i ; θ ) = arg max θ ∑ i = 1 m log P G ( x i ; θ ) ≈ arg max θ E z ∼ P data [ log P G ( x ; θ ) ] = arg max θ ∫ z P data ( x ) log P G ( x ; θ ) d x − ∫ x P data ( x ) log P data ( x ) d x = arg max θ ∫ x P data ( x ) ( log P G ( x ; θ ) − log P data ( x ) ) d x = arg min θ ∫ x P data ( x ) log P data ( x ) P G ( x ; θ ) d x = arg min θ K L ( P data ( x ) ∥ P G ( x ; θ ) ) \begin{aligned} \theta^* &=\arg \max _\theta \prod_{i=1} P_G\left(x^i ; \theta\right) \\ &=\arg \max _\theta \log \prod_{i=1}^m P_G\left(x^i ; \theta\right) \\ &=\arg \max _\theta \sum_{i=1}^m \log P_G\left(x^i ; \theta\right) \\ & \approx \arg \max _\theta E_{z \sim P_{\text {data }}}\left[\log P_G(x ; \theta)\right] \\ &=\arg \max _\theta \int_z P_{\text {data }}(x) \log P_G(x ; \theta) d x-\int_x P_{\text {data }}(x) \log P_{\text {data }}(x) d x \\ &=\arg \max _\theta \int_x P_{\text {data }}(x)\left(\log P_G(x ; \theta)-\log P_{\text {data }}(x)\right) d x \\ &=\arg \min _\theta \int_x P_{\text {data }}(x) \log \frac{P_{\text {data }}(x)}{P_G(x ; \theta)} d x \\ &=\arg \min _\theta K L\left(P_{\text {data }}(x) \| P_G(x ; \theta)\right) \end{aligned} θ∗=argθmaxi=1∏PG(xi;θ)=argθmaxlogi=1∏mPG(xi;θ)=argθmaxi=1∑mlogPG(xi;θ)≈argθmaxEz∼Pdata [logPG(x;θ)]=argθmax∫zPdata (x)logPG(x;θ)dx−∫xPdata (x)logPdata (x)dx=argθmax∫xPdata (x)(logPG(x;θ)−logPdata (x))dx=argθmin∫xPdata (x)logPG(x;θ)Pdata (x)dx=argθminKL(Pdata (x)∥PG(x;θ))
最后可推得:求 θ ∗ \theta^* θ∗就是求使得 P data ( x ) P_{\text {data }}(x) Pdata (x) 与 P G ( x ; θ ) P_G(x ; \theta) PG(x;θ)的KL散度最小(两者相等时)时 θ \theta θ的取值。
基于GAN的对抗过程:
min G max D V ( D , G ) = E x ∼ p data ( x ) [ log D ( x ) ] + E x ∼ p x ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \min _G \max _D V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data}}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{x} \sim p_{\boldsymbol{x}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))] minGmaxDV(D,G)=Ex∼pdata(x)[logD(x)]+Ex∼px(z)[log(1−D(G(z)))]
那么固定G,且由上图的定律,那么V就可以由下式的结果表达
V = E x ∼ P data [ log D ( x ) ] + E x ∼ P G [ log ( 1 − D ( x ) ) ] = ∫ x P data ( x ) log D ( x ) d x + ∫ x P G ( x ) log ( 1 − D ( x ) ) d x = ∫ x [ P data ( x ) log D ( x ) + P G ( x ) log ( 1 − D ( x ) ) ] d x \begin{aligned} V&=E_{x \sim P_{\text {data }}}[\log D(x)]+E_{x \sim P_G}[\log (1-D(x))]\\ &=\int_x P_{\text {data }}(x) \log D(x) d x+\int_x P_G(x) \log (1-D(x)) d x\\ &=\int_x\left[P_{\text {data }}(x) \log D(x)+P_G(x) \log (1-D(x))\right] d x\\ \end{aligned} V=Ex∼Pdata [logD(x)]+Ex∼PG[log(1−D(x))]=∫xPdata (x)logD(x)dx+∫xPG(x)log(1−D(x))dx=∫x[Pdata (x)logD(x)+PG(x)log(1−D(x))]dx
接下来解 D ∗ ( x ) D^*(x) D∗(x):
将解得的 D ∗ ( x ) D^*(x) D∗(x)带入原式中,得到下式:
最后V推导成了Jensen-Shannon散度与一个常数的和。
其中Jensen-Shannon散度如下式定义,是一个对称量。
所以可以这么说:
在优化判别器D时,其实是在学习如何度量JS散度(度量得更准)。
在优化生成器G时,其实是在最小化JS散度。
有些理论目前看不懂,先记下来吧
上面这个结论大概的意思就是JS散度容易为0,有点类似于坏死不起作用的情况。
前面有提到具体使用时一般使用非饱和启发式博弈替代零和博弈:
最小化KL散度和最大化JS散度是相反的两个任务。所以不好训练。
回顾全程:
我们由对抗博弈的过程推导出其实GAN网络的优化过程和KL和JS散度有关,由于这最小化两个散度有各种问题,也就解释了GAN不好训练。
JS散度问题很多,作者尝试换个指标去衡量:
上图 CD和AB两个分布,其KL,JS散度以及Wasserstein距离如下:
K L ⟨ P 1 ∥ P 2 ) = K L ( P 1 ∥ P 2 ) = { + ∞ if θ ≠ 0 0 if θ = 0 J S ( P 1 ∥ P 2 ) = { log 2 if θ ≠ 0 0 if θ − 0 W ( P 0 , P 1 ) = ∣ ϕ ˙ ∣ (क्ष) \begin{aligned} &K L\left\langle P_1 \| P_2\right)=K L\left(P_1 \| P_2\right)= \begin{cases}+\infty & \text { if } \theta \neq 0 \\ 0 & \text { if } \theta=0\end{cases} \\ &J S\left(P_1 \| P_2\right)= \begin{cases}\log 2 & \text { if } \theta \neq 0 \\ 0 & \text { if } \theta-0\end{cases} \\ &W\left(P_0, P_1\right)=|\dot{\phi}| \text { (क्ष) } \end{aligned} KL⟨P1∥P2)=KL(P1∥P2)={+∞0 if θ=0 if θ=0JS(P1∥P2)={log20 if θ=0 if θ−0W(P0,P1)=∣ϕ˙∣ (क्ष)
此时JS散度可以说是坏死的,但W距离仍能工作。
所以对GAN做了如下修改:
GAN不好训练的问题得到了很好的解决。