经典GAN 学习笔记(一)
我们需要GAN做什么?
-
现在我们有一组数据 { x 1 , x 2 , x 3 . . . x N } \{x^{1},x^{2}, x^{3}...x^{N}\} {x1,x2,x3...xN},该数据的distribution 是 P d a t a ( x ) P_{data}(x) Pdata(x),该distribution未知。
-
我们要构造一个distribution: P G ( x ) P_{G}(x) PG(x),使得它和 P d a t a ( x ) P_{data}(x) Pdata(x)越接近越好。 P G ( x ) P_{G}(x) PG(x)可以当作一个函数,它由参数 θ \theta θ来控制,这样子我们就可以写成 P G ( x ∣ θ ) P_{G}(x|\theta) PG(x∣θ)
-
问题来了:那怎么衡量这两个distribution的接近程度呢?
答:我们可以通过这两个distribution之间的divergence 来衡量,即: K L ( P d a t a ( x ) ∣ ∣ P G ( x ) ) KL\left(P_{data}(x)||P_{G}(x)\right) KL(Pdata(x)∣∣PG(x))
-
此时可以将问题转换成如下数学表达式: a r g m i n θ K L ( P d a t a ( x ) ∣ ∣ P G ( x ) ) arg\underset{\theta}{min}KL\left(P_{data}(x)||P_{G}(x)\right) argθminKL(Pdata(x)∣∣PG(x))
-
那么问题又来了:请简单描述一下上述问题的解决过程。
答:虽然对 P d a t a 未 知 , 但 是 我 们 可 以 从 中 抽 样 出 足 够 多 的 数 据 { x 1 , x 2 , x 3 , . . . , x m } P_{data}未知,但是我们可以从中抽样出足够多的数据\{x^{1},x^{2},x^{3},...,x^{m}\} Pdata未知,但是我们可以从中抽样出足够多的数据{x1,x2,x3,...,xm},然后对抽样出来的数据使用 P G ( x i ) P_{G}(x^{i}) PG(xi)计算其likelihood,likelihood越大,说明 P G P_{G} PG对应的distribution和 P d a t a P_{data} Pdata的越接近。
-
此时问题可以转换成如下式子对应的问题:
θ ∗ = a r g m a x θ ∏ i = 1 m P G ( x i ∣ θ ) (1) \begin{aligned}\tag{1}\theta^{*}=arg\underset{\theta}{max}\prod_{i=1}^{m}P_{G}({x^{i}|\theta})\end{aligned} θ∗=argθmaxi=1∏mPG(xi∣θ)(1)
对以上式子做一些处理: θ ∗ = a r g m a x θ ∏ i = 1 m P G ( x i ∣ θ ) = a r g m a x θ l o g ∏ i = 1 m P G ( x i ∣ θ ) = a r g m a x θ ∑ i = 1 m l o g P G ( x i ∣ θ ) ≈ a g r m a x θ E x ∼ p d a t a [ l o g P G ( x i ∣ θ ) ] = a r g m a x θ ∫ x P d a t a ( x ) l o g P G ( x ∣ θ ) d x − ∫ x P d a t a ( x ) l o g P d a t a ( x ) d x = a r g m i n θ ∫ x P d a t a ( x ) l o g P d a t a ( x ) P G ( x ∣ θ ) d x = a r g m i n θ K L ( P d a t a ∣ ∣ P G ) \begin{aligned} \theta^{*}&=arg\underset{\theta}{max}\prod_{i=1}^{m}P_{G}({x^{i}|\theta})\\ &=arg\underset{\theta}{max} \quad log\prod_{i=1}^{m}P_{G}(x^{i}|\theta)\\ &=arg\underset{\theta}{max}\sum_{i=1}^{m}logP_{G}(x^{i}|\theta)\\ & \approx agr\underset{\theta}{max}E_{x\sim p_{data} }\left[logP_{G}(x^{i}|\theta)\right]\\ &= arg \underset{\theta}{max}\int_{x}P_{data}(x)logP_{G}(x|\theta)dx \color{red}{-\int_{x}P_{data}(x)logP_{data}(x)dx}\\ &=arg\underset{\theta}{min}\int_{x}P_{data}(x)log\frac{P_{data}(x)}{P_{G}(x|\theta)}dx\\ &= arg\underset{\theta}{min}KL\left(P_{data}||P_{G}\right) \end{aligned} θ∗=argθmaxi=1∏mPG(xi∣θ)=argθmaxlogi=1∏mPG(xi∣θ)=argθmaxi=1∑mlogPG(xi∣θ)≈agrθmaxEx∼pdata[logPG(xi∣θ)]=argθmax∫xPdata(x)logPG(x∣θ)dx−∫xPdata(x)logPdata(x)dx=argθmin∫xPdata(x)logPG(x∣θ)Pdata(x)dx=argθminKL(Pdata∣∣PG)1.减去的那个部分对式子的最终结果没有影响
-
那么问题来了:以上一番数学操作之后的告诉我们什么?
最后的一个式子说明:我们在maximizing P G ( x i ∣ θ ) P_{G}(x^i|\theta) PG(xi∣θ)的likelihood其实等于我们在减少 P G P_{G} PG和 P d a t a P_{data} Pdata之间的divergence.
我们需要GAN构造一个 P G P_{G} PG
-
那么问题来了:怎么构造?
答:我们可以将 P g ( x ∣ θ ) P_{g}(x|\theta) Pg(x∣θ)看成一个参数为 θ \theta θ的函数,又因为一个network可以构造出任意的函数(如果这个network的深度和neural够深够多的话),所以我们可以考虑通过训练一个network来逼近 P G P_{G} PG,我们称这个network为generator
-
将1中的问题描述转换成数学问题,如下式子:
G ∗ = a r g m i n G D i v ( P G ( x ∣ θ ) , P d a t a ( x ) ) (2) \begin{aligned}\tag{2} G^{*}=arg\underset{G}{min}Div\left(P_{G}(x|\theta), P_{data}(x)\right) \end{aligned} G∗=argGminDiv(PG(x∣θ),Pdata(x))(2) -
现在问题又来了:在式子(2)中,我们并不知道 D i v ( P G , P d a t a ) Div\left(P_{G},P_{data}\right) Div(PG,Pdata)如何计算,怎么办?
答:可以考虑Discriminator.在GAN中D的工作是判断输入的数据是来自 P d a t a P_{data} Pdata还是 P G P_{G} PG,如果是来自前者,则输出一个大的数值,是后者则输出一个较小的值。根据这样的思想,我们去训练Discriminator
-
问题是:如何训练Discriminator?
- 写出Objective function如下:
V ( G , D ) = E x ∼ p d a t a [ l o g D ( x ) ] + E x ∼ p G [ l o g ( 1 − D ( x ) ) ] (3) \begin{aligned}\tag{3} V\left(G,D\right)=E_{x\sim p_{data}} \left[logD(x)\right]+E_{x\sim p_{G}}\left[log(1-D(x))\right] \end{aligned} V(G,D)=Ex∼pdata[logD(x)]+Ex∼pG[log(1−D(x))](3) - 训练Discriminator的问题转换为如下数学式子:
D ∗ = a r g m a x D V ( D , G ) (4) \begin{aligned}\tag{4} D^{*} = arg\underset{D}{max}\;V\left(D,G\right) \end{aligned} D∗=argDmaxV(D,G)(4) - 对由(3)和(4)中的数学式子进行一番操作:
D ∗ = a r g m a x D V ( D , G ) = a r g m a x D E x ∼ p d a t a [ l o g D ( x ) ] + E x ∼ p G [ l o g ( 1 − D ( x ) ) ] = a r g m a x D ∫ x P d a t a ( x ) l o g D ( x ) d x + ∫ x P G ( x ) l o g ( 1 − D ( x ) ) d x = a r g m a x D ∫ x [ P d a t a ( x ) l o g ( D ( x ) ) + P G ( x ) l o g ( 1 − D ( x ) ) ] d x (5) \begin{aligned}\tag{5} D^{*}&=arg\underset{D}{max}\; V(D,G) \\ &= arg\underset{D}{max}E_{x\sim p_{data}} \left[logD(x)\right]+E_{x\sim p_{G}}\left[log(1-D(x))\right] \\ &=arg \underset{D}{max}\int_{x}P_{data}(x)logD(x)dx + \int_{x}P_{G}(x)log(1-D(x))dx \\ &=arg \underset{D}{max} \int_{x}\left[P_{data}(x)log(D(x))+P_{G}(x)log(1-D(x))\right]dx\\ \end{aligned} D∗=argDmaxV(D,G)=argDmaxEx∼pdata[logD(x)]+Ex∼pG[log(1−D(x))]=argDmax∫xPdata(x)logD(x)dx+∫xPG(x)log(1−D(x))dx=argDmax∫x[Pdata(x)log(D(x))+PG(x)log(1−D(x))]dx(5)
要maximizing (5),则相当于maximizing如下式子:
D ∗ = a r g m a x D P d a t a ( x ) l o g ( D ( x ) ) + P G ( x ) l o g ( 1 − D ( x ) ) (6) \begin{aligned}\tag{6} D^{*}=arg\underset{D}{max}\;P_{data}(x)log(D(x))+P_{G}(x)log(1-D(x)) \end{aligned} D∗=argDmaxPdata(x)log(D(x))+PG(x)log(1−D(x))(6)
已知: P d a t a ( x ) P_{data}(x) Pdata(x)不变,在训练Discriminator的时候固定Generator,所以(6)中的 P d a t a ( x ) P_{data}(x) Pdata(x)和 P G ( x ) P_{G}(x) PG(x)为常数,分别设a和b。为了方便,将D(x)简记为D。
记:
F ( D ) = a ∗ l o g ( D ) + b ∗ l o g ( 1 − D ) (7) \begin{aligned}\tag{7} F(D) = a*log(D)+b*log(1-D) \end{aligned} F(D)=a∗log(D)+b∗log(1−D)(7)
要求F(D)的最大值:对F进行求导,并使之等于零。解之得:
D ∗ ( x ) = a a + b = P d a t a ( x ) P d a t a ( x ) + P G ( x ) (8) \begin{aligned}\tag{8} D^{*}(x) &= \frac{a}{a+b}\\ &= \frac{P_{data}(x)}{P_{data}(x)+P_{G}(x)} \end{aligned} D∗(x)=a+ba=Pdata(x)+PG(x)Pdata(x)(8)
把(8)代入(3)得:
V ( G , D ∗ ) = E x ∼ P d a t a [ l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) ] + E x ∼ P G [ l o g P G ( x ) P d a t a ( x ) + P G ( x ) ] = ∫ x P d a t a ( x ) l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) d x + ∫ x P G ( x ) l o g P G ( x ) P d a t a ( x ) + P G ( x ) d x = − 2 l o g 2 + K L ( P d a t a ∣ ∣ P d a t a + P G 2 ) + K L ( P G ∣ ∣ p d a t a + P G 2 ) (9) \begin{aligned}\tag{9} V(G,D^{*}) &= E_{x\sim P_{data}}\left[log\frac{P_{data}(x)}{P_{data(x)}+P_{G}(x)}\right] +E_{x\sim P_{G}}\left[log\frac{P_{G}(x)}{P_{data}(x)+P_{G}(x)}\right]\\ &= \int_{x}P_{data}(x)log\frac{P_{data}(x)}{P_{data}(x)+P_{G}(x)}dx+\int_{x}P_{G}(x)log\frac{P_{G}(x)}{P_{data}(x)+P_{G}(x)}dx\\ &= -2log2 + KL\left(P_{data}||\frac{P_{data}+P_G}{2}\right) + KL\left(P_{G}||\frac{p_{data}+P_{G}}{2}\right) \end{aligned} V(G,D∗)=Ex∼Pdata[logPdata(x)+PG(x)Pdata(x)]+Ex∼PG[logPdata(x)+PG(x)PG(x)]=∫xPdata(x)logPdata(x)+PG(x)Pdata(x)dx+∫xPG(x)logPdata(x)+PG(x)PG(x)dx=−2log2+KL(Pdata∣∣2Pdata+PG)+KL(PG∣∣2pdata+PG)(9)
到这里:此时我们得出 D ∗ D^{*} D∗,然后再得出对应的 V ( G , D ∗ ) V(G,D^{*}) V(G,D∗)的值,此时V的值最大,而这个最大的V值刚好是 P d a t a P_{data} Pdata和 P G P_{G} PG之间的JSP divergence.这意味,我们终于解决了如何求得 P d a t a P_{data} Pdata和 P G P_{G} PG之间的Divergence这个问题。
所以式子(2)就可以作如下转换:
G ∗ = a r g m i n G D i v ( P G ( x ∣ θ ) , P d a t a ( x ) ) = a r g m i n G m a x D V ( G , D ) (10) \begin{aligned}\tag{10} G^{*}&=arg\underset{G}{min}Div\left(P_{G}(x|\theta), P_{data}(x)\right) \\ &=arg\underset{G}{min}\;\underset{D}{max}V(G,D) \end{aligned} G∗=argGminDiv(PG(x∣θ),Pdata(x))=argGminDmaxV(G,D)(10)
意思是说:我们对Discriminator进行训练,从数学上来说就最大化 Objective function的值,此时最大的值就是两个distribution之间的Divergence. 训练过程中可以使用Gradient Accent来实现。
- 写出Objective function如下:
-
现在,我们可以来考虑训练Generator这件事了。
写出Objective function如下:
V ( G , D ) = E x ∼ p d a t a [ l o g D ( x ) ] + E x ∼ p G [ l o g ( 1 − D ( x ) ) ] = ∫ x P d a t a ( x ) l o g D ( x ) d x + ∫ x P G ( x ) l o g ( 1 − D ∗ ( G ( x ) ) ) (11) \begin{aligned} \tag{11} V\left(G,D\right)&=E_{x\sim p_{data}} \left[logD(x)\right]+E_{x\sim p_{G}}\left[log(1-D(x))\right]\\ &=\int_{x}P_{data}(x)logD(x)dx + \int_{x}P_{G}(x)log(1-D^{*}(G(x))) \end{aligned} V(G,D)=Ex∼pdata[logD(x)]+Ex∼pG[log(1−D(x))]=∫xPdata(x)logD(x)dx+∫xPG(x)log(1−D∗(G(x)))(11)
在(11)式中,第一项表示数据从 P d a t a P_{data} Pdata中取样出来,即:原始数据,对应的期望,这个和Gnerator没有关系(训练Generalator的时候Discriminator固定),所以去掉该项。第二项则表示:现在,我们已经找到了那个最好的Discriminator,它使得V(G,D)的值就是两个distribution的divergence,由Generator生成的数据,作为 D ∗ D^{*} D∗的输入,此时我们希望V(D,G)的值越小越好,即确定 D ∗ D^{*} D∗的情况下,divergence越小越好,故,我们对第二项要做点什么。x ∼ P d a t a x\sim P_{data} x∼Pdata表示数据是从 P d a t a P_{data} Pdata中抽样出来的,同理, x ∼ P G x\sim P_{G} x∼PG表示数据x是从 P G P_{G} PG中抽样出来的,也可以认为对应的Generator生成
-
对于(11)式,直接使用Gradient decent更新 V ( G , D ∗ ) V(G,D^{*}) V(G,D∗)中的参数G即可。如下:
θ g ← θ g − η ∂ L ( G ) ∂ θ g 其 中 : G = V ( G , D ∗ ) , D ∗ 为 常 量 G 可 以 理 解 为 一 个 函 数 , 其 中 θ g 为 它 的 参 数 , 即 : G ( θ g ) (12) \begin{aligned} \theta_{g} \gets\theta_{g}-\eta\frac{\partial L(G)}{\partial \theta_{g}}\tag{12} \end{aligned}\\ 其中:G = V(G,D^{*}),D^{*}为常量 \\ G可以理解为一个函数,其中\theta_{g}为它的参数,即:G(\theta_{g}) θg←θg−η∂θg∂L(G)其中:G=V(G,D∗),D∗为常量G可以理解为一个函数,其中θg为它的参数,即:G(θg)(12) -
在6的过程中,每更新一次G,都会导致 D ∗ D^{*} D∗改变,所以在训练G的时候,只更新一次G的参数。