生成式对抗网络GAN有哪些最新的发展,可以实际应用到哪些场景中



刚做完实验,来答一答自然语言处理方面GAN的应用。

直接把GAN应用到NLP领域(主要是生成序列),有两方面的问题:

1. GAN最开始是设计用于生成连续数据,但是自然语言处理中我们要用来生成离散tokens的序列。因为生成器(Generator,简称G)需要利用从判别器(Discriminator,简称D)得到的梯度进行训练,而G和D都需要完全可微,碰到有离散变量的时候就会有问题,只用BP不能为G提供训练的梯度。在GAN中我们通过对G的参数进行微小的改变,令其生成的数据更加“逼真”。若生成的数据是基于离散的tokens,D给出的信息很多时候都没有意义,因为和图像不同。图像是连续的,微小的改变可以在像素点上面反应出来,但是你对tokens做微小的改变,在对应的dictionary space里面可能根本就没有相应的tokens.

2.GAN只可以对已经生成的完整序列进行打分,而对一部分生成的序列,如何判断它现在生成的一部分的质量和之后生成整个序列的质量也是一个问题。

近几篇重要的工作:

1. 为了解决这两个问题,比较早的工作是上交的这篇发表在AAAI 2017的文章:SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient, 16年9月就放上了Arxiv上面了,而且也公布了源代码。

利用了强化学习的东西来解决以上问题。如图,针对第一个问题,首先是将D的输出作为Reward,然后用Policy Gradient Method来训练G。针对第二个问题,通过蒙特卡罗搜索,针对部分生成的序列,用一个Roll-Out Policy(也是一个LSTM)来Sampling完整的序列,再交给D打分,最后对得到的Reward求平均值。

<img src="https://pic2.zhimg.com/v2-4f2d3324ac0a945434860e3432e7c7d1_b.png" data-rawwidth="582" data-rawheight="371" class="origin_image zh-lightbox-thumb" width="582" data-original="https://pic2.zhimg.com/v2-4f2d3324ac0a945434860e3432e7c7d1_r.png">

完整算法如图:

<img src="https://pic1.zhimg.com/v2-6008ee3851e7609fe3ab5a4c4cb6394c_b.png" data-rawwidth="619" data-rawheight="582" class="origin_image zh-lightbox-thumb" width="619" data-original="https://pic1.zhimg.com/v2-6008ee3851e7609fe3ab5a4c4cb6394c_r.png">

原文链接:arxiv.org/pdf/1609.0547

Github链接:LantaoYu/SeqGAN


2. 第二篇是C.Manning组大神Li Jiwei的文章:Adversarial Learning for Neural Dialogue Generation,用GAN和强化学习来做对话系统,如果我没有记错,这篇paper是最早引用SeqGAN的,有同学还说这篇是最早将RL用到GAN上的,主要是Jiwei大神名气太大,一放上Arxiv就引起无数关注。

如图,文章也是用了Policy Gradient Method来对GAN进行训练,和SeqGAN的方法并没有很大的区别,主要是用在了Dialogue Generation这样困难的任务上面。还有两点就是:第一点是除了用蒙特卡罗搜索来解决部分生成序列的问题之外,因为MC Search比较耗费时间,还可以训练一个特殊的D去给部分生成的序列进行打分。但是从实验效果来看,MC Search的表现要更好一点。

第二点是在训练G的时候同时还用了Teacher-Forcing(MLE)的方法,这点和后面的MaliGAN有异曲同工之处。

为什么要这样做的原因是在对抗性训练的时候,G不会直接接触到真实的目标序列(gold-standard target sequence),当G生成了质量很差的序列的时候(生成质量很好的序列其实相当困难),而D又训练得很好,G就会通过得到的Reward知道自己生成的序列很糟糕,但却又不知道怎么令自己生成更好的序列, 这样就会导致训练崩溃。所以通过对抗性训练更新G的参数之后,还通过传统的MLE就是用真实的序列来更新G的参数。类似于有一个“老师”来纠正G训练过程中出现的偏差,类似于一个regularizer。

<img src="https://pic1.zhimg.com/v2-46fa3718cd1bd1504b57d7feb07a97f0_b.png" data-rawwidth="582" data-rawheight="467" class="origin_image zh-lightbox-thumb" width="582" data-original="https://pic1.zhimg.com/v2-46fa3718cd1bd1504b57d7feb07a97f0_r.png">

原文链接:arxiv.org/pdf/1701.0654

Github链接:jiweil/Neural-Dialogue-Generation


3. Yoshua Bengio组在二月底连续放了三篇和GAN有关的paper,其中我们最关心的是大神Tong Che和Li yanran的这篇:Maximum-Likelihood Augmented Discrete Generative Adversarial Networks(MaliGAN),简称读起来怪怪的。。。

这篇文章的工作主要是两个方面:

1.为G构造一个全新的目标函数,用到了Importance Sampling,将其与D的output结合起来,令训练过程更加稳定同时梯度的方差更低。尽管这个目标函数和RL的方法类似,但是相比之下更能狗降低estimator的方差(强烈建议看原文的3.2 Analysis,分析了当D最优以及D经过训练但并没有到最优两种情况下,这个新的目标函数仍然能发挥作用)

2.生成较长序列的时候需要用到多次random sampling,所以文章还提出了两个降低方差的技巧:第一个是蒙特卡罗树搜索,这个大家都比较熟悉; 第二个文章称之为Mixed MLE-Mali Training,就是从真实数据中进行抽样,若序列长度大于N,则固定住前N个词,然后基于前N个词去freely run G产生M个样本,一直run到序列结束。

基于前N个词生成后面的词的原因在于条件分布Pd比完整分布要简单,同时能够从真实的样本中得到较强的训练信号。然后逐渐减少N(在实验三中N=30, K=5, K为步长值,训练的时候每次迭代N-K)

<img src="https://pic3.zhimg.com/v2-423a1050fa9b5636e682d92dd7501136_b.png" data-rawwidth="153" data-rawheight="44" class="content_image" width="153">

Mixed MLE训练的MaliGAN完整算法如下:

<img src="https://pic1.zhimg.com/v2-9c2bcba753585641ce1507802ace64f8_b.png" data-rawwidth="604" data-rawheight="877" class="origin_image zh-lightbox-thumb" width="604" data-original="https://pic1.zhimg.com/v2-9c2bcba753585641ce1507802ace64f8_r.png">

在12,梯度更新的时候,第二项(highlight的部分)貌似应该是logP\theta(我最崇拜的学长发邮件去问过一作) 。至于第一部分为什么梯度是近似于这种形式,可以参考Bengio组的另一篇文章:Boundary-Seeking Generative Adversarial Networks

这个BGAN的Intuition就是:令G去学习如何生成在D决策边界的样本,所以才叫做boundary-seeking。作者有一个特别的技巧:如图,当D达到最优的时候,满足如下条件,Pdata是真实的分布,Pg是G生成的分布。

<img src="https://pic2.zhimg.com/v2-2642ebda15e8f1d2b29e497c40197bb9_b.png" data-rawwidth="394" data-rawheight="133" class="content_image" width="394">

我们对它进行一点微小的变换:这个形式厉害之处在于,尽管我们没有完美的G,但是仍然可以通过对Pg赋予权重来得到真实的分布,这个比例就是如图所示,基于该G的最优D和(1-D)之比。当然我们很难得到最优的D,但我们训练的D越接近最优D,bias越低。而训练D(标准二分类器)要比G简单得多,因为G的目标函数是一个会随着D变动而变动的目标。

<img src="https://pic2.zhimg.com/v2-49ee11359e258c14dfa4c0f787f2b589_b.png" data-rawwidth="361" data-rawheight="103" class="content_image" width="361">

文章后面给出了如何求梯度的数学公式,这里就不贴了。

回到MaliGAN,作者给出了实验数据,比SeqGAN的效果要更好,看BLEU score.

<img src="https://pic1.zhimg.com/v2-274b3811dc752bd302e50c8b30cc2594_b.png" data-rawwidth="570" data-rawheight="211" class="origin_image zh-lightbox-thumb" width="570" data-original="https://pic1.zhimg.com/v2-274b3811dc752bd302e50c8b30cc2594_r.png">

原文链接:arxiv.org/pdf/1702.0798


4. 用SeqGAN做机器翻译,中科院自动化所在三月中旬放出了这篇文章:Improving Neural Machine Translation with Conditional Sequence Generative Adversarial Nets,这篇文章主要的贡献就是第一次将GAN应用到了NLP的传统任务上面,而且BLEU有2的提升。

这个模型他们称之为CSGAN-NMT,G用的是传统的attention-based NMT模型,而D有两种方案,一种是CNN based,另一种是RNN based,通过实验比较发现CNN的效果更好。推测的原因是RNN的分类模型在训练早期能够有极高的分类准确率,导致总能识别出G生成的数据和真实的数据,G难以训练(因为总是negative signal),

这篇文章的重点我想是4.训练策略,GAN极难训练,他们首先是用MLE来pretrain G,然后再用G生成的样本和真实样本来pretrain D,当D达到某一个准确率的时候,进入对抗性训练的环节,GAN的部分基本和SeqGAN一样,用policy gradient method+MC search,上面已经讲过了不再重复。但是由于在对抗性训练的时候,G没有直接接触到golden target sentence,所以每用policy gradient更新一次G都跑一次professor forcing。这里我比较困惑,我觉得是不是像Jiwei那篇文章,是用D给出的Reward来更新G参数之后,又用MLE来更新一次G的参数(保证G能接触到真实的样本,这里就是目标语言的序列),但这个方法是teacher-forcing不是professor forcing。

最后就是训练Trick茫茫,这篇文章试了很多超参数,比如D要pretrain到f=0.82的时候效果最好,还有pretrain要用Adam,而对抗性训练要用RMSProp,同时还要和WGAN一样将每次更新D的权重固定在一个范围之内。

原文链接:arxiv.org/pdf/1703.0488


5.最后3月31号放到Arxiv上的文章:Improved Training of Wasserstein GANs, WGAN发布之后就引起轰动,比如Ian在Reddit上就点评了这篇文章,NYU的又祭出了这篇,令WGAN在NLP上也能发挥威力。

在WGAN中,他们给出的改进方案是:

  • 判别器最后一层去掉sigmoid
  • 生成器和判别器的loss不取log
  • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
  • 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

这里引用自知乎专栏:令人拍案叫绝的Wasserstein GAN - 知乎专栏

文章写得深入浅出,强烈推荐。

其中第三项就是机器翻译文章中也用到的weight clipping,在本文中,他们发现通过weight clipping来对D实施Lipschitz限制(为了逼近难以直接计算的Wasserstein距离),是导致训练不稳定,以及难以捕捉复杂概率分布的元凶。所以文章提出通过梯度惩罚来对Critic(也就是D,WGAN系列都将D称之为Critic)试试Lipschitz限制。

如图:损失函数有原来的部分+梯度惩罚,现在不需要weight clipping以及基于动量的优化算法都可以使用了,他们在这里就用了Adam。同时可以拿掉Batch Normalization。

<img src="https://pic4.zhimg.com/v2-f345da0e5c68b1a7a6f2273bb9d3c19b_b.png" data-rawwidth="643" data-rawheight="112" class="origin_image zh-lightbox-thumb" width="643" data-original="https://pic4.zhimg.com/v2-f345da0e5c68b1a7a6f2273bb9d3c19b_r.png">

如图所示,实验结果很惊人,这种WGAN—GP的结构,训练更加稳定,收敛更快,同时能够生成更高质量的样本,而且可以用于训练不同的GAN架构,甚至是101层的深度残差网络。

<img src="https://pic3.zhimg.com/v2-79721ebf87289ad49ffe8f3afd4c425e_b.png" data-rawwidth="702" data-rawheight="1062" class="origin_image zh-lightbox-thumb" width="702" data-original="https://pic3.zhimg.com/v2-79721ebf87289ad49ffe8f3afd4c425e_r.png">

同时也能用于NLP中的生成任务,而且是character-level 的language model,而MaliGAN的实验是在Sentence-Level上面的。而且前面几篇提到的文章2,3,4在对抗性训练的时候或多或少都用到了MLE,令G更够接触到Ground Truth,但是WGAN-GP是完全不需要MLE的部分。

<img src="https://pic3.zhimg.com/v2-59b2e1d2bf0701f02e9e847df1bb56da_b.png" data-rawwidth="749" data-rawheight="552" class="origin_image zh-lightbox-thumb" width="749" data-original="https://pic3.zhimg.com/v2-59b2e1d2bf0701f02e9e847df1bb56da_r.png">

原文链接:arxiv.org/pdf/1704.0002

github地址:github.com/igul222/impr

代码一起放出简直业界良心。

6.3月31号还谷歌还放出了一篇BEGAN: Boundary Equilibrium Generative

Adversarial Networks,同时代码也有了是carpedm20用pytorch写的,他复现的速度真心快。。。

最后GAN这一块进展很多,同时以上提到的几篇重要工作的一二作,貌似都在知乎上,对他们致以崇高的敬意。

以上。

Wasserstein GAN最新进展:从weight clipping到gradient penalty,更加先进的Lipschitz限制手法

前段时间,Wasserstein GAN以其精巧的理论分析、简单至极的算法实现、出色的实验效果,在GAN研究圈内掀起了一阵热潮(对WGAN不熟悉的读者,可以参考我之前写的介绍文章:令人拍案叫绝的Wasserstein GAN - 知乎专栏)。但是很多人(包括我们实验室的同学)到了上手跑实验的时候,却发现WGAN实际上没那么完美,反而存在着训练困难、收敛速度慢等问题。其实,WGAN的作者Martin Arjovsky不久后就在reddit上表示他也意识到了这个问题,认为关键在于原设计中Lipschitz限制的施加方式不对,并在新论文中提出了相应的改进方案:

首先回顾一下WGAN的关键部分——Lipschitz限制是什么。WGAN中,判别器D和生成器G的loss函数分别是:

L(D) = -\mathbb{E}_{x\sim P_r}[D(x)] + \mathbb{E}_{x\sim P_g}[D(x)] (公式1)

L(G) = - \mathbb{E}_{x\sim P_g}[D(x)] (公式2)

公式1表示判别器希望尽可能拉高真样本的分数,拉低假样本的分数,公式2表示生成器希望尽可能拉高假样本的分数。

Lipschitz限制则体现为,在整个样本空间 \mathcal{X} 上,要求判别器函数D(x)梯度的Lp-norm不大于一个有限的常数K:

|| \nabla _x D(x) ||_p \leq K \text{, } \forall x \in \mathcal{X} (公式3)

直观上解释,就是当输入的样本稍微变化后,判别器给出的分数不能发生太过剧烈的变化。在原来的论文中,这个限制具体是通过weight clipping的方式实现的:每当更新完一次判别器的参数之后,就检查判别器的所有参数的绝对值有没有超过一个阈值,比如0.01,有的话就把这些参数clip回 [-0.01, 0.01] 范围内。通过在训练过程中保证判别器的所有参数有界,就保证了判别器不能对两个略微不同的样本给出天差地别的分数值,从而间接实现了Lipschitz限制。

然而weight clipping的实现方式存在两个严重问题:

第一,如公式1所言,判别器loss希望尽可能拉大真假样本的分数差,然而weight clipping独立地限制每一个网络参数的取值范围,在这种情况下我们可以想象,最优的策略就是尽可能让所有参数走极端,要么取最大值(如0.01)要么取最小值(如-0.01)!为了验证这一点,作者统计了经过充分训练的判别器中所有网络参数的数值分布,发现真的集中在最大和最小两个极端上:


<img src="https://pic2.zhimg.com/v2-7a3aedf9fa60ce660bff9f03935d8f15_b.jpg" data-rawwidth="636" data-rawheight="541" class="origin_image zh-lightbox-thumb" width="636" data-original="https://pic2.zhimg.com/v2-7a3aedf9fa60ce660bff9f03935d8f15_r.jpg">

这样带来的结果就是,判别器会非常倾向于学习一个简单的映射函数(想想看,几乎所有参数都是正负0.01,都已经可以直接视为一个二值神经网络了,太简单了)。而作为一个深层神经网络来说,这实在是对自身强大拟合能力的巨大浪费!判别器没能充分利用自身的模型能力,经过它回传给生成器的梯度也会跟着变差。

在正式介绍gradient penalty之前,我们可以先看看在它的指导下,同样充分训练判别器之后,参数的数值分布就合理得多了,判别器也能够充分利用自身模型的拟合能力:


<img src="https://pic3.zhimg.com/v2-27afb895eea82f5392b19ca770865b96_b.jpg" data-rawwidth="1303" data-rawheight="543" class="origin_image zh-lightbox-thumb" width="1303" data-original="https://pic3.zhimg.com/v2-27afb895eea82f5392b19ca770865b96_r.jpg">

第二个问题,weight clipping会导致很容易一不小心就梯度消失或者梯度爆炸。原因是判别器是一个多层网络,如果我们把clipping threshold设得稍微小了一点,每经过一层网络,梯度就变小一点点,多层之后就会指数衰减;反之,如果设得稍微大了一点,每经过一层网络,梯度变大一点点,多层之后就会指数爆炸。只有设得不大不小,才能让生成器获得恰到好处的回传梯度,然而在实际应用中这个平衡区域可能很狭窄,就会给调参工作带来麻烦。相比之下,gradient penalty就可以让梯度在后向传播的过程中保持平稳。论文通过下图体现了这一点,其中横轴代表判别器从低到高第几层,纵轴代表梯度回传到这一层之后的尺度大小(注意纵轴是对数刻度),c是clipping threshold:


<img src="https://pic2.zhimg.com/v2-34114a10c56518d606c1b5dd77f64585_b.jpg" data-rawwidth="723" data-rawheight="546" class="origin_image zh-lightbox-thumb" width="723" data-original="https://pic2.zhimg.com/v2-34114a10c56518d606c1b5dd77f64585_r.jpg">

说了这么多,gradient penalty到底是什么?

前面提到,Lipschitz限制是要求判别器的梯度不超过K,那我们何不直接设置一个额外的loss项来体现这一点呢?比如说:

ReLU[ || \nabla_x D(x) ||_p - K ] (公式4)

不过,既然判别器希望尽可能拉大真假样本的分数差距,那自然是希望梯度越大越好,变化幅度越大越好,所以判别器在充分训练之后,其梯度norm其实就会是在K附近。知道了这一点,我们可以把上面的loss改成要求梯度norm离K越近越好,效果是类似的:

 [ || \nabla_x D(x) ||_p - K ]^2 (公式5)

究竟是公式4好还是公式5好,我看不出来,可能需要实验验证,反正论文作者选的是公式5。接着我们简单地把K定为1,再跟WGAN原来的判别器loss加权合并,就得到新的判别器loss:

L(D) = -\mathbb{E}_{x\sim P_r}[D(x)] + \mathbb{E}_{x\sim P_g}[D(x)] + \lambda \mathbb{E}_{x \sim \mathcal{X}} [ || \nabla_x D(x) ||_p - 1 ]^2 (公式6)

这就是所谓的gradient penalty了吗?还没完。公式6有两个问题,首先是loss函数中存在梯度项,那么优化这个loss岂不是要算梯度的梯度?一些读者可能对此存在疑惑,不过这属于实现上的问题,放到后面说。

其次,3个loss项都是期望的形式,落到实现上肯定得变成采样的形式。前面两个期望的采样我们都熟悉,第一个期望是从真样本集里面采,第二个期望是从生成器的噪声输入分布采样后,再由生成器映射到样本空间。可是第三个分布要求我们在整个样本空间 \mathcal{X} 上采样,这完全不科学!由于所谓的维度灾难问题,如果要通过采样的方式在图片或自然语言这样的高维样本空间中估计期望值,所需样本量是指数级的,实际上没法做到。

所以,论文作者就非常机智地提出,我们其实没必要在整个样本空间上施加Lipschitz限制,只要重点抓住生成样本集中区域、真实样本集中区域以及夹在它们中间的区域就行了。具体来说,我们先随机采一对真假样本,还有一个0-1的随机数:

x_r \sim P_r, x_g \sim P_g, \epsilon \sim Uniform[0, 1] (公式7)

