介绍(Introduction)

当今AI时代在人工智慧领域取得许多伟大的突破,其中机器学习与深度学习等计算机算法的崛起更是带来了一波又一波的浪潮。如今的深度学习模型已经数不胜数,而Generative Adversarial Network就是其中耀眼的一部分。在Quora上Facebook的AI研究团队主任Yann LeCun说了这样一句话:“Adversarial training is the coolest thing since sliced bread.”

用途(Usage)

主要思想(Basic Idea)

GAN的本质和大多数的神经网络模型一样,都是通过一系列Function的变化来拟合输入和输出的关系。GAN内部可以分为两个部分:1、Generator 2、Discriminator ,顾名思义Generator的职责就是根据输入的Vector中所隐含的Feature信息来生成结果所需要的形式(如图片或文字等)。

生成器(Generator)

  • Input : Vector
  • Hidden : NN or Function
  • Output : Image or Text …

Generator的输入为一个固定维度的Vector,经过隐藏层的变化之后得到相应的输出。而这个隐藏层内部可以是一个神经网络(Neural Network) 或者是一个 方法(Function)

如图所示,Input端的Vector中不同的Feature会有不同的含义,而它们都决定了最终结果输出时候所具有的某个特征(Each dimension of input vector represents some characteristics)。只是这个特征被计算机量化成了一个人为无法辨识的数字罢了。只要能够掌握这些Features所代表的特征含义,我们就能够根据自己的意愿来调整结果的形态了。

  • Tips: 我们可以通过改变特征值来改变特征在结果中的表现。这个侧面说明了特征feature在数值上是连续的。只有当信号在一定区间范围内是连续的分布时,我们才能根据自己的意愿去调整特征的表象。

判别器(Discriminator)

  • Input : Image or Text …
  • Hidden : NN or Function
  • Output : Scalar (Always normalize to 0~1)

Discriminator的结构和Generator类似,只是它的输入转而变成了Generator所产生的输出而已。输入同样经过一系列隐藏层(NN或Function)得到相应的结果,而结果是一个Scalar,表示对输入的评价(Larger value means real, smaller value means fake)。

GAN网络(GAN Network)

GAN的工作原理就是依靠生成器和判别器的对抗来让彼此变得更强,一个类似进化论的概念。

以图中的例子来说:生成器不断产生不同的图片,然后由初代的判别器判断图片的好坏,直到能够符合第一代的判别器的要求。这时判别器已经没有能力再去打击生成器说它不够强大了,而这个情况并不是判别器想要看到的,于是它只能通过利用Real Images来训练我们的判别网络,使之进化到L2,而此时生成器也需要继续改变才能适应新的判别器的判别方式。就这样一方越来越好,一方越来越严格,两个模型都在不断变得更强(This is where the term “adversarial” comes from)。

为什么需要GAN(Why GAN)

了解了GAN的运作机制后,很多人可能会有这样一些疑问:

Why generator cannot learn by itself

  • Question1 : 既然生成器能够生成物件,那么为什么生成器不自己学习那些Real images呢?

第一个问题是: 我们的Generator是从随机的code信息中生成相应的物件(object),但是这些code又从何而来呢?

我们可以借助Auto-Encoding的方式来帮助找寻code。利用encoder和decoder的联合作用,就能够利用已知的数据产生数据表示向量,也就是我们的code。

第二个问题是: 我们已经解决了code的来源问题,那么针对code中不同的Feature我们虽然能够准确辨识,但是对于结果的Feature Representation而言都太过绝对了。一个值表示一个特征,如果我们想要的特征不在这些Code向量的表示范围内,应该如何改变它们呢?

这个时候直觉的做法应该是找两个最接近这个特征的其他特征,然后通过加权组合来建构新的特征。而这种方式可以通过VAE来实现:

Variational Auto-encoder通过将Auto-encoder中encoder生成的code向量进行维度的拆分。利用一部分特征维度来进行分布扩散,最后和剩下的保留维度特征进行加总得到一个新的code向量。

  • 为什么要这么做呢?它的结果又会对Feature Representation造成哪些影响呢?

我们可以通过下面这种图来理解:

传统的Auto-encoder让我们每一个Feature都能够对应结果产生的某一个特定的Feature Representation,但是相对的浮动范围却很有限(相当于一个个离散的点)。如果Feature的向量和真实的向量存在些许偏差,产生的code将无法表示成为特定的Representation。而VAE将某些特征向量的分布进行了拓展,使得原本离散的点在一定范围内连续了起来。这样即使code的特征向量存在偏差,还是能够运用这些偏差进行调试。此外最关键的一点,如果让两个向量的特征拓展后存在交集,那么交集上的特征将具有两个特征的加权组合结果

1
Vector -> Encoder -> Low dimension code + Noise -> decoder -> Vector
  • 那么回归问题,既然这些问题都解决了,还存在什么使得GAN的Generator不能自己训练呢?

那么就是所谓的第三个问题了: 原来,如果直接训练我们的神经网络让他来自行判断并产生objects,势必会存在这样的问题——结果越像训练资料越好(这是SGD的想法)。

图中上半部分由于改变了一个新的像素点,因此误差error = 1,神经网络觉得是比较好的结果,但是在人为看来却不再是2这个数字了;相对的下半部分结果多了6个像素点error = 6,神经网络觉得它不够优秀,需要重新训练,但是在人为的角度却是ok的。

  • 导致这种问题的原因在于,我们的神经网络输出层往往是根据结果的类别所建立的one-hot vector,而这就使得结果的层级之间处于相对平行的状态,层内的neuron之间无法相互传递信息所导致的:
  • neuron之间无法沟通就会使得输出结果无法掌握全局的最优情况。

上图是Generator产生的two-dimension的one-hot vector。从结果可以看出,在X2的坐标轴上,蓝点的分布十分散乱,这是因为神经网络在考虑输出的时候,负责输出X2结果的neuron没有考虑X1的分布情况;相对的X1的情况也是一样。

因此,我们迫切需要一个能够将输出结果进行统整的结构,而最适合的结构就是神经网络了。因此我们引入了Discriminator来整合Generator的输出结果

Why discriminator don’t generate object itself

  • Question2 : 既然判别器能够学习什么样的物件是好的物件,那为什么判别器不自己生成物件呢?

判别器在训练过程中,我们通过Real Data作为输入来让它能够识别好的物件:

  • 但是这种训练只能让模型拟合好的例子,对于不好的例子随着训练的进行模型会一直降低它们的分数(Scalar),到最后模型就成为了一个二分类器了(只有0和1),显然这个不是我们想要的结果。

  • 如何选择negative examples呢?

我们不能够选择那些距离real sample很远的examples作为反面例子,而是需要选择尽可能接近的作为反面教材,因为只有这样模型才能学到细致的区分特性。

我们还需要给我们的模型一些反面的训练数据,好让它能够预测scalar值介于0和1之间的情况从而进行SGD的动态更新。

总而言之就是判别器比起生成器无法保证每次产生的结果都能够用在提升模型效能,特别是在模型的结构是“Deep”的时候。另一个重要的一点就是我们可以通过Argmax函数确定好的模型,但是却 无法判断哪些生成的图片是不好的(Difficult to recognize the negative sampling) 。(因为不够灵活,不符合训练资料的很难判定为好的图片)

How discriminator and generator interact

  • Question3 : 判别器和生成器之间是如何互动的呢?

GAN神经网络被广泛应用在Structured Learning领域中,而这种机器学习方式的可靠指出在于它能够适应更加复杂的环境。对于One-shot、Zero-shot Learning的问题上,传统的机器学习分类模式讲究的是利用监督式学习的方法用大量例子来拟合网络结构。而Structured Learning除了能够拟合那些带有Label的数据外,还能够在输出范围较大的时候主动去尝试拟合那些模型从未处理过的数据类别。从而创造出全新的类别成员,因此该学习方式也要求模型的结构更加智能。

