GAN
生成对抗网络 (GAN) 由两个模型构成, 生成模型 G 和判别模型 D, 随机噪声 z 通过 G 生成尽量服从真实数据分布 p d a t a {p_{data}}pdata的样本 G(z), 判别模型 D可以判断出输入样本是真实数据 x 还是生成数据G(z). G 和 D 都可以是非线性的映射函数, 比如多层感知器.
GAN 核心原理的算法描述如下:
首先, 在生成器给定的情况下, 优化判别器. 判别器为一个二分类模型(可以用sigmoid函数), 训练判别器是实现最小化交叉熵(当然也可以是别的loss)的过程. E ( ⋅ ) E( \cdot )E(⋅)为期望值的计算, x 采样于真实数据分布 p d a t a ( x ) {p_{data}}(x)pdata(x), z采样于先验分布 p z ( z ) {p_z}(z)pz(z).生成器为了学习数据 x 的分布, 由先验噪声分布p z ( z ) {p_z}(z)pz(z)构建了一个映射空间 G ( z ; θ d ) G(z;{\theta _d})G(z;θd), 对应的判别器映射函数为D ( x ; θ d ) D(x;{\theta _d})D(x;θd) , 输出一个标量表示 x 为真实数据的概率.
(1) min G max D V ( D , G ) = E x ∼ p d a t a ( x ) [ log D ( x ) ] + E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {E_{x \sim {p_{data}}(x)}}[\log D(x)] + {E_{z \sim {p_z}(z)}}[\log (1 - D(G(z)))]\tag1GminDmaxV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](1)
x为真实样本,z为训练G的噪声
上式为生成对抗网络的目标公式,先优化D,在优化G.具体可以分为以下两步
- 优化D
(2) max D V ( D , G ) = E x ∼ p d a t a ( x ) [ log D ( x ) ] + E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \mathop {\max }\limits_D V(D,G) = {E_{x \sim {p_{data}}(x)}}[\log D(x)] + {E_{z \sim {p_z}(z)}}[\log (1 - D(G(z)))]\tag2DmaxV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](2)
最大化上述公式意味着使D ( x ) D(x)D(x)越大越好D ( G ( z ) ) D(G(z))D(G(z))越小越好,公式(2)通过尽可能让真样本取值大,假样本取值小,来训练判别网络D DD - 优化G
(3) min G V ( D , G ) = E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \mathop {\min }\limits_G V(D,G){\rm{ = }}{E_{z \sim {p_z}(z)}}[\log (1 - D(G(z)))]\tag3GminV(D,G)=Ez∼pz(z)[log(1−D(G(z)))](3)
同理,G GG的训练只需要能够骗过判别器就OK了
重点来了!!
虽说两个网络交替训练,但是具体训练方法值得推敲,两个网络是一起训练,还是分开训练呢?
其实,对于D DD的训练是单独的。将真假样本丢进去就ok
因为G GG需要骗过D DD,所以必须要有D的参与,因此G GG的训练是和D DD一起的。有人可能会问,不是交替训练吗,放一起怎么训练?只需要保持D DD的参数不变就可以了。
相比其他生成模型, 从实际结果看, GAN 能产生更好的生成样本.但原始的 GAN 存在很多问题. 训练 GAN 需要达到纳什均衡, 训练 GAN 模型是不稳定的. 另外,它也很难去学习生成离散的数据, 为了取得 “胜利”生成器会选择容易生成的样本.
CGAN
条件生成对抗网络 (CGAN) 是在 GAN 的基础上加上了条件扩展为条件模型, 如果生成器和判别器都适用于某些额外的条件 c cc, 例如类标签, 那么可以通过将 c cc 附加到输入层中输入到生成器和判别器中进行调节, 可以指导数据生成过程。
在生成器中, 输入噪声的同时输入相应条件 c cc,而真实数据 x 和条件 c cc 作为判别器的输入. 其目标函数 V ( D , G ) V (D, G)V(D,G) 如式 (4) 所示:
(4) min G max D V ( D , G ) = E x ∼ p d a t a ( x ) [ log D ( x ∣ c ) ] + E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ∣ c ) ) ) ] \mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {E_{x \sim {p_{data}}(x)}}[\log D(x|c)] + {E_{z \sim {p_z}(z)}}[\log (1 - D(G(z|c)))]\tag4GminDmaxV(D,G)=Ex∼pdata(x)[logD(x∣c)]+Ez∼pz(z)[log(1−D(G(z∣c)))](4)
由上式可知,CGAN对于目标函数V ( D , G ) V(D,G)V(D,G)的优化过程与GAN相似:E x ∼ p d a t a ( x ) [ log D ( x ∣ c ) ] {E_{x \sim {p_{data}}(x)}}[\log D(x|c)]Ex∼pdata(x)[logD(x∣c)]表示将数据x xx与条件c cc输入D DD得到是否为真实数据的概率;E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ∣ c ) ) ) ] {E_{z \sim {p_z}(z)}}[\log (1 - D(G(z|c)))]Ez∼pz(z)[log(1−D(G(z∣c)))]表示随机噪声结合条件c cc输入G GG然后通过D DD判断其为真实数据的概率.
若条件c cc为类别标签y yy,则可认为CGAN是将无监督的GAN模型变为有监督模型的改进。
DCGAN
深度卷积生成对抗网络 (DCGAN) 首次将卷积网络引入 GAN 的结构, 利用卷积层强大的特征提取能力来提高 GAN 的效果.
DCGAN 相比于传统 GAN 有以下特点
- 在判别器模型中使用带步幅的卷积代替池化层 ; 在生成器模型中使用 Four fractionally-strided convolution 完成从随机噪声到图片的生成过程.
- 在网络结构中, 除了生成器模型的输出层及其对应的判别器模型的输入层, 其他层上都使用了批量归一化 (Batch normalization), 加入 Batch normalization 层这一操作解决了初始化差的问题,同时保住梯度传播到每一层, 也能够防止生成器把所有的样本都收敛到同一个点.
- 去除全连接层, 直接使用卷积层连接生成器和判别器的输入层和输出层; 需要注意, 取消全连接层增加了模型的稳定性, 但却使得收敛速度变慢.
- 生成器的输出层使用 Tanh (双切正切函数) 激活函数, 其余层使用 ReLU ; 判别器的所有层使用 Leaky ReLU.