然后在 x_rx_g 的连线上随机插值采样:

\hat x = \epsilon x_r + (1 - \epsilon) x_g (公式8)

把按照上述流程采样得到的 \hat x 所满足的分布记为 P_{\hat x} ,就得到最终版本的判别器loss:

L(D) = -\mathbb{E}_{x\sim P_r}[D(x)] + \mathbb{E}_{x\sim P_g}[D(x)] + \lambda \mathbb{E}_{x \sim \mathcal{P_{\hat x}}} [ || \nabla_x D(x) ||_p - 1 ]^2 (公式9)

这就是新论文所采用的gradient penalty方法,相应的新WGAN模型简称为WGAN-GP。我们可以做一个对比:

  • weight clipping是对样本空间全局生效,但因为是间接限制判别器的梯度norm,会导致一不小心就梯度消失或者梯度爆炸;
  • gradient penalty只对真假样本集中区域、及其中间的过渡地带生效,但因为是直接把判别器的梯度norm限制在1附近,所以梯度可控性非常强,容易调整到合适的尺度大小。

论文还讲了一些使用gradient penalty时需要注意的配套事项,这里只提一点:由于我们是对每个样本独立地施加梯度惩罚,所以判别器的模型架构中不能使用Batch Normalization,因为它会引入同个batch中不同样本的相互依赖关系。如果需要的话,可以选择其他normalization方法,如Layer Normalization、Weight Normalization和Instance Normalization,这些方法就不会引入样本之间的依赖。论文推荐的是Layer Normalization。

实验表明,gradient penalty能够显著提高训练速度,解决了原始WGAN收敛缓慢的问题:


<img src="https://pic4.zhimg.com/v2-5b01ef93f60a14e7fa10dbea2b620627_b.jpg" data-rawwidth="1255" data-rawheight="479" class="origin_image zh-lightbox-thumb" width="1255" data-original="https://pic4.zhimg.com/v2-5b01ef93f60a14e7fa10dbea2b620627_r.jpg">

虽然还是比不过DCGAN,但是因为WGAN不存在平衡判别器与生成器的问题,所以会比DCGAN更稳定,还是很有优势的。不过,作者凭什么能这么说?因为下面的实验体现出,在各种不同的网络架构下,其他GAN变种能不能训练好,可以说是一件相当看人品的事情,但是WGAN-GP全都能够训练好,尤其是最下面一行所对应的101层残差神经网络:


<img src="https://pic2.zhimg.com/v2-e0a3d86ccfa101a4d3fee1c0cef96a81_b.jpg" data-rawwidth="835" data-rawheight="1279" class="origin_image zh-lightbox-thumb" width="835" data-original="https://pic2.zhimg.com/v2-e0a3d86ccfa101a4d3fee1c0cef96a81_r.jpg">

剩下的实验结果中,比较厉害的是第一次成功做到了“纯粹的”的文本GAN训练!我们知道在图像上训练GAN是不需要额外的有监督信息的,但是之前就没有人能够像训练图像GAN一样训练好一个文本GAN,要么依赖于预训练一个语言模型,要么就是利用已有的有监督ground truth提供指导信息。而现在WGAN-GP终于在无需任何有监督信息的情况下,生成出下图所示的英文字符序列:


<img src="https://pic1.zhimg.com/v2-33c3af150f9bd52485b800948d3cb700_b.jpg" data-rawwidth="1056" data-rawheight="769" class="origin_image zh-lightbox-thumb" width="1056" data-original="https://pic1.zhimg.com/v2-33c3af150f9bd52485b800948d3cb700_r.jpg">

它是怎么做到的呢?我认为关键之处是对样本形式的更改。以前我们一般会把文本这样的离散序列样本表示为sequence of index,但是它把文本表示成sequence of probability vector。对于生成样本来说,我们可以取网络softmax层输出的词典概率分布向量,作为序列中每一个位置的内容;而对于真实样本来说,每个probability vector实际上就蜕化为我们熟悉的onehot vector。

但是如果按照传统GAN的思路来分析,这不是作死吗?一边是hard onehot vector,另一边是soft probability vector,判别器一下子就能够区分它们,生成器还怎么学习?没关系,对于WGAN来说,真假样本好不好区分并不是问题,WGAN只是拉近两个分布之间的Wasserstein距离,就算是一边是hard onehot另一边是soft probability也可以拉近,在训练过程中,概率向量中的有些项可能会慢慢变成0.8、0.9到接近1,整个向量也会接近onehot,最后我们要真正输出sequence of index形式的样本时,只需要对这些概率向量取argmax得到最大概率的index就行了。

新的样本表示形式+WGAN的分布拉近能力是一个“黄金组合”,但除此之外,还有其他因素帮助论文作者跑出上图的效果,包括:

  • 文本粒度为英文字符,而非英文单词,所以字典大小才二三十,大大减小了搜索空间
  • 文本长度也才32
  • 生成器用的不是常见的LSTM架构,而是多层反卷积网络,输入一个高斯噪声向量,直接一次性转换出所有32个字符

上面第三点非常有趣,因为它让我联想到前段时间挺火的语言学科幻电影《降临》:


<img src="https://pic4.zhimg.com/v2-be3b9c574b9c1b1ac05d0d462a04acd7_b.jpg" data-rawwidth="1280" data-rawheight="1998" class="origin_image zh-lightbox-thumb" width="1280" data-original="https://pic4.zhimg.com/v2-be3b9c574b9c1b1ac05d0d462a04acd7_r.jpg">

里面的外星人“七肢怪”所使用的语言跟人类不同,人类使用的是线性的、串行的语言,而“七肢怪”使用的是非线性的、并行的语言。“七肢怪”在跟主角交流的时候,都是一次性同时给出所有的语义单元的,所以说它们其实是一些多层反卷积网络进化出来的人工智能生命吗?


<img src="https://pic3.zhimg.com/v2-f45cc71a24451e1c8d650dba9001a406_b.png" data-rawwidth="2000" data-rawheight="838" class="origin_image zh-lightbox-thumb" width="2000" data-original="https://pic3.zhimg.com/v2-f45cc71a24451e1c8d650dba9001a406_r.png">
<img src="https://pic1.zhimg.com/v2-1ff948ae23ed8c19bfb4bedf6f466744_b.jpg" data-rawwidth="1622" data-rawheight="690" class="origin_image zh-lightbox-thumb" width="1622" data-original="https://pic1.zhimg.com/v2-1ff948ae23ed8c19bfb4bedf6f466744_r.jpg">

开完脑洞,我们回过头看,不得不承认这个实验的setup实在过于简化了,能否扩展到更加实际的复杂场景,也会是一个问题。但是不管怎样,生成出来的结果仍然是突破性的。

最后说回gradient penalty的实现问题。loss中本身包含梯度,优化loss就需要求梯度的梯度,这个功能并不是现在所有深度学习框架的标配功能,不过好在Tensorflow就有提供这个接口——tf.gradients。开头链接的GitHub源码中就是这么写的:

# interpolates就是随机插值采样得到的图像,gradients就是loss中的梯度惩罚项
gradients = tf.gradients(Discriminator(interpolates), [interpolates])[0]

对于我这样的PyTorch党就非常不幸了,高阶梯度的功能还在开发,感兴趣的PyTorch党可以订阅这个GitHub的pull request:Autograd refactor,如果它被merged了话就可以在最新版中使用高阶梯度的功能实现gradient penalty了。但是除了等待我们就没有别的办法了吗?其实可能是有的,我想到了一种近似方法来实现gradient penalty,只需要把微分换成差分:

L(D) = -\mathbb{E}_{x\sim P_r}[D(x)] + \mathbb{E}_{x\sim P_g}[D(x)] + \lambda \mathbb{E}_{x_1 \sim \mathcal{P_{\hat x}}, \ x_2 \sim \mathcal{P_{\hat x}}} [ \frac{|D(x_1) -D(x_2)|}{ || x_1 - x_2 ||_p } - 1]^2 (公式10)