利用Structured Learning的这些特性,我们就能够将两个神经网络结合进行训练,让他们彼此竞争相互学习,最后双双得到提升。

  • General Algorithm

在训练两个网络的时候,我们通过一些positive examples和由Generator随机生成的negative examples来作为训练数据。在每个迭代中,利用positive examples训练Discriminator,将数据标记为1。然后将Generator生成的negative examples标记成0,利用Gradient Ascent的方式提升GAN网络的最大似然结果(argmax)。

Gradient Ascent是用来提高Generator产生结果的最大似然分数(scalar),如果评估标准换成计算Discriminator的反馈和Generator生成结果之间的误差时,则用的是Gradient Descent。

如何提升GAN的效能(How to improve GAN)

了解了GAN的用途之后,我们就要开始了解如何才能提升GAN的效能,GAN的种类有很多,不同的GAN网络具有自己独特的功能。但是在训练过程中仍然有一些细节是共通的。

Binary classifier as Discriminator

训练效果的好坏只是评估模型的学习能力如何,关键还是要看在实战(Testing)中的表现。为了能让模型更灵活而不仅仅是依赖于训练资料,我们要防止过拟合的出现。

那么防止过拟合的方法又可以有哪些呢?

Least Square GAN(LSGAN)

首先想到的应该就是用线性的方法取代传统的非线性模型,用简化边缘区分度的方式来防止过拟合的出现。而将传统二分类的Sigmoid function换成Linear的方式就是LSGAN的做法,即利用最小二乘法拟合一条直线来对样本进行分类。

Wasserstein GAN(WGAN)

既然Discriminator是将real data的结果当成1,而来自Generator的结果当成0,那么就必然希望real data训练出来的分数越大越好,Generator产生结果的分数越小越好。

Original WGAN的做法势必会带来一些问题:

  • Generator的学习过程是有一定的幅度的,根据Shrinkage的想法每次走一小步的结果去逼近最终答案比起每次走一大步去逼近更容易防止过拟合。因此我们要求Discirminator的分类曲线的区分度需要满足1-Lipschitz function(利普希茨函数)。

  • 对优越值的无限优化会导致模型无法收敛。

  • 过大的误差反而会增大Generator的学习负担,入不敷出。因此我们会选择设定一个阈值,当超过这个阈值的时候我们就利用Clipping的方式将值重置为阈值。这就是Improved WGAN模型的思想。

Lipschitz function(利普希茨函数)

该函数要求函数满足算子:

而1-Lipschitz 就是当K=1时的函数。从函数关系式不难看出需要满足这个的条件就是在任意时刻函数的斜率不能高于1。

Sentence Generation(Real sentence V.S. WGAN)

我们用one-hot vector表示句子:

Real sentence:


Generator:

可以看出利用三角函数进行分类的WGAN在句子生成上能够做到比较好的效果。

Loss-sensitive GAN(LSGAN)

传统的WGAN会无限提升优质物件的scalar并且降低不理想物件的scalar值,这样训练的结果会让模型变得异常严格,难以客观评估。因此Loss-sensitive GAN就提出了利用分布式拟合的方法一步步逼近最终的结果:

  • 我们可以先定义一个“好”的标准,并把生成器的结果编辑为“不好”。利用每一次训练慢慢减小这两者之间的差距。然后再将原先“好”的标准定义为“不好”,把更接近real data的图片定义为“好”,如此一点点进步。

  • 利用LSGAN训练需要保证两极端值不能无限增长和下降,因此需要辅助以Improved WGAN或者Energy-based GAN作为Discriminator的训练瞄准。

Energy-based GAN(EBGAN)

如果一个物件足够优秀并且特征明确,我们就一定能够通过autoencoder的方式提取code特性。Energy-based GAN的Discriminator正式利用了autoencoder的方式进行训练的。

