视频地址:
①B站:https://www.bilibili.com/video/BV15W411i7uP?p=2
②油管:https://www.youtube.com/watch?v=KSN4QYgAtao
之前的博客地址:
①生成对抗网络-基本概念|深度学习(李宏毅)(二十二)
②生成对抗网络-理论部分|深度学习(李宏毅)(二十三)
一、GAN的通用框架
- f-divergence
之前说GAN的Discriminator的设计与JS散度有关,事实上可以设计Discriminator和任何f-divergence有关。f-divergence的定义如下:
D f ( P ∣ ∣ Q ) = ∫ x q ( x ) f ( p ( x ) q ( x ) ) d x s . t . f 是 凸 函 数 且 f ( 1 ) = 0 D_{f}(P||Q)=\int _{x}q(x)f\left (\frac{p(x)}{q(x)} \right )\mathrm{d}x\\ s.t.\; \; f是凸函数且f(1)=0 Df(P∣∣Q)=∫xq(x)f(q(x)p(x))dxs.t.f是凸函数且f(1)=0
f-divergence衡量分布 P P P和 Q Q Q之间的差异程度,满足在 P P P和 Q Q Q完全一致的情况下取得最小值为 0 0 0,在有所差异的情况下值为一个正数,这一点可以通过凸函数的性质得到:
P P P和 Q Q Q完全一致时:
D f ( P ∣ ∣ Q ) = ∫ x q ( x ) f ( p ( x ) q ( x ) ) d x = ∫ x q ( x ) f ( 1 ) d x = 0 D_{f}(P||Q)=\int _{x}q(x)f\left (\frac{p(x)}{q(x)} \right )\mathrm{d}x=\int _{x}q(x)f\left (1 \right )\mathrm{d}x=0 Df(P∣∣Q)=∫xq(x)f(q(x)p(x))dx=∫xq(x)f(1)dx=0
P P P和 Q Q Q有差异时:
D f ( P ∣ ∣ Q ) = ∫ x q ( x ) f ( p ( x ) q ( x ) ) d x ≥ f ( ∫ x q ( x ) p ( x ) q ( x ) d x ) = f ( 1 ) = 0 D_{f}(P||Q)=\int _{x}q(x)f\left (\frac{p(x)}{q(x)} \right )\mathrm{d}x\\ \geq f\left (\int _{x}q(x)\frac{p(x)}{q(x)}\mathrm{d}x \right )\\ =f(1)=0 Df(P∣∣Q)=∫xq(x)f(q(x)p(x))dx≥f(∫xq(x)q(x)p(x)dx)=f(1)=0
事实上KL散度就是f-divergence的一个特例:
- f ( x ) = x l o g x f(x)=xlogx f(x)=xlogx
D f ( P ∣ ∣ Q ) = ∫ x q ( x ) p ( x ) q ( x ) l o g ( p ( x ) q ( x ) ) d x = ∫ x p ( x ) l o g ( p ( x ) q ( x ) ) d x ⏟ K L D_{f}(P||Q)=\int _{x}q(x)\frac{p(x)}{q(x)}log\left (\frac{p(x)}{q(x)} \right )\mathrm{d}x=\underset{KL}{\underbrace{\int _{x}p(x)log\left (\frac{p(x)}{q(x)} \right )\mathrm{d}x}} Df(P∣∣Q)=∫xq(x)q(x)p(x)log(q(x)p(x))dx=KL ∫xp(x)log(q(x)p(x))dx
- f ( x ) = − l o g x f(x)=-logx f(x)=−logx
D f ( P ∣ ∣ Q ) = ∫ x q ( x ) ( − l o g ( p ( x ) q ( x ) ) ) d x = ∫ x q ( x ) l o g ( q ( x ) p ( x ) ) d x ⏟ R e v e r s e K L D_{f}(P||Q)=\int _{x}q(x)\left (-log\left (\frac{p(x)}{q(x)} \right ) \right )\mathrm{d}x=\underset{Reverse\; KL}{\underbrace{\int _{x}q(x)log\left (\frac{q(x)}{p(x)} \right )\mathrm{d}x}} Df(P∣∣Q)=∫xq(x)(−log(q(x)p(x)))dx=ReverseKL ∫xq(x)log(p(x)q(x))dx
- f ( x ) = ( x − 1 ) 2 f(x)=(x-1)^2 f(x)=(x−1)2
D f ( P ∣ ∣ Q ) = ∫ x q ( x ) ( p ( x ) q ( x ) − 1 ) 2 d x = ∫ x ( p ( x ) − q ( x ) ) 2 q ( x ) d x ⏟ C h i S q u a r e D_{f}(P||Q)=\int _{x}q(x)\left (\frac{p(x)}{q(x)}-1 \right )^{2}\mathrm{d}x=\underset{Chi\; Square}{\underbrace{\int _{x}\frac{\left (p(x)-q(x) \right )^{2}}{q(x)}\mathrm{d}x}} Df(P∣∣Q)=∫xq(x)(q(x)p(x)−1)2dx=ChiSquare ∫xq(x)(p(x)−q(x))2dx
- Fenchel Conjugate
每一个凸函数都有一个共轭函数(Conjugate Function),记作 f ∗ f^* f∗,公式为:
f ∗ ( t ) = m a x x ∈ d o m ( f ) { x t − f ( x ) } f^{*}(t)=\underset{x\in dom(f)}{max}\left \{xt-f(x)\right \} f∗(t)=x∈dom(f)max{xt−f(x)}
这个函数也就是说要找出给定 t t t的情况下变动 x x x能达到的最大值,限制 x x x必须要在 f f f的定义域内,以下图为例,给定不同的 t t t,代入所有的 x x x能得到的最大值就是 f ∗ ( t ) f^*(t) f∗(t):
按照上面的方式能够理解前面的公式。那么 f ∗ ( t ) f^{*}(t) f∗(t)的图像是什么样子的呢?我们可以按照以下方式来考虑,在给定 x x x,使 t t t变动,那么就能得到一条以 x x x为斜率的直线,对于不同的 x x x就对应着不同的直线:
而此时,要求 f ∗ ( t ) f^*(t) f∗(t),就只需要从 t t t的位置坐垂线,这样与垂线相交最上面的直线对应的 x x x就是能使得 f ∗ ( t ) f^*(t) f∗(t)取得最大值的 x x x:
那么在整个 t t t的定义域上,将位于最上面的直线的片段连接起来就是 f ∗ ( t ) f^*(t) f∗(t)的图像了,当然这只是便于理解的一种形象化的思路:
按照上面的思路,可以很直观地看出 f ∗ ( t ) f^*(t) f∗(t)也是凸函数。
另外,我们按照上面的方式把有关 f ( x ) = x l o g x f(x)=xlogx f(x)=xlogx的共轭函数的每条直线都画出来:
得到的共轭函数的图像像是一个指数函数,其实 f ( x ) = x l o g x f(x)=xlogx f(x)=xlogx的共轭函数就是 e x p ( t − 1 ) exp(t-1) exp(t−1),求解共轭函数可以直接用数学的方法计算出来,对于 f ( x ) = x l o g x f(x)=xlogx f(x)=xlogx来说,先把 f ( x ) f(x) f(x)代入前面共轭函数的表达式:
f ∗ ( t ) = m a x x ∈ d o m ( f ) { x t − x l o g x } f^{*}(t)=\underset{x\in dom(f)}{max}\left \{xt-xlogx\right \} f∗(t)=x∈dom(f)max{xt−xlogx}
对于括号里面的式子 g ( x ) = x t − x l o g x g(x)=xt-xlogx g(x)=xt−xlogx,给定 t t t,需要求解 x x x来使最大化 g ( x ) g(x) g(x),可以直接对 x x x求导,也就有 t − l o g x − 1 = 0 t-logx-1=0 t−logx−1=0,然后解得 x = e x p ( t − 1 ) x=exp(t-1) x=exp(t−1),也就是说,对于给定的 t t t,能使得 g ( x ) g(x) g(x)最大的 x x x就是 e x p ( t − 1 ) exp(t-1) exp(t−1),将 x x x代入原来的式子就可以求得共轭函数了:
f ∗ ( t ) = e x p ( t − 1 ) t − e x p ( t − 1 ) l o g ( e x p ( t − 1 ) ) = e x p ( t − 1 ) f^{*}(t)=exp(t-1)t-exp(t-1)log\left (exp(t-1) \right )=exp(t-1) f∗(t)=exp(t−1)t−exp(t−1)log(exp(t−1))=exp(t−1)
f ∗ ( x ) f^*(x) f∗(x)是 f ( x ) f(x) f(x)的共轭函数, f ( x ) f(x) f(x)也是 f ∗ ( x ) f^*(x) f∗(x)的共轭函数,也就是说:
( f ∗ ) ∗ = f (f^*)^*=f (f∗)∗=f
- 上述内容与GAN的联系
f ∗ ( x ) f^*(x) f∗(x)是 f ( x ) f(x) f(x)互为共轭函数:
f ∗ ( t ) = m a x x ∈ d o m ( f ) { x t − f ( x ) } ↔ f ∗ ( x ) = m a x t ∈ d o m ( f ∗ ) { x t − f ∗ ( t ) } f^{*}(t)=\underset{x\in dom(f)}{max}\left \{xt-f(x)\right \}\leftrightarrow f^{*}(x)=\underset{t\in dom(f^{*})}{max}\left \{xt-f^{*}(t)\right \} f∗(t)=x∈dom(f)max{xt−f(x)}↔f∗(x)=t∈dom(f∗)max{xt−f∗(t)}
那么对于f-divergence中的凸函数 f ( x ) f(x) f(x),就可以用 f ∗ ( t ) f^{*}(t) f∗(t)来替换它:
D f ( P ∣ ∣ Q ) = ∫ x q ( x ) f ( p ( x ) q ( x ) ) d x = ∫ x q ( x ) ( m a x t ∈ d o m ( f ∗ ) { p ( x ) q ( x ) t − f ∗ ( t ) } ) d x D_{f}(P||Q)=\int _{x}q(x)f\left (\frac{p(x)}{q(x)} \right )\mathrm{d}x\\ =\int _{x}q(x)\left (\underset{t\in dom(f^{*})}{max}\left \{\frac{p(x)}{q(x)}t-f^{*}(t)\right \} \right )\mathrm{d}x Df(P∣∣Q)=∫xq(x)f(q(x)p(x))dx=∫xq(x)(t∈dom(f∗)max{q(x)p(x)t−f∗(t)})dx
现在对于任意的一个 D ( x ) D(x) D(x),它的输入是 x x x,输出是 t t t,将 D ( x ) D(x) D(x)代入上面的式子中,一定有以下关系:
D f ( P ∣ ∣ Q ) ≥ ∫ x q ( x ) ( p ( x ) q ( x ) D ( x ) − f ∗ ( D ( x ) ) ) d x = ∫ x p ( x ) D ( x ) d x − ∫ x q ( x ) f ∗ ( D ( x ) ) d x D_{f}(P||Q)\geq \int _{x}q(x)\left (\frac{p(x)}{q(x)}D(x)-f^{*}(D(x))\right) \mathrm{d}x\\ =\int _{x}p(x)D(x)\mathrm{d}x-\int _{x}q(x)f^{*}(D(x))\mathrm{d}x Df(P∣∣Q)≥∫xq(x)(q(x)p(x)D(x)−f∗(D(x)))dx=∫xp(x)D(x)dx−∫xq(x)f∗(D(x))dx
上面的不等式是恒成立的,我们也就得到了 D f ( P ∣ ∣ Q ) D_{f}(P||Q) Df(P∣∣Q)的下界,来调整函数 D ( x ) D(x) D(x)使得这个下界取得最大值就可以用这个最大值来近似 D f ( P ∣ ∣ Q ) D_{f}(P||Q) Df(P∣∣Q):
D f ( P ∣ ∣ Q ) ≈ m a x D { ∫ x p ( x ) D ( x ) d x − ∫ x q ( x ) f ∗ ( D ( x ) ) d x } = m a x D { E x ∼ P [ D ( x ) ] − E x ∼ Q [ f ∗ ( D ( x ) ) ] } D_{f}(P||Q)\approx \underset{D}{max}\left \{\int _{x}p(x)D(x)\mathrm{d}x-\int _{x}q(x)f^{*}(D(x))\mathrm{d}x\right \}\\ =\underset{D}{max}\left \{E_{x\sim P}[D(x)]-E_{x\sim Q}[f^{*}(D(x))]\right \} Df(P∣∣Q)≈Dmax{∫xp(x)D(x)dx−∫xq(x)f∗(D(x))dx}=Dmax{Ex∼P[D(x)]−Ex∼Q[f∗(D(x))]}
如此我们就得到了 D f ( P ∣ ∣ Q ) D_{f}(P||Q) Df(P∣∣Q)的关于 P P P和 Q Q Q的期望的形式,也就是说我们现在可以通过从 P P P和 Q Q Q中采样来完成 D ( x ) D(x) D(x)的求解。在GAN中分布 P P P也就是 P d a t a P_{data} Pdata,分布 Q Q Q也就是 P G P_{G} PG,因此也就有:
D f ( P d a t a ∣ ∣ P G ) = m a x D { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ f ∗ ( D ( x ) ) ] } D_{f}(P_{data}||P_{G})=\underset{D}{max}\left \{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[f^{*}(D(x))]\right \} Df(Pdata∣∣PG)=Dmax{Ex∼Pdata[D(x)]−Ex∼PG[f∗(D(x))]}
能使得 P d a t a P_{data} Pdata和 P G P_{G} PG的 D f ( P d a t a ∣ ∣ P G ) D_{f}(P_{data}||P_{G}) Df(Pdata∣∣PG)最小的 G G G也就是最优化的Generator,我们按照以下公式求解Generator:
G ∗ = a r g m i n G D f ( P d a t a ∣ ∣ P G ) = a r g m i n G m a x D { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ f ∗ ( D ( x ) ) ] } = a r g m i n G m a x D V ( G , D ) G^{*}=\underset{G}{argmin}\; D_{f}(P_{data}||P_{G})\\ =\underset{G}{argmin}\; \underset{D}{max}\left \{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[f^{*}(D(x))]\right \}\\ =\underset{G}{argmin}\; \underset{D}{max}\; V(G,D) G∗=GargminDf(Pdata∣∣PG)=GargminDmax{Ex∼Pdata[D(x)]−Ex∼PG[f∗(D(x))]}=GargminDmaxV(G,D)
这样也就回到了我们之前讲过的GAN的目标函数 V ( G , D ) V(G,D) V(G,D),我们之前说过GAN不一定要极小化JS散度,也可以定义不同的 V ( G , D ) V(G,D) V(G,D)来极小化其他散度,而上面的式子的价值就在于提供了一种定义 V ( G , D ) V(G,D) V(G,D)的方法,即事实上GAN可以用任何f-divergence来作为衡量 P d a t a P_{data} Pdata和 P G P_{G} PG的差异的度量,求得这种f-divergence的函数的共轭函数 f ∗ ( t ) f^{*}(t) f∗(t)就可以得到目标函数 V ( G , D ) V(G,D) V(G,D)。
在模型能力较差时使用不同的散度可能会有不同的效果,下面展示了使用KL散度和JS散度来拟合数据的效果:
图中显示KL散度更倾向于产生多样化的数据,JS散度的分布则比较狭窄,GAN有时会产生比较狭窄的数据,也就是mode collapse,根据上图可以尝试使用KL散度(但事实上也没什么效果)。
参考链接:https://arxiv.org/abs/1606.00709
- Single-step Algorithm
在原来讲过的GAN的训练算法中,我们的做法是在每次迭代中先更新Discriminator的参数多次,然后更新Generator的参数一次,这相当于在一个外循环中嵌套了一个内循环。在f-GAN提出了Single-step的训练算法,也就是在每次迭代中Discriminator和Generator的参数只更新一次,并且是在一次反向传播中更新:
θ D t + 1 ← θ D t + η ∇ θ D V ( θ G t , θ D t ) θ G t + 1 ← θ G t − η ∇ θ G V ( θ G t , θ D t ) \theta _{D}^{t+1}\leftarrow \theta _{D}^{t}+\eta \nabla_{\theta _{D}}V(\theta _{G}^{t},\theta _{D}^{t})\\ \theta _{G}^{t+1}\leftarrow \theta _{G}^{t}-\eta \nabla_{\theta _{G}}V(\theta _{G}^{t},\theta _{D}^{t}) θDt+1←θDt+η∇θDV(θGt,θDt)θGt+1←θGt−η∇θGV(θGt,θDt)
二、Wasserstein GAN
- Wasserstein Distance
Wasserstein GAN是一个GAN的变种,在WGAN中度量分布差异程度的标准不再是各种散度,而是wasserstein distance,也叫earth mover’s distance。把两个分布比作两堆土,将其中一堆铲成另一堆土所需移动的土的最小平均距离就是wasserstein distance。举例来说,在下图中的一维空间中,两个分布都集中在一个点上,距离为 d d d,将 P P P移动到 Q Q Q上的wasserstein distance就是 W ( P , Q ) = d W(P,Q)=d W(P,Q)=d:
更具体的,如下图,对于两个分布 P P P和 Q Q Q,现在要将 P P P移动到 Q Q Q,存在多种方案,不同的方案就会有不同的距离:
不过总是会存在最优的方案,这个最优方案对应的平均移动距离就是wasserstein distance:
可以将每一种移动的方案(每一种方案记作 γ \gamma γ)表示成一个矩阵的形式,这个矩阵上每一个元素代表从 P P P的位置移动到 Q Q Q的位置的土的量,这里有两个约束就是矩阵中每一行的和等于对应的 P P P位置的概率 x p x_p xp,每一列的和等于对应的 Q Q Q位置的概率 x q x_q xq:
以 γ ( x p , x q ) \gamma(x_p,x_q) γ(xp,xq)表示从 x p x_p xp的位置移动到 x q x_q xq的位置的土的量,那么一个方案 γ \gamma γ对应的平均移动距离就是:
B ( γ ) = ∑ x p , x q γ ( x p , x q ) ∥ x p − x q ∥ B(\gamma )=\sum _{x_{p},x_{q}}\gamma(x_p,x_q)\left \|x_{p}-x_{q} \right \| B(γ)=xp,xq∑γ(xp,xq)∥xp−xq∥
假设移动方案的取值空间是 Π \Pi Π,那么wasserstein distance就是穷举所有的方案,其中最小距离的方案对应的距离:
W ( P , Q ) = m i n γ ∈ Π B ( γ ) W(P,Q)=\underset{\gamma\in \Pi }{min}\; B(\gamma ) W(P,Q)=γ∈ΠminB(γ)
仍然使用演化的例子,可以说明wasserstein distance为什么比JS散度更加优越,在下面的例子中, P G P_G PG期待一步步训练最终能够与 P d a t a P_{data} Pdata重合,使用JS散度对于中间状态来说其值就全部是 l o g 2 log2 log2,这样就缺乏促使像好的方向演化的“动力”,而使用wasserstein distance对于中间状态来说就能得到不一样的值:
- 目标函数
在原来的GAN中,可以使用下列式子来定义 P G P_G PG和 P d a t a P_{data} Pdata之间的f-divergence:
D f ( P d a t a ∣ ∣ P G ) = m a x D { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ f ∗ ( D ( x ) ) ] } D_{f}(P_{data}||P_{G})=\underset{D}{max}\left \{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[f^{*}(D(x))]\right \} Df(Pdata∣∣PG)=Dmax{Ex∼Pdata[D(x)]−Ex∼PG[f∗(D(x))]}
在WGAN中也有类似的式子来定义 P G P_G PG和 P d a t a P_{data} Pdata之间的wasserstein distance:
W ( P d a t a , P G ) = m a x D ∈ 1 − L i p s c h i t z { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] } W(P_{data},P_{G})=\underset{D\in 1-Lipschitz}{max}\left \{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[D(x)]\right \} W(Pdata,PG)=D∈1−Lipschitzmax{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}
这个式子中 D ( x ) D(x) D(x)不是任意的,而是一个1-Lipschitz函数,Lipschitz函数的定义如下:
∥ f ( x 1 ) − f ( x 2 ) ∥ ≤ K ∥ x 1 − x 2 ∥ \left \|f(x_{1})-f(x_{2})\right \|\leq K\left \|x_{1}-x_{2}\right \| ∥f(x1)−f(x2)∥≤K∥x1−x2∥
上面的式子中表明 f ( x ) f(x) f(x)的变化小于 K K K倍的 x x x的变化,这样的限制说明Lipschitz函数是一种变化不剧烈的函数,在 K = 1 K=1 K=1时 f ( x ) f(x) f(x)就是1-Lipschitz函数。比如下面图中的两个函数,绿色的就是1-Lipschitz函数,而蓝色的不是:
现在说明一下为什么要有这个限制呢。还是以一维的分布为例,在下图中的 P G P_G PG和 P d a t a P_{data} Pdata之间的距离为 d d d。如果没有1-Lipschitz函数的限制,为了让 W ( P d a t a , P G ) W(P_{data},P_{G}) W(Pdata,PG)公式中大括号内的式子最大,只需要 D ( x 1 ) = + ∞ , D ( x 2 ) = − ∞ D(x_1)=+\infty ,D(x_2)=-\infty D(x1)=+∞,D(x2)=−∞:
而如果有1-Lipschitz函数的限制的话,那么为了让 W ( P d a t a , P G ) W(P_{data},P_{G}) W(Pdata,PG)公式中大括号内的式子最大,只能取得 D ( x 1 ) = k + d , D ( x 2 ) = k D(x_1)=k+d ,D(x_2)=k D(x1)=k+d,D(x2)=k:
另外一个角度解释wasserstein distance的优势就是,如下图,原来的GAN中 D ( x ) D(x) D(x)会有一个sigmoid函数,可能最终得到的 D ( x ) D(x) D(x)的图像就像下图蓝色的线,有一个明显的问题就是有概率存在的地方是没有梯度的,也就是梯度消失问题,这样就没办法让 P G P_{G} PG有“动力”移动到 P d a t a P_{data} Pdata,而对于加了1-Lipschitz限制的wasserstein distance,则可能会得到绿色的线,这样就会有一个梯度来促使 P G P_{G} PG有“动力”移动到 P d a t a P_{data} Pdata:
- 算法
我们想要求解一个1-Lipschitz函数 D ( x ) D(x) D(x),来让 W ( P d a t a , P G ) W(P_{data},P_{G}) W(Pdata,PG)公式中大括号内的式子最大,但是如果直接微分来做的话就不满足1-Lipschitz函数的限制,在实际中的做法是使用weight clipping的做法,也就是强制Discriminator的参数 w w w在 c c c和 − c -c −c之间:
After parameter update, if w > c w>c w>c,then w = c w=c w=c; if w < − c w<-c w<−c, then w = − c w=-c w=−c.
Weight clipping的做法并不能保证满足 D ( x ) D(x) D(x)是1-Lipschitz函数的限制,但是可以保证 D ( x ) D(x) D(x)是K-Lipschitz,不过并没有关系,因为按照这样的方法求解出来的最大值是与wasserstein distance成正比的:
K W ( P d a t a , P G ) = m a x D ∈ K − L i p s c h i t z { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] } {\color{Red}K}W(P_{data},P_{G})=\underset{D\in {\color{Red}K}-Lipschitz}{max}\left \{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[D(x)]\right \} KW(Pdata,PG)=D∈K−Lipschitzmax{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}
如果不做weight clipping的话还是会使得 D ( x ) D(x) D(x)没有限制,会产生下图中的后果,而如果做了weight clipping就会使 D ( x ) D(x) D(x)有一定限制,从而可以使 D ( x ) D(x) D(x)有一定的梯度来促使 P G P_{G} PG有“动力”移动到 P d a t a P_{data} Pdata:
不过要注意的是,使用weight clipping以后只能保证 D ( x ) D(x) D(x)满足K-Lipschitz的限制,而不能保证所有满足K-Lipschitz的限制的 D ( x ) D(x) D(x)对应参数 w w w都在 c c c和 − c -c −c之间,也就是说不满足在 c c c和 − c -c −c之间的某些参数 w w w也是有可能满足K-Lipschitz的。有关weight clipping的方法就不再深究,因为后面会介绍更加合适的训练方法。
WGAN训练的算法与原来的GAN的训练有很多相似之处,只需要做一点改动即可:
Initialize:
初始化 D D D的参数 θ d \theta _{d} θd和 G G G的参数 θ g \theta _{g} θg。
Step1 学习 D D D:
①从数据库中随机抽样 m m m个样本 { x 1 , x 2 , ⋯ , x m } \left \{x^{1},x^{2},\cdots ,x^{m}\right \} {x1,x2,⋯,xm};
②从一个分布(比如高斯分布或者均匀分布)中采样 m m m个噪声样本(noise sample) { z 1 , z 2 , ⋯ , z m } \left \{z^{1},z^{2},\cdots ,z^{m}\right \} {z1,z2,⋯,zm};
③获得 G G G生成的数据 { x ~ 1 , x ~ 2 , ⋯ , x ~ m } \left \{\tilde{x}^{1},\tilde{x}^{2},\cdots ,\tilde{x}^{m}\right \} {x~1,x~2,⋯,x~m},其中 x ~ i = G ( z i ) \tilde{x}^{i}=G(z^{i}) x~i=G(zi);
④目标函数记作 V ~ \tilde{V} V~,通过最大化(梯度上升) V ~ \tilde{V} V~来更新 θ d \theta _{d} θd,也就是 θ d ← θ d + η ∇ V ~ ( θ d ) \theta _{d}\leftarrow \theta _{d}+\eta \nabla \tilde{V}(\theta _{d}) θd←θd+η∇V~(θd),目标函数 V ~ \tilde{V} V~为:
V ~ = 1 m ∑ i = 1 m D ( x i ) − 1 m ∑ i = 1 m D ( x ~ i ) {\color{Red}{\tilde{V}=\frac{1}{m}\sum_{i=1}^{m}D(x^{i})-\frac{1}{m}\sum_{i=1}^{m}D(\tilde{x}^{i})}} V~=m1i=1∑mD(xi)−m1i=1∑mD(x~i)
⑤ w e i g h t c l i p p i n g {\color{Red}{\mathrm{weight\;clipping}}} weightclipping
Step2 学习 G G G:
①同样从一个分布(比如高斯分布或者均匀分布)中采样 m m m个噪声样本(noise sample) { z 1 , z 2 , ⋯ , z m } \left \{z^{1},z^{2},\cdots ,z^{m}\right \} {z1,z2,⋯,zm};
②目标函数同样记作 V ~ \tilde{V} V~,通过最小化(梯度下降) V ~ \tilde{V} V~来更新 θ g \theta _{g} θg,也就是 θ g ← θ g − η ∇ V ~ ( θ g ) \theta _{g}\leftarrow \theta _{g}-\eta \nabla \tilde{V}(\theta _{g}) θg←θg−η∇V~(θg),目标函数 V ~ \tilde{V} V~为:
V ~ = − 1 m ∑ i = 1 m D ( G ( z i ) {\color{Red}{\tilde{V}=-\frac{1}{m}\sum_{i=1}^{m}D(G(z^{i})}} V~=−m1i=1∑mD(G(zi)
同样地每次迭代中Step1重复多次,Step2重复一次,不同的是WGAN的 D ( x ) D(x) D(x)不会在最后一层加一个sigmoid函数了。
- 其他issue
这里对比了WGAN和原来的GAN的效果的对比图,可以看到WGAN生成的效果是明显要好一些的:
还有另一点要说的是在WGAN中Discriminator的loss是可以用来衡量 P G P_G PG和 P d a t a P_{data} Pdata之间的差异的,这是因为Discriminator的loss代表的是wasserstein distance,而原来的GAN的Discriminator的loss是不可以用来衡量分布之间的差异的(原因之前说过了:1.采样;2.数据是高维空间中的低维流形)。这里放一些效果图,在下面的图中可以看出随着wasserstein distance(也就是Discriminator的loss)的下降,生成的效果是越来越好的:
这一点的意义就在于以前我们没有一个衡量的标准来说明一个Generator生成的对象好还是不好(虽然图像好坏可以肉眼大概评估一下,但是一些其他的对象可能就很难衡量了),但是现在我们可以通过Discriminator的loss表示的wasserstein distance来作为一个评估的手段了。
WGAN论文链接:https://arxiv.org/abs/1701.07875
三、Improved WGAN
- Gradient Penalty
对于1-Lipschitz函数,存在以下等价关系:
D ∈ 1 − L i p s c h i t z ⇔ ∥ ∇ x D ( x ) ∥ ≤ 1 f o r a l l x D\in 1-Lipschitz\Leftrightarrow \left \|\nabla_{x}D(x)\right \|\leq 1\; for\; all\; x D∈1−Lipschitz⇔∥∇xD(x)∥≤1forallx
也就是说满足1-Lipschitz的 D ( x ) D(x) D(x)对 x x x的梯度总是小于等于 1 1 1的,受这一点的启发,我们可以修改WGAN的目标函数如下:
W ( P d a t a , P G ) ≈ m a x D { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] − λ ∫ x m a x ( 0 , ∇ x D ( x ) − 1 ) d x } W(P_{data},P_{G})\approx {\color{Red}{\underset{D}{max}}}\left \{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[D(x)]{\color{Red}{-\lambda \int _{x}max(0,\nabla_{x}D(x)-1)\mathrm{d}x}}\right \} W(Pdata,PG)≈Dmax{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]−λ∫xmax(0,∇xD(x)−1)dx}
上面的式子在 ∇ x D ( x ) > 1 \nabla_{x}D(x)>1 ∇xD(x)>1时会产生loss,调节 λ \lambda λ的大小可以使得 D ( x ) D(x) D(x)对 x x x的梯度尽可能地小于等于 1 1 1。使用这种损失函数就可以舍弃weight clipping的做法,不再需要对 D D D做限制也可以学习到一个能够尽可能满足1-Lipschitz的限制的 D D D。
在实际操作中我们不可能对所有 x x x进行积分,因此我们要改写上面的惩罚项为一个依某种惩罚分布 P p e n a l t y P_{penalty} Ppenalty的期望,这样就可以使用采样的方式来计算了:
W ( P d a t a , P G ) ≈ m a x D { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] − λ E x ∼ P p e n a l t y [ m a x ( 0 , ∇ x D ( x ) − 1 ) ] } W(P_{data},P_{G})\approx \underset{D}{max}\left \{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[D(x)]{\color{Red}{-\lambda E_{x\sim P_{penalty}}[max(0,\nabla_{x}D(x)-1)]}}\right \} W(Pdata,PG)≈Dmax{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]−λEx∼Ppenalty[max(0,∇xD(x)−1)]}
直觉上这个 P p e n a l t y P_{penalty} Ppenalty应该是个均匀分布,但事实上在Improved WGAN的论文中对 P p e n a l t y P_{penalty} Ppenalty有特殊的设计。具体的,得到一个采样样本的过程如下图所示,首先从 P d a t a P_{data} Pdata抽取一个点,然后从 P G P_{G} PG抽取另一个点,然后连接起来得到一条线,线段的中间就是采样点:
原论文中解释这样的分布的用意在于,如果我们想要让所有的 x x x都满足1-Lipschitz,这是intractable的,如果只让这 P d a t a P_{data} Pdata和 P G P_{G} PG之间的 x x x满足1-Lipschitz的话是可以实现的而且是比较合理的,因为这个区域内的点影响 P G P_{G} PG如何移向 P d a t a P_{data} Pdata,并且实验中取得不错的效果。
另外实际上论文中使用的损失函数也不是上面那一个,而是下面这个:
W ( P d a t a , P G ) ≈ m a x D { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] − λ E x ∼ P p e n a l t y [ ( ∇ x D ( x ) − 1 ) 2 ] } W(P_{data},P_{G})\approx \underset{D}{max}\left \{E_{x\sim P_{data}}[D(x)]-E_{x\sim P_{G}}[D(x)]{\color{Red}{-\lambda E_{x\sim P_{penalty}}[(\nabla_{x}D(x)-1)^{2}]}}\right \} W(Pdata,PG)≈Dmax{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]−λEx∼Ppenalty[(∇xD(x)−1)2]}
也就是说在实践中并非要让 ∇ x D ( x ) \nabla_{x}D(x) ∇xD(x)尽可能地小,而是要让 P d a t a P_{data} Pdata和 P G P_{G} PG之间区域的 x x x对 D ( x ) D(x) D(x)的梯度,尽可能地接近 1 1 1。这样的做法在直观上是很容易解释的,由损失函数可以看出我们期待要让 P d a t a P_{data} Pdata分布中的 x x x的 D ( x ) D(x) D(x)尽可能大,而要让 P G P_{G} PG分布中的 x x x的 D ( x ) D(x) D(x)尽可能小,那么中间区域的 x x x对 D ( x ) D(x) D(x)的梯度就越大越好,同时 ∇ x D ( x ) \nabla_{x}D(x) ∇xD(x)又要是小于等于 1 1 1的,因此最终解出来的最优的 D ( x ) D(x) D(x)对 x x x的梯度总是倾向于 1 1 1:
仅仅惩罚大梯度也是可以work的,不过上面的方式在实验中收敛地更快且效果更好。
- 对比实验
下面的图对比了weight clipping和gradient penalty中的权重的分布,发现weight clipping的权重大多集中在clipping的位置:
下面的图对比了使用weight clipping和gradient penalty去拟合黄点数据分布的效果,明显gradient penalty效果好一些:
下面的图对比了不同GAN的效果,发现Improved WGAN的效果是最好的:
- 文本生成
将句子按照独热编码的方式表示成一个矩阵就可以用来做句子的生成,由于句子长短不一,可以添加一个使用一个null的token来填补空白位置:
对于GAN产生的句子,其中很难产生 1 1 1,而是对于一个词来说一般都是一个大的数,伴随一些接近于 0 0 0的数,导致生成的数据和真实的数据是没有重叠的,因而使用传统的GAN的话,量出来的JS散度永远都是 l o g 2 log2 log2,而WGAN就可以解决这个问题,使用wasserstein distance来度量差异的话就是比较合理的:
下面展示一些文本生成的结果:
还可以用来做唐诗的生成:
Improved WGAN的论文链接:https://arxiv.org/abs/1704.00028