也就是说,我们仍然是在分布 P_{\hat x} 上随机采样,但是一次采两个,然后要求它们的连线斜率要接近1,这样理论上也可以起到跟公式9一样的效果,我自己在MNIST+MLP上简单验证过有作用,PyTorch党甚至Tensorflow党都可以尝试用一下。

最近做了一个从传统GAN到improved WGAN的报告,把PPT贴上来吧,有需要的小伙伴可以参考一下。

论文主要涉及到17年的三篇文章:

Arjovsky M, Bottou L. Towards Principled Methods for Training Generative Adversarial Networks[J]. 2017.

Arjovsky M, Chintala S, Bottou L. Wasserstein GAN[J]. 2017.

Gulrajani I, Ahmed F, Arjovsky M, et al. Improved Training of Wasserstein GANs[J]. 2017.


<img src="https://pic1.zhimg.com/v2-616e3fbf3264b124e6bb9af31cf5c87c_b.png" data-rawwidth="1145" data-rawheight="645" class="origin_image zh-lightbox-thumb" width="1145" data-original="https://pic1.zhimg.com/v2-616e3fbf3264b124e6bb9af31cf5c87c_r.png">
<img src="https://pic2.zhimg.com/v2-af5591f7831ccd0b95c32b2c78aa9de5_b.png" data-rawwidth="1145" data-rawheight="640" class="origin_image zh-lightbox-thumb" width="1145" data-original="https://pic2.zhimg.com/v2-af5591f7831ccd0b95c32b2c78aa9de5_r.png">
<img src="https://pic1.zhimg.com/v2-2da6df559e9a62b01b18113cc758afd4_b.png" data-rawwidth="1146" data-rawheight="643" class="origin_image zh-lightbox-thumb" width="1146" data-original="https://pic1.zhimg.com/v2-2da6df559e9a62b01b18113cc758afd4_r.png">
<img src="https://pic1.zhimg.com/v2-649e4b17f0c9da69b13dff4498ad4ee8_b.png" data-rawwidth="1144" data-rawheight="640" class="origin_image zh-lightbox-thumb" width="1144" data-original="https://pic1.zhimg.com/v2-649e4b17f0c9da69b13dff4498ad4ee8_r.png">
<img src="https://pic1.zhimg.com/v2-e4586ca04f26fb91861bc45c6c226460_b.png" data-rawwidth="1144" data-rawheight="643" class="origin_image zh-lightbox-thumb" width="1144" data-original="https://pic1.zhimg.com/v2-e4586ca04f26fb91861bc45c6c226460_r.png">
<img src="https://pic2.zhimg.com/v2-29e96b3e4e1a28ca6cdecd8dd5669f65_b.png" data-rawwidth="1141" data-rawheight="640" class="origin_image zh-lightbox-thumb" width="1141" data-original="https://pic2.zhimg.com/v2-29e96b3e4e1a28ca6cdecd8dd5669f65_r.png">
<img src="https://pic3.zhimg.com/v2-55a01e38a2d8976e100b043739338dd2_b.png" data-rawwidth="1145" data-rawheight="640" class="origin_image zh-lightbox-thumb" width="1145" data-original="https://pic3.zhimg.com/v2-55a01e38a2d8976e100b043739338dd2_r.png">
<img src="https://pic1.zhimg.com/v2-3ecbf29640c387af9d0244ad3675ade0_b.png" data-rawwidth="1144" data-rawheight="642" class="origin_image zh-lightbox-thumb" width="1144" data-original="https://pic1.zhimg.com/v2-3ecbf29640c387af9d0244ad3675ade0_r.png">
<img src="https://pic1.zhimg.com/v2-46c9d1f110dd15f7f9d4129dd1e753d0_b.png" data-rawwidth="1141" data-rawheight="640" class="origin_image zh-lightbox-thumb" width="1141" data-original="https://pic1.zhimg.com/v2-46c9d1f110dd15f7f9d4129dd1e753d0_r.png">
<img src="https://pic4.zhimg.com/v2-59053b57a9c356136175e1238f3e9347_b.png" data-rawwidth="1146" data-rawheight="645" class="origin_image zh-lightbox-thumb" width="1146" data-original="https://pic4.zhimg.com/v2-59053b57a9c356136175e1238f3e9347_r.png">
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值