我们的目的是要最大化结果scalar X,从而使误差为0。与WGAN不同的是,利用autoencoder训练的Discriminator会尽可能让优化区间在一个有限的区间内增长。对于下降的趋势不需要太过强烈,同样通过clipping的方式进行修剪:

  • EBGAN的训练过程中,我们会分成两个部分,最大化Real object,和最小化Gen object。而我们设置一个region来限制对gen的惩罚,因为惩罚远比reconstruct要容易,而因为这个限制,我们的模型最后只能通过提高Real object的值来更新参数。

如此一来通过Gen区间不断向Real Data移动,最终得到一个有限的区间就是所谓的“优秀区间”。为了避免区间之间的过度太剧烈,同样能够让评估曲线满足Lipschitz function的条件。

如何评估GAN的结果好坏(Evaluation)

对于模型结果的评估,通常利用连个指标来区分,其中一个就是Likelihood,而另一个是Quality

  • Likelihood顾名思义就是生成的Object和Real Data特征分布的相似程度。
  • Quality则是指生成的Object中优秀样本的多少,无需和Real Data完全相似,而是关注训练样本本身是否优秀。

如下列举两种极端条件:

如上图所示,生成样本和评估样本结果的相似度为0,但是其样本本身的质量OK。也就是生成器完全没有学习特征的匹配,而是尽可能提升结果的质量。

相对而言对于模型训练相似度高的模型,如果换一种新的样本主题(不同的特征组合),那么结果就会急速下降。也就是模型本身过于拟合那些特征的分布,而忽略了灵活变通的能力。

  • 有了上面两个例子,我们所要得到的就是介于两者之间,既能够一定程度上还原样本的特征分布,又能产生不错的结果的模型。

为什么GAN很难训练

我们的generator能够产生一个范围作为它自身认为的正确的范围,然后通过和正确结果的范围误差来缩小距离(likelihood)。如下图所示:

但是generator无法计算两者之间的差距,因此需要Discriminator来判断两者是否相似,然后通过不同的GAN模型来达成不同的判别器的目的,用来以不同的方式评估范围的差距,然后更新范围。因此不同的GAN就是用不同的方法来实作error的计算。panelty的不同会让两者形状更新不同,谁包含谁范围会不一样大。

  • 那么GAN的训练究竟有那些难点呢?

选择一个合适的结构来表示我们的feature是十分重要的,因为这个关系到optimizer对结果优化时候计算误差的标准。不同的标准带来的结果也不一样:

  • Jensen–Shannon divergence(JSD)

JSD利用传统的KL散度(Kullback–Leibler divergence)来衡量两个几率分布之间的差异性。因而也被称作information radius (IRad)total divergence to the average

由图中可以看出:JS计算相似度的时候关注的是数值本身的差异性,而忽略了数值之间的相对距离因素。所以如果使用JSD进行评估的话,会导致样本训练过程中无法判断模型训练趋势的好坏。

  • Earth Mover’s Distance(EMD)

EMD与JSD都是评估两个几率分布的差异性,不同的是EMD通过region D计算两个样本之间的相对距离,从而反应从一个样本转换到另一个样本的cost。这种评估方式无意可以让训练的reward变得清晰。

Conditional GAN

条件生成模型顾名思义就是能够按照我们设定的条件参数来动态生成一些相关的物件特征的模型。

如上图所示,我们输入的特征给Generator的Noise不再只是一连串毫无关联的特征向量,而是含有一些人为标记的条件参数

要实现Conditional Generation需要具备一些要求。

Modifying Input Code

要想让生成器产生的资料具有人为规定的特定特征表现,最直观的思维就是理解Input Code中每一个变量对应的含义,然后有选择性地改变它们。为此就衍生出了所谓的InfoGAN

InfoGAN

我们通过可视化模型特征向量可以在维度空间中构建特征的表示(Representation)。我们理想中的特征往往是均匀分布的,然而事实真是如此吗?

事实上特征的分布比我们想象的还要杂乱,并不容易发现其中的关联性。例如改变了一个特征对结果没有变化,而改变两个特征结果却发生了变化,然而单独改变其中一者又会是另外一种结果。因此对于这些众多的特征组合,我们应该如何发现其中有用的信息呢?

通过训练一个decoder来对特征进行压缩,其结果就是生成能够有效还原物件本身的特征集合(Code)。如图所示:Z的特征包括了有用的c和没用的特征Z’,通过autoencoder的方式能够利用X重新生成X。而训练的过程中,我们的classifier得到的中间产物(hidden layer output)就包含了我们所要的特征集合(Code)。通过共享decoder和Discriminator input part的参数,我们就能够完美的将X的特征毫无泄漏地输入Discriminator中。

  • AutoEncoder还可以用来解决特征消失和模型缺口的问题(Mode Collapse)

如图所示,我们模型在训练过程中会根据自身参数选择特征,而如果对特征的前处理不够完整,模型可能会遗漏掉一些重要的特征,这个过程就被称为“Missing Mode”。而为了避免这种问题,我们就可以使用infoGAN的方式来对特征进行前处理。

Controlling By Input Objects

Input Data的不同种类也会对训练模型产生不同程度的影响。一般的Input可以分为3个类别:Paired data、Unpaired data、Unsupervised。

Paired Data

传统的监督式学习就是使用了Paired Data,一个pair包含了input和label两个部分。以依照描述生成图片为例:

如果输入包括了input:Description 和 label:image。这时候Traditional Supervised Learning就会通过训练学习文字和图片之间的对应关系。

  • Traditional Supervised Neural Network通过设定输入为一段描述,输出为一张对应的图片。通过梯度下降的方式拟合描述的文字和图片之间的权重。

测试时同样输入一段描述,根据权重生成图片。而这个图片往往是所有满足该描述的图片的加权平均结果,因此会是一个相对模糊的结果(Blurry Result)。

  • GAN的方式不同与传统的监督式神经网络拟合描述和图片,而是利用生成器生成一个分布表示描述下所有可能图片的出现条件。然后用判别器判断新的描述是否落在分布的合理位置。

如果输入包括Image和Distribution,则我们的判别器不单单是判断图片产生的好不好,还会挖掘描述和图片之间的关联程度,依照关联度判断是否输出相应的图片。

如上图所示,利用条件分布来表示图片和描述是GAN的一个优势所在。不同与Traditional Supervised Learning只是单纯建立描述到图片的映射关系,GAN网络还能判断从图片到描述的关联程度。我们还可以将判别器产生的结果加入训练资料来完善分布曲线。

Unpaired Data

除了成对存在的Paired Data之外,还存在一些原本只有单独出现的数据,通过对数据本身进行一些改变而生成另一组数据,这样的数据在原先的训练集中并不存在(没有label),因此称之为Unpaired Data

  • 以图片的风格转换为例:

上图中展示了两种不同风格的图片,每种图片具有自己的Datasets,我们需要利用这些data将Domain X的图片转换成Domain Y的图片。

如果按照GAN的训练思路来看,我们可能很容易想到下面的训练方式:

通过Generator训练生成随机的图片(即随意改变原先图片的像素值)。然后通过Discriminator来判断生成的图片和Domain Y图片的相似程度。但是这样的方式存在一个很大的问题:

  • 在判别器的作用下,为了让判别器觉得产生的图片好,因此生成器可能选择完全无视Input的图片,只需要致力于生成带有特定Feature的Output,这样就会偏离我们的目的。为了解决这个问题,我们引入了Cycle GAN的概念。

Cycle GAN

在处理Unpaired Data的时候,我们需要注意让生成器不会完全放弃生成器原本输入的信息,那么如何锁住一个输入信息的Feature呢?

  • AutoEncoder应该是一个绝佳的选择,能够通过建立AutoEncoder的网络来提取和压缩Generator的Input Data中潜在的Feature。

有了AutoEncoder的限制和Discriminator的辅助我们就能够对生成的中间产物进行scalar的计算了。但这种判断方式也要求两个Domain的feature不能相差太大。

Unsupervised

我们只有一堆物件(如图片),却没有图片的Label,因此我们利用所有图片的Features来对Input进行Embedding(Feature Embedding)。此时我们在组合Feature的时候,不需要将两个Feature进行直接的组合,而是在Embedding的Code中寻找Vector相似的那个Output作为新的Output。

Feature Extraction

有了输入资料和模型架构,剩下的就是需要让输入的资料能够表示成模型能够识别和方便处理的形态了。而这个所谓的形态就是资料feature的表示和提取。

Domain Independent Feature

在使用神经网络训练和识别不同Domain的Feature时,神经元除了需要学习物件本身的特征之外,还需要区分不同的Domain。使用Traditional Neural Network拟合Training Data的同时,网络也会记住Training Data的Domain Feature,这样在预测Testing Data的时候一定会产生很大的问题。(问题本质:Training Data和Testing Data之间存在本质区别的Domain Feature)

Domain-Adversarial Training

如果使用Training Data Domain Feature来预测Testing Data Domain Feature势必会有很大的误差,因此我们除了训练Label本身的特征,还需要训练Domain Feature的差异性。

如上图所示:为了解决Domian依赖的问题,我们需要训练三个不同的网络来组合成一个总体的大网络结构。这个大网络中的训练目的各有些许不同,Feature Extractor的结果会极力接近Label predictor(Minimize Label Loss),同时排斥Domain classifier(Maximize Domain Loss)。

要实现排斥Domain Label的结果,我们需要对Domain classifier的反馈进行一个负向的更新,这样就能够让Domain的Information完全消失,摆脱Domain的束缚。

Improving Auto-encoder

Auto-encoder在对Generator的训练过程中的特征降维以及保持特征本质特征等方面做出了极大的贡献。如何应用Auto-encoder也成为了GAN的一个重要过程。

VAE-GAN

之前提到的利用VAE不仅能保存物件特征,还能够通过扩散特征的表示范围来产生新的特征。而利用这样的方法能够有效提升Generator的效能。

BiGAN

与VAE相似的BiGAN network利用一个双向的网络结构来进行训练。

Encoder输入为real data,输出为固定Dimension的code z。而Decoder利用这个code z重新还原data的模样,成为generated data。实际上就是将AutoEncoder网络拆分开来训练。利用Discriminator来辅助两个网络的训练,解决AutoEncoder中Encoder和Decoder无法分开训练的问题。

这个时候对于Encoder而言,其思想就相当于GAN网络中的Discriminator,通过真实资料提取信息,从而尽可能地学习原始资料的全部特征分布。因此为了提高Encoder的编码能力,我们需要让Discriminator尽可能降低Image x的scalar同时提高code z的scalar。通俗的理解也就是尽可能降低图片可以提供特征的条件,在这种严苛的条件下训练Encoder能够提取到尽可能高scalar的code z。相反,对于Decoder而言,则其思想就相当于GAN网络中的Generator,通过模糊的特征杂讯(noise)来生成物件。因此为了提高Decoder的解码能力,我们就需要让Discriminator尽可能提高Image x的scalar,同时降低code z的scalar。通俗理解为我们需要让结果达到一个高scalar的分数,同时要让我们的模型尽可能在最严苛的环境(code z的scalar很小,可以理解为杂讯很多)下训练。

GAN Examples

当今的GAN network被广泛应用于图片的生成和Dataset的产生。

Anime Face Generation

Example Code:

Dataset Collection:

Text-to-image:

Decision Making and Control

Widely Studies:

无论是GAN还是普通的神经网络结构,在解决特定问题的过程中都离不开决策和调控的平衡问题。AI的精髓在与自我调控和学习,因此神经网络结构不同,也会导致机器认知和判断决策的不同:

  • Self-driving car
  • Dialogue System
  • Go playing

