Network as Genertor
普通的 neural network 读入一个向量,输出是一个确定的向量。如果加入一个 distribution 当作参数,那么输出也会成为一个 distribution。
为什么?考虑现实生活的随机性:一个事件有多种可能的结果,他们都是可能发生的,但又不会同时发生。
Ideas
训练两个部分:generator 和 discriminator (also neural nerwork function)。图片可以被视作巨大高维向量,然后作为 network 的输入。
discriminator
输入一张图片,输出一个数值项 scaler,表示定真的程度,数值越大越好。
对抗的思路是,让 generator 和 discriminator 进行对抗迭代,discriminator 负责找出 gen 输出和参考值之间的差异。
Discriminator 的训练可以看作分类问题,也可以看成逻辑回归(regression)等等。Generator 的训练目标很简答:使 Discriminator 的输出值越大越好。
在实际处理中,将 Generator 和 Discriminator 拼接起来,视为一个更大的 network;这个network 中有一个 hidden layer,它的输出即是 Generator 的输出,不过在这里将其视为输出“维数很高”的一层。
整个 network 以一个向量作为输入,并输出一个分数。向量即是某个 distribution 的采样,分数即是 discriminator 的输出。Discriminator,也就是整个神经网络的最后几层的参数是不应调整的。所有调参都应对应着 Generator 所在的层。
Features
理论上,给定两个不同的向量,GAN 会生成两张不同的图片。如果在这两个向量对应的高维区间上做插值(interpolation),则会看到这两张图片的平滑过渡。
Theory
对于 Generator 的训练形式化为:
$$ G^\text * = arg\min_G Div(P_G, P_{Data})$$
其中 $P_G$ 是输出的分布,$P_{data}$ 是训练集(参考值)的分布,$Div$ 表示 Divergence 即两个分布之间的距离。Divergance 的计算公式有 KL Divergence, JS Divergence 等等,但是这些并不方便计算,因为我们不知道 $P_G$ 和 $P_{data}$ 的具体分布。GAN 的解决思路是:Sample is good enough,即 $P_G,P_{data}$ 的一个采样是容易获得的;在此基础上, Discriminator 会基于这些采样给出 Divergence 的预测值。
形式化地,Discriminator $D$ 的训练为:
$$\begin{align}D^\text * = arg \max_D V(D, G), \text {where }V(D, G)=E_{y\in P_{data}}(\log D(y))+E_{y\in P_G}(\log (1-D(y))) \end{align}$$
注意到 $V(D,G)$ 即是交叉熵的相反数,反比于数据的无序程度;也就是这里将其视为了一个二元逻辑回归问题,并把参考值标为 1,越接近 1 表示效果越好。
GAN 的理论是:最大的交叉熵跟 JS Divergence 有很高的相关性,于是可以有:
$$ G^\text * = arg\min_G \max_D V(G,D)$$