GAN
自从被提出以来,就广受大家的关注,尤其是在计算机视觉领域引起了很大的反响,但是这么好的理论是否可以成功地被应用到自然语言处理(NLP)任务呢?
Ian Goodfellow 博士
一年前,网友在 reddit 上提问道,生成式对抗网络 GAN 是否可以应用到自然语言处理上。GAN 理论的提出者,OpenAI 的科学家,深度学习理论奠基人之一 Yoshua Bengio 的得意门生 Ian Goodfellow 博士回答了这个问题:
GANs 目前并没有应用到自然语言处理(NLP)中,因为 GANs 仅仅定义在真值数据中,GANs 通过训练出的生成器来产生合成数据,然后在合成数据上运行判别器,判别器的输出梯度将会告诉你,如何通过略微改变合成数据而使其更加现实。
只有在数据连续的情况下,你才可以略微改变合成的数据,而如果数据是离散的,绝对不可以改变合成数据,一点都不可以。
例如,如果你输出了一张图片,其像素值是1.0,那么接下来你可以将这个值改为1.0001。如果你输出了一个单词“penguin”,那么接下来就不能将其改变为“penguin + .001”,因为没有“penguin +.001”这个单词。如果想改的话,你必须将“penguin”变为“ostrich”或其他。因为所有的自然语言处理(NLP)的基础都是离散值,如“单词”、“字母”或者“音节”,没有人真正知道怎样才能在 NLP 中应用 GANs。
一般而言,我们会想到采用增强学习算法,但是增强算法的运行效果并不十分理想。目前据我所知,还没有人真正的开始研究利用增强算法解决 NLP 问题。
我看到有人说, GANs 在递归神经网络(RNN)方面并不奏效。这是不对的。从理论上来看,GANs 和 RNN 的生成器或判别器之间,并没有什么矛盾。但是,对于这一点,目前并没有人严肃而又认真的测试过。因此,在实际应用中还是存在一定的困难的。
顺便说一下,VAEs 对可见的离散单元是有效的,但是对隐藏的离散单元却并不奏效(除非你在运用增强算法,比如 DARN 或者 NVIL)。而另一方面,GANs 对隐藏的离散单元奏效,对可见的离散单元却并不奏效(从理论上来讲,除非是运用增强算法)。因此,这两种方法可以说是各有利弊,相辅相成。
2016年的 NIPS GAN Workshop 中,来自杜克大学的 Zhang、Gan 和 Carin 发表了一篇题为 GeneratingText via Adversarial Training 的论文,尝试将 GAN 理论应用到了文本生成任务上,他们的工作非常有特色,具体可以总结为:
用到的判别器(Discriminator)是卷积神经网络(CNN),而不是递归神经网络(RNN),这可能是一个不错的选择,因为Tong Zhang 就曾经使用CNN 做文本分类任务,相比 RNN,CNN 更好训练一些,最终训练得到的判别器非常有效,与之相关的问题优化起来也相对容易些。
在生成器(generator)中用光滑近似(smoothapproximation)的思路来逼近 LSTM 的输出,但实际上,这种思想比较常见,并没有什么不同寻常的地方。
在鞍点优化问题上,采用的是纯矩匹配(moment matching)作为优化准则。早期的生成式对抗网络(GANs)都是用逐点判别损失(pointwise discrimination loss)作为优化目标的,而最近的工作都是用类矩匹配的思路来加强优化目标,这里的优化是用矩匹配来做。
本文的初始化非常有意思,特别是在判别器的预训练方面,利用原始的句子和该句子中交换两个词的位置后得到的新句子进行判别训练。(在初始化的过程中,运用逐点分类损失函数对判别器进行优化)。这非常有意思,因为将两个单词互换位置,输入的数据信息实际上是基本相同的。比如,大多数卷积计算最终会得出完全相同的值。
更新生成器的频率遥远高于判别器,这与大家之前的设想正好相反。或许这是因为,相比 LSTM 来说, CNN 的问题优化要容易的多。同时,这可能也和纯矩匹配损失的应用有关。
.
.
知乎大神的经验
知乎上大家对这个问题的看法有很多,下面列出两个比较有代表性的:
Xun Huang PhD Student in CS, Cornell
其实本来写了一大段后来还是删了…. 因为这个问题其实非常前沿,在知乎上要讲清楚的话感觉太难了。
所以还是就列一些 paper 吧:
SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient
GANS for Sequences of Discrete Elements with the Gumbel-softmax Distribution
Generating Text via Adversarial Training
以上 paper 是直接用 GAN 做 text generation 的,但是其实都暂时没有啥正经的实验结果。
Modeling documents with Generative Adversarial Networks
这个是用 GAN 生成一个 document 中词的分布(不是真正 generate document),然后希望 discriminator 能学到好的 feature without supervision。
Professor Forcing: A New Algorithm for Training Recurrent Networks
这个是用 discriminator 来 encourage 一个 RNN 在 training 和 testing 的时候 hidden state 的分布一致,借此解决 exposure bias 的问题(即 RNN 在 training 时接受 ground truth input,但 testing 时却接受自己之前的 output,这两个 setting不一致会导致 error accumulate)。
同时还有一系列 paper 用 reinforcement learning 来直接 optimize evaluation metric(例如BLEU),同时解决 exposure bias,这些 paper 其实和 GAN 有内在的联系(参考 Connecting Generative Adversarial Networks andActor-Critic Methods):
Sequence Level Training with Recurrent Neural Networks
An Actor-Critic Algorithm for Sequence Prediction
Optimization of image description metrics using policy gradient methods
最后个人不认为 discrete data space 是 GAN 在 NLP上难 work 的本质原因…这里不展开了。
王亭午 U of T ML group
补充几点,题主也许会好奇:为什么 Ian 在 reddit 上说 GAN 做不了是因为 word embedding 加减无意义就做不了呢?既然这样,我在 latentvector 上做加减不就行了吗?这个方法看上去可以,实际上很难 work。
使用 generative model 解决 language generation 最大的问题在于 latent space 存在非常多的 desert hole。在 training 的时候,text 的 latent vector 有聚拢的倾向( citation needed,感谢评论。评论里面也提到了desert hole 这个词并不是一个学术上的词汇。David Duvenaud 和我们聊这个问题的时候,用了这个说法,这里沿用,感觉还是满形象的哈哈)。
因此直接上 GAN model 存在一些问题。图中是[1] 里面的一个例子。在 latent space 遨游的时候,中间的句子不 make sense。
不过解决的方法也是有很多的。最简单的方法是用 VAE 而不是用 GAN。GAN 本身的训练方式是非常依赖连续空间的。在训练的时候,我们的目标就是连续空间上的 pixel 值。在这一点上,VAE 就没有这个假设。因此 VAE 是自然的选择。
实际上用的时候有很多 tricks,[1] 里面感觉就有很多工程上的东西来减少 desert hole 的问题。
另外一个方法是结合 policy gradient,把它做成一个 R L的问题。[2] 是一篇非常有意思的文章。通过把 word 选择由 softmax output 选择变成 policy 选择,作者巧妙的避开了 GAN 和 word embedding 不兼容的问题。当然实际上,结合 GAN 和 RL 需要更加多的思考和技巧。[2]不一定是最好的方法,但是无疑证明了GAN是可以用在 sentence generation 这个问题上的。
我之前也很关注 GAN 和 text 的结合,也可以算是利益相关吧。此外有另外一个工作[3] (出自我们组去年刚刚招来的青年才俊Prof. David Duvenaud),可能可以带来更加多的启示。
如果我们考虑化学物质的预测呢?假设我们知道化学式A,B,C并且知道他们的性质,我们能不能预测 A-B+C 的化学性质呢?我们能不能得到类似 queen-woman+man=king 的结果呢?
这个时候,使用 generative model 解决化学分子生成会遇见和 sentence generation 一样的问题。我们会发现,化学分子的 latentspace,一样存在 desert holes。推荐你看一下[3],我觉得它很有意思,能给我们考虑的问题带来许多思考 。
.
.
参考文献
[1] Generating Sentences froma Continuous Space.
Samuel R. Bowman, Luke Vilnis, Oriol Vinyals, Andrew M. Dai, Rafal Jozefowicz,Samy Bengio
https://arxiv.org/abs/1511.06349v4
[2] SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient.
Lantao Yu, Weinan Zhang, Jun Wang, Yong Yu
https://arxiv.org/abs/1609.05473v5
[3] Automatic chemical design using a data-driven continuous representation ofmolecules.
Rafael Gómez-Bombarelli, David Duvenaud, José Miguel Hernández-Lobato, JorgeAguilera-Iparraguirre, Timothy D. Hirzel, Ryan P. Adams, Alán Aspuru-Guzik
https://arxiv.org/abs/1610.02415v1
翻译自微信公众号AI100
原文链接:http://www.machinedlearnings.com/2017/01/generating-text-via-adversarial-training.html
GAN︱GAN 在 NLP 中的尝试、困境、经验的更多相关文章
-
2. AutoEncoder在NLP中的应用
1. AutoEncoder介绍 2. Applications of AutoEncoder in NLP 3. Recursive Autoencoder(递归自动编码器) 4. Stacked ...
-
NLP中的预训练语言模型(五)—— ELECTRA
这是一篇还在双盲审的论文,不过看了之后感觉作者真的是很有创新能力,ELECTRA可以看作是开辟了一条新的预训练的道路,模型不但提高了计算效率,加快模型的收敛速度,而且在参数很小也表现的非常好. 论文: ...
-
图解BERT(NLP中的迁移学习)
目录 一.例子:句子分类 二.模型架构 模型的输入 模型的输出 三.与卷积网络并行 四.嵌入表示的新时代 回顾一下词嵌入 ELMo: 语境的重要性 五.ULM-FiT:搞懂NLP中的迁移学习 六.Tr ...
-
从0到1,了解NLP中的文本相似度
本文由云+社区发表 作者:netkiddy 导语 AI在2018年应该是互联网界最火的名词,没有之一.时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章.但是, ...
-
[转] 理解NLP中的卷积&;&;Pooling
转自:http://blog.csdn.net/malefactor/article/details/51078135 CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见的深度学习模型.图1展示了 ...
-
转:使用RNN解决NLP中序列标注问题的通用优化思路
http://blog.csdn.net/malefactor/article/details/50725480 /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author ...
-
[NLP/Attention]关于attention机制在nlp中的应用总结
原文链接: https://blog.csdn.net/qq_41058526/article/details/80578932 attention 总结 参考:注意力机制(Attention Mec ...
-
在NLP中深度学习模型何时需要树形结构?
在NLP中深度学习模型何时需要树形结构? 前段时间阅读了Jiwei Li等人[1]在EMNLP2015上发表的论文<When Are Tree Structures Necessary for ...
-
理解NLP中的卷积神经网络(CNN)
此篇文章是Denny Britz关于CNN在NLP中应用的理解,他本人也曾在Google Brain项目中参与多项关于NLP的项目. · 翻译不周到的地方请大家见谅. 阅读完本文大概需要7分钟左右的时 ...
随机推荐
-
JavaScript中的eval()函数
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作. eval(“1+2” ...
-
[PHP] 实现路由映射到指定控制器
自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本 SimpleLoader.php <?php class SimpleLoader{ public static func ...
-
ASP.NET MVC5 插件化机制简单实现
一.前言 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具体 ...
-
PHP Slim 框架初体验之无法访问控制器
话不多说,先把报错贴出来: 刚开始用slim框架,在设置完自动加载文件和路由文件之后,我写了一个控制器: <?php use \Psr\Http\Message\ServerRequestInt ...
-
Learning JavaScript Design Patterns The Observer Pattern
The Observer Pattern The Observer is a design pattern where an object (known as a subject) maintains ...
-
JavaScript模块化开发库之SeaJS
SeaJS是一个很好的前端模块化开发库,源码不到1500行,压缩后才4k,质量极高.
-
[转] Node.js 服务端实践之 GraphQL 初探
https://medium.com/the-graphqlhub/your-first-graphql-server-3c766ab4f0a2#.n88wyan4e 0.问题来了 DT 时代,各种业 ...
-
Python中的元祖Tuple
Python中的元祖和list基本上一样 tuple = () # 表示一个空的元祖 tuple = (50, ) # 元组中只有一个元素的时候,必须在后面加上逗号 无关闭分隔符 任意无符号的对象,以 ...
-
一个仿3D的平面游戏页面
package com.totoo.TouhouMassLight;import android.os.Bundle;import android.view.MotionEvent;import an ...
-
requestAnimFrame 动画的使用方法
//requestAnimFrame 封装,可以兼容所有浏览器 window.requestAnimFrame = (function(){ return window.requestAnimatio ...