文章目录
- 生成模型
- 生成模型和判别模型的区别
- 我对于生成模型的理解
- Gan的思想
- Generator
- Discriminator
- Generator和Discriminator相互作用
- 问题
- Gan算法
- 结构学习
- 结构学习的应用
- 输出序列
- 输出矩阵
- 为什么结构学习有难度
- 结构学习的方法
- 生成器之为什么不能自我学习
- Generator的学习
- Generator的优化
- Generator的输入
- auto-encoder回顾
- Auto-Encoder的问题
- 解决方案——VAE(Variational Aoto-encoder)
- Generator的输出(解答)
- 判别器之为什么不能自我生成
- Discriminator的生成(解答)
- Discriminator的训练
- 对比Generator和Discriminator
- Gan的优势
生成模型
一系列用于随机生成可观察数据的模型。
训练阶段,使模型学习训练数据的真实分布;
测试阶段,学好的模型能够随机生成新的数据。
我们希望的结果是:模型生成的新数据和训练数据分布尽可能地相似。
生成模型是一个密度估计问题,即数据分布的估计。
关于密度估计问题,又分为了:
- 显式密度估计:明确地定义模型,直接从样本集中估计概率分布;
- 隐式密度估计:不直接估计概率分布,通过拟合模型,使其能够生成符合数据分布的样本。
生成模型和判别模型的区别
我们首先介绍一下生成模型和判别模型的区别。
- 两者所处的研究范围不一样。判别模型常见于监督学习,解决的是回归和分类问题;而生成模型常见于无监督学习,解决的是密度估计问题。
- 两者的概率模型不一样。判别模型的概率模型是:根据得到的特征x推断标签为y的可能性;生成模型的概率模型是或者,根据标签或无标签地从庞大的特征空间选择合适的特征组合成数据。
我对于生成模型的理解
假设我们在二维空间有一组点,假设他们满足某种概率分布于这个空间中。这是我们的数据集,为了便于解释,我把他们画的满足一个类高斯分布:
我们能从这个数据集当中,学习到一个高斯分布,以第一象限的某个点为中心,向周围,出现的概率衰减。
有了这个分布,我们就可以生成一些点,使其混入数据集中,大概率不会出现红色点这样的奇葩位置。
Gan的思想
Generator
应用:
- 生成图片:
- 生成句子:
在实际应用中,我们可以根据图片生成文字或由文字联想相关的图片,这可以通过Generator实现,只要提取特征矩阵即可。
由此可知,我们给予Generator一个向量,它可以返回一个高维向量(对应着图片/句子),通过控制输入向量的某一维度数据,得到的图片/句子的某一特征也会随之发生变化。
Discriminator
接收图像,吐出评分。
Generator和Discriminator相互作用
- Generator生成图片;
- Discriminator与真实图片比较,给予Generator反馈;
- Generator、Discriminator提升,并重复以上操作。
Dv1给予Gv1色彩反馈,于是Gv2为图片着色;
Dv2给予Gv2嘴巴反馈,于是Gv3为人物加上嘴巴。
问题
- Generator为什么不自己学?
- Discriminator为什么不自己生成?
- 两者具体是如何提升的?
Gan算法
- 随机初始化
- 训练过程——在每次迭代中:
Step-1 :固定Generator G,更新Discriminator D。
学习Discriminator,为真实的图像分配高分,为生成的图像分配低分。
Step-2 :固定Discriminator D,更新Generator G。
学习Generator,使Discriminator的分提高。
结构学习
Gan的原理,为什么它是这样运作的。
对于机器学习而言,我们的目的是为了找到一个函数,根据一些输入得到一些输出。
在我们已经接触的一些问题种类当中,
回归:输出一个标量;
分类:输出一个类别。
对于结构学习而言,输出的是一个序列、矩阵、图、树…而且,输出结果的各成分之间是有相互依赖关系的。
剧透:以图片为例,像素与像素之间的相关性,只靠Generator把握不住,需要Discriminator把握。
结构学习的应用
输出序列
输出矩阵
为什么结构学习有难度
核心:它是一个one-shot/zero-shot问题。
以人脸识别为例,模型的学习样本就只有一张,它需要凭借着这一张图片去识别出这个人。这就是ont-shot问题。
以自然语言处理为例,我们的语料库容量有限,输入的单词也许模型不认识,但它依旧要做出正确的判断,这就是zero-shot问题。
自然语言处理与人脸识别都属于结构学习问题。
综上所述,对于结构学习而言:
- 将每一个可能的输出都视为一个类别。这样的模式会造成训练集和测试集会出现不共有的类别;
- 输出空间很大,大多数类别都没有训练样本;
- 在测试过程中,要求模型会创造新的东西,需要更加智能化;
以生成图片为例,结构学习模型生成的是一个个像素点,因此,这要求模型要具有大局观,保证输出的成分间的相关行与依赖性。
总结一下,结构学习的两个要求:
- 智能化;
- 大局观。
结构学习的方法
生成器之为什么不能自我学习
Generator的学习
与分类问题的训练很相似。
给一个向量,Generator生成的图片与真实图片越接近越好;分类问题的输入和输出则截然相反。
Generator的优化
那么这样一个向量从何来?总不能随便生成吧。如下图所示,我们希望向量的每一个维度都存在着一些规律。
在实验中,我们可以随机生成向量,但这样的向量很难把握特征,所以得到的图片质量不高,因此,有了以下改进方法。
Generator的输入
我们可以训练一个Encoder,提取特征,将图片变为向量。
如何train这样一个Encoder?
Auto-encoder!
auto-encoder回顾
训练一个encoder需要配合decoder,构建一个完整的训练系统。
encoder将图片变为向量;decoder将向量变回图片,得到的图片要与初始图片越接近越好。
此时的Decoder就是Generator。
我们把Decoder取出来就可以作为Generator,也就是说,我们在寻找向量的时候,顺带得到了生成器。
Auto-Encoder的问题
训练集是有限的,我们看到vector a得到左倾的1,看到vector得到右倾的1,那么取平均后的向量会是什么呢?
首先,训练集不包含这个样本,按理论来说,得到的会是正直的1.但是NN的过程是非线性的,因此可能会得到噪声。也就是说。这样一个结构学习问题,暂时不具备智能性。这说明了自编码器泛化能力不强。
解决方案——VAE(Variational Aoto-encoder)
Encoder会生成样本的均值和方差,从分布中随机抽样,得到特征,这提高了泛化能力。
Generator的输出(解答)
我们看到了单独的自编码器和VAE的Decoder其实都可以做一个Generator。
训练过程中,我们采用最小重构误差,我们通过判断不一样的像素点数,评判Generator的性能。
然而,实际上,要达成一模一样的效果,是不现实的,肯定会存在一些误差,那么在哪个特征上妥协,在哪个特征上高要求,是一大难题。
比如以下四张图片:
显然上面的误差小一些,但其缺失的部分,不大合适。我们可以理解下层图片笔画过长的问题,但不能接受中间存在空白或多余的问题。
以上的问题体现了结构学习的全局性要求。这是单独的Auto-encoder得到的generator所很难办到的,需要更大、更深的网络结构。因此,我们再加一层Discriminator。
判别器之为什么不能自我生成
为什么discriminator可以解决全局性问题?
这是因为,generator是一个一个生成像素的,其本身很难自我检测,而discriminator接受的是生成完的图片,因此检测起来很方便。
Discriminator的生成(解答)
那么Discriminator可以自己训练吗?
这当然是可以的。
我们随机给一个图片,DIscirminator穷举所有的像素组合方式,选取得分最高的作为生成图片。其本质上,是求解一个最优化问题。
但是我们只有正样本,却没有负样本,这样会造成Discriminator对所有的样本给出高分。
然而,光有负样本是不够的,我们希望DIscriminator的眼光更挑剔一些,所以,负样本的品质要达标。
所以负样本的存在成为了阻碍Discriminator的第一大障碍。
如果考虑以上方面,一定要Discriminator生成的话,那么算法流程如下:
那么,更新负样本的问题,就转化为了求解上述最优化问题,这是很困难的(我们势必要做一些假设,才可以求解,如果设D是线性的,虽然好求解,但是性能不高;设其为非线性的则截然相反)。综上所述,由于无法求解arg问题,因此,我们用Generator代替。
综上所述:
- 缺少有质量的负样本;
- 无法解决优化问题。
Discriminator的训练
- 初始化D(x)曲线;
- 为正样本区域,将D(x)提升;对负样本区域,将D(x)降低;
- 更新负样本,迭代进行。
对比Generator和Discriminator
Gan的优势