李宏毅《机器学习》总结 - GAN
GAN(Generative Adverserial Network),用于生成图片等
直观理解
算法的流程可理解为以下两步:
首先,有两个 network,分别是 generator(G) 和 discriminator(D)。其中 G 能根据参数输出图片,
- 固定 G,更新 D,使得 D 给 G 生成的图片尽量低分,给真实的非生成图片尽量高分
- 固定 D,更新 G,使得 D 给 G 生成的图片的分数越高越好
详细理解
对于无外界要求的情况(如生成插画,可能会有“黑头发”“蓝眼睛”等限制,现在先不考虑这个限制)
和之前模式一样,想要看到由 G 生成的 \(P_G\) 和 P_data 越接近越好,这个用一种散度 JS Div 来衡量。现在就想要找到最小的 G。
问题在于,JS Div 并不好求。如何做呢?
考虑如何寻找最好的 D,就是要让 \(V(G,D)\) 最大(上图),发现这个函数的意义实际上是求了个一个 cross entropy(因为,以 \(y\sim P_{data}\) 为例:求期望实际上是 \(\sum_y P(y)\times log D(y)\),发现 \(D(y)\) 实际上代表的是一个概率的分布,因此原式也可以写成 \(\sum_y D(y)\times log D(y)\),这不就是交叉熵去掉负号嘛!)
又因为最大化了 (交叉熵的负值),也就是最小化了交叉熵,可以发现 D 训练的本质就是训练了一个 binary classifier
此外,经过推导发现 \(\max V(D,G)\) 和前面提到的 div 有关,因此可以用 \(V(D,G)\) 代替之。
因此,可以把训练目标:\(G^*=\arg \min_G Div(P_G,P_{data})\) 改变为 \(G^*=\arg \min_G \max V(G,D)\) 了,这样,我们就通过从 \(G\) 和 \(data\) sampling 来求得散度
JS Divergence 的问题
如果两个分布(如:G 和 data)没有相交的话,JS Div 的结果恒为 \(log 2\),这样就无视了距离,不好。
一种解决措施是把 JS Divergence 换成 W distance(WGAN)
WGAN
考虑两个分布 \(P\) 和 \(Q\),定义他们两个的距离为 W distance,是用一个推土机把 \(P\) “推成” \(Q\) 的样子,所需要移动的距离
这样定义的好处就是,就算两个分布不相交,依然有高低之分。
这样就可以进行训练了。但是直接用 W distance,求解过程很复杂,需要进行一些估测:
其中,\(D\) 需要足够平滑,需要 maximize 期望之差,而这个式子的含义就是让在 data 中的图片,经过 D 之后的值,越大越好,而由 G 生成的图片的 D 越小越好
直观理解为什么足够平滑?因为不然的话可能 data 的值成 \(+\infty\) 了,而 G 的值成 \(-\infty\) 了
那么如何让 D 足够平滑呢?几种方案: