GAN的动机
要了解GAN,要从名字出发:Generative Adversarial Network 对抗生成网络
- 生成:描述了GAN能解决的问题,生成一张图片或者一段话等。
- 对抗:描述了GAN网络的运作方式。
**GAN的两个核心组件:生成器Generator,判别器Discriminator。**生成器的目标是尽量生成真实的图片去欺骗判别器,而判别器的目标是尽量把生成器生成的图片和真实的图片区分开,是一个二分类过程。
二者之间的关系体现着GAN中的对抗关系。打个比方,**这就像我们投稿论文,我们是Generator,审稿人是Discriminator。**一篇论文就像我们要学习的模型,我们每一次投稿相当于Generator的一次输出,审稿人作为Discriminator评判着我们的作品。审稿人是有自己的评判标准的,所以我们作为Generator每次修改论文就是去向审稿人的标准靠拢,经过几轮审稿和修改,直到审稿人满意。注意这一过程中,当我们改论文时,审稿人不能再评审我们的文章;而审稿人评审时,我们不能同时修改文章。
现在我们描述GAN的基本流程。Generator( G G G),Discriminator( D D D)
-
初始化 G G G的参数 θ g \theta_g θg, D D D的参数 θ d \theta_d θd
-
迭代:
-
在数据集中采集 m m m个样本(向量) { x 1 , x 2 , … x m } \{ {x^1},{x^2}, \ldots {x^m}\} { x1,x2,…xm}
-
在某种分布(如正态分布)下采样 m m m个噪声样本 { z 1 , z 2 , … z m } \{ {z^1},{z^2}, \ldots {z^m}\} { z1,z2,…zm}
-
通过 G G G生成数据 { x ~ 1 , x ~ 2 , … x ~ m } , x ~ i = G ( z i ) \{ { {\tilde x}^1},{ {\tilde x}^2}, \ldots { {\tilde x}^m}\},\ {\tilde x}^i=G(z^i) { x~1,x~2,…x~m}, x~i=G(zi)
-
通过最大化以下目标函数更新 D D D的参数 θ d \theta_d θd,此时 G G G的参数固定:
-
-
V ~ = 1 m ∑ i = 1 m log D ( x i ) + 1 m ∑ i = 1 m log ( 1 − D ( x ~ i ) ) \tilde V = \frac{1}{m}\sum\limits_{i = 1}^m {\log D({x^i}) + } \frac{1}{m}\sum\limits_{i = 1}^m {\log (1 - D({ {\tilde x}^i}))} V~=m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(x~i))
-
θ d ← θ d + η ∇ V ~ ( θ d ) {\theta _d} \leftarrow {\theta _d} + \eta \nabla \tilde V({\theta _d}) θd←θd+η∇V~(θd)
-
目标函数第一项:增大 D D D对数据集中的样本的评分,也就是树立审稿人心中的标杆。
目标函数第二项:减少 D D D对 G G G生成的样本的评分,也就是审稿人不断的给我们的稿子提建议(挑毛病)。
-
在某种分布(如正态分布)下采样 m m m个噪声样本 { z 1 , z 2 , … z m } \{ {z^1},{z^2}, \ldots {z^m}\} { z1,z2,…zm},此处采样不需要与上一次采样相同。
-
通过最大化以下目标函数更新 G G G的参数 θ d \theta_d θd,此时 D D D的参数固定:
V ~ = 1 m ∑ i = 1 m log D ( G ( z i ) ) \tilde V = \frac{1}{m}\sum\limits_{i = 1}^m {\log D(G({z^i}))} V~=m1i=1∑mlogD(G(zi))θ g ← θ g + η ∇ V ~ ( θ g ) {\theta _g} \leftarrow {\theta _g} + \eta \nabla \tilde V({\theta _g}) θg←θg+η∇V~(θg)
目标函数:增大 D D D对 G G G生成的样本的评分,也就是我们要努力修改自己的文章使审稿人更加满意。
-
为什么 G G G不可以自己学习,而非要依赖于 D D D的评判呢?
我们假设这个方案可行且希望 G G G学习输出数字8的图像,就意味着 G G G需要对任意的输入都可以正确的输出数字8的图像。但是,面对如此随机的输入向量, G G G很难控制好自己的输出。所以我们进一步希望所有的数字8的图像能够拥有相似的向量表示。为达目的,可以通过另一个网络来学习,最后希望 G G G生成的图像能够与原图足够相似。即:
其实这个 D e c o d e r Decoder Decoder就像 G A N GAN GAN中的 G e n e r a t o r Generator Generator。上图中的结构(搬运自《百面深度学习》),也就是经典的可微生成网络 A u t o E n c o d e r , A E AutoEncoder,AE AutoEncoder,AE。
以下内容搬运自《百面深度学习》
标准的 A E AE AE由编码器 e n c o d e r encoder encoder和解码器 d e c o d e r decoder decoder两部分组成,如上图所示。整个模型可以看作一个“压缩”和“解压”的过程:首先编码器将真实数据(真实样本) x x x压缩为低维隐空间中的一个隐向量 z z z,该向量可以看作输入的“精华”。然后解码器将这个隐向量 z z z解压,得到生成数据(生成样本) x ~ {\tilde x} x~。在训练过程中,会将生成样本 x ~ {\tilde x} x~与真是样本 x x x进行比较,朝着减小二者之间差异的方向去更新编码器和解码器的参数,最终目的是期望由真是样本 x x x压缩得到的隐向量 z z z能够尽可能地抓住输入的精髓,使得用其重建出的生成样本 x ~ {\tilde x} x~与真实样本 x x x尽可能接近。
这里补充一点理解,即为什么这个隐变量 z z z如此重要。
我们知道一张图片在计算机中是以矩阵的形式存储的。比如数字8的图像,每个人写出来的8都不一样,那么它的矩阵就会差别很大且很难找到什么规律。隐变量 z z z希望做的事情就是用最简单的向量表征图像的所有特征,比如我们有一个2维的向量来表征数字图像,那么理想的表征是:[这是数字8,向左偏24度]。大概是这个意思。
回到 A E AE AE的讨论上, A E AE AE会有什么问题呢?观察它的训练框架可以发现,它只能针对当前给定的图像生成一个隐变量 z z z和一个生成数据 x ~ {\tilde x} x~。所以 A E AE AE很有可能无法泛化到未见过的图片上。换句话说,即只会模仿而不会创造,无法生成任意的新样本。
作为 A E AE AE的升级, V a r i a t i o n a l A u t o E n c o d e r , V A E Variational AutoEncoder, VAE VariationalAutoEncoder,VAE要解决的就是 A E AE AE只会模仿不会创造的问题。下图为 V A E VAE VAE框架,搬运自《百面深度学习》
以下内容搬运自《百面深度学习》
V A E VAE VAE的主要优势在于能够产生新的隐向量 z z z,进而生成有效的新样本。 V A E VAE VAE能够生成新样本(与 A E AE AE最大区别)的原因是, V A