What do we miss?

当Decision making的议题出现之后,紧跟着的一个棘手的问题就是:Machine dosen’t know the influence of each action.而这个问题的根本原因就在于模型所有的行为都取决于它能够接收到的资讯,对于那些具有延迟性或者没有办法及时反馈的reward就没有办法很好地照顾到。

针对这种情况现有的解决方案:

  • Reinforcement Learning

    • 从环境中获得reward。
  • Learning by demonstration

    • 从过往经验中学习和总结。

Reinforcement Learning

一个好的强化学习模型能够针对环境中的变化做出总结,并试图理解环境的本质。例如Alpha Go综合了Policy-based、Value-based和Model-based等不同模式于一身,这些模式相互协调帮助模型更好地学习环境中的反馈。

  • 首先根据环境得到一个状态S,根据状态再去预测接下来的行为a,如此反复最终达到一个结果状态结束。

  • 以上过程中我们的每一个时刻表示为(S,a)的pair,所以全局的Actor、Environment信息就能够表示成:

  • 而根据S和推导出来的a,我们就能够得到一个环境的反馈(可能不是即时的),最终的Reward可以表示成:

  • 最后,最大化reward就是我们模型所到达到的目标了。

  • 对于Reward的计算有一些值得注意的地方:

Uploading file..._8mxhhffj3

以上是Reward进行反向传递时候的误差,因为一般情况下,可能会出现无论如何改变参数,决策的行为会一直被判断成positive的情况(环境很温和),这种情况往往会让模型产生极端分化。因此我们通常会加入一个Baseline来减缓这种太过温和的环境反馈,让模型从一个相对优越的起点开始学习,降低学习成本。

Neural network

除了强化学习的方式以外,神经网络也能够作为行为预测的模型。利用NN来predict最终结果所要表示行为的one-hot vector,利用argmax来选择几率最大的行为输出也是一种Actor的决策方式。

  • 与Reinforcement Learning结构相似的,神经网络只是将Actor的决策交给神经元来计算得到。Actor模型需要对环境进行编码,然后再利用权重计算得到相应的行为分数,取最大的行为进行输出。

  • 然而传统的神经网络利用SGD等梯度下降的方式进行反向传递更新参数,而在环境中的决策问题往往是不可微分的,行为与行为之间属于离散分布,这个时候通常会借助强化学习的Policy Gradient来帮助输出的决策。

RNN Generation with GAN

GAN在自然语言生成方面的应用:

Sentence Generation

具体操作流程如下:

  • Initialize generator G and discriminator D
  • In each iteration:

    • Sample real sentences x from datasets
    • Generate sentences x’ by G
    • Update D to increase D(x) and decrease D(x’)
    • Update G such that increase scalar
  • 到了这里就会有一个关键的问题出现了:在句子生成的序列化决策行为上,我们可以对GAN网络做反向传递吗?

    • 答案是No!因为vocabulary字典序列的不连续性(Discrete),反向传递改变的细微变化无法改变原先的结果。
    • 因此我们会使用输出为固定行为的Policy Gradient来取代输出为一个区间范围取值的传统神经网络模型。以一个例子来看:如果我的结果是token,而传统神经网络通过预测token’的取值来逼近结果,然而如果预测的token不在字典集中就会回传UNK,因为token的数值能够进行梯度下降的运算。但是Policy Gradient是通过计算每一个token出现的概率来选择合适的token输出,因此更新的参数也只是token出现的概率,避免了梯度下降计算的误差出现的UNK现象。(NN:label=1,prediction_sequence = [0.2, 0.4, 0.5, 0.8, 0.9, 0.95, 1.0];PG:label=1,prediction_sequence = [0, 0, 1, 0, 1, 1, 1])

SeqGAN

  • Neural Network + GAN + Reinforcement learning = SeqGAN

SeqGAN

  • Consider the discriminator as reward function
  • Consider the output of discriminator as total reward
  • Update generator to increase discriminator to get maximum total reward
  • Generator is a neural network updated with reinforcement learning
  • GAN在自然语言处理上出现的问题:

问题一: 我们知道,GAN在自然语言处理方面仍无法得到让人满意的结果,其原因主要可分为三类:首先,GAN主要应用于连续的数据类型上,在离散数据例如文字方面的问题上并不适用。最初的GANs仅仅定义在实数领域上,通过判别器输出的误差反向传递给生成器,利用梯度下降的方式进行优化更新。然而在离散的数据范围内,由于结果是通过sampling的方式取得,因此每一个离散的点微分结果等于零,因此来自判别器的误差无法通过梯度下降的方式进行反向传递更新优化。

如果保留softmax之后的结果作为传入判别器的latent codes反向传递误差,则会让判别器学到许多“作弊”的手段,例如输入的vector的每一项是一个介于0和1之间的数,而最终的结果是只包含一个1其他全是0的one-hot vector,这样的误差会让判别器认为只要存在0和1之外的数,这个生成结果就不算完美,如此一来模型的训练就会陷入瓶颈。

针对上面的问题,通常的方式是采用Reinforcement learning的方式来取代传统的Gradient Descent Optimization。或者使用类似Gumbel-softmax等特助分布函数来取代传统的softmax作为Discriminator的输入。

问题二: GAN在利用RNN等序列化生成模型作为生成器的时候,也会面临因为MLE误差函数所带来的error累积问题。随着句子长度的增加,生成器的训练就容易出现exposure bias的问题,从而让判别器的结果飘忽不定,模型难以优化更新。

问题三: 在生成句子的同时,判别器对生成器产生的反馈是一个全局的作用,也就是说这个标准是针对句子中每一个词都有相同的作用力度。这样的方式会带来一些潜在的问题,迷惑生成模型的更新思路,从而难以判断序列生成过程中每一个步骤的优劣程度,对模型的更新产生影响。

针对这个问题,通常的解决办法是采用Mento-Carlo Search的方式对每一个subsequence进行单独深度扩展,从而评估每一个部分的reward值。

Chat-bot with GAN

GAN在聊天机器人的应用和Sentence Generation十分类似,都是应用序列化决策的方式决定句子的生成问题。其主要的注意点如下:

  • Genrator is composed of Encoder and Decoder
  • Using paired or unpaired data to train with conditional GAN
  • Reinforcement learning and attention mechanism are useful for obtaining reward and conmunicating context

Actor + Critic

Actor通过神经网络预测当下的输出行为,通过TD或MC的方式结合环境因素进行模拟,最后根据Learning Critic来判断行为的reward新型反向更新。

更多介绍

Inverse Reinforcement Learning

Inverse Reinforcement Learning的思想其实就是跟着大佬走不吃亏!

在训练过程中我们需要通过一些专家序列(Expert sequence)的行为新型模拟,然后制定相应的reward function,根据这个function一步步优化我们的模型。细节如下:

  • Define a principle
  • Initialize an actor
  • In each iteration
    • The actor interacts with the environment to obtain some trajectories
    • Define a reward function, which makes the trajectories of the teacher better than the actor
    • The actor learns to maximize the reward based on the new reward function
  • Output the reward funciton and the actor learned from the reward function

对比GAN和IRL

GAN网络和IRL在结构和功能上具有一定的相似性:

  • GAN通过discriminator的到的scalar来评估Generator的好坏,进而促使Generator以提高scalar为目标不断提升。
  • IRL的Expert相当于GAN中的Discriminator,Actor则相当于Generator。Reward function反馈给Expert一个较高的分数,而给予Actor一个较低的分数,促使Actor为了提高奖励就不断向Expert靠拢,一步步得到提升。

Reference

Generative Adversarial Network

Improving Generative Adversarial Network