深度学习训练一个模型需要很多的人工标注的数据。例如在图象识别里面,经常我们可能需要上百万的人工标注的数据,在语音识别里面,我们可能需要成千上万小时的人工标注的数据,机器翻译更是需要数千万的双语句对做训练。
看看标注数据的代价有多高。比如说对机器翻译而言,现在如果我们请人工来翻译,一个单词的费用差不多是5—10美分之间,一个句子平均长度差不多是30个单词,如果我们需要标注一千万个双语句对,也就是我们需要找专家翻译一千万句话,这个标注的费用差不多是2200万美元。

一、GAN在NLP中遇到瓶颈

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

.


二、稀疏编码自学习——SelfTaughtLearning

本文来源:译文 |
从未标记数据中迁移学习

原文:http://robotics.stanford.edu/~rajatr/papers/icml07_SelfTaughtLearning.pdf
有点类似先把图像向量化(边缘特征)之后进行聚类来寻找某一类别的内容,少量标记就可以获得更多的标记文件了。

我们发现许多从网上随机下载的图像也包含与大象和犀牛类似的基本视觉模式(如边缘)。利用无标记数据的方法来提高监督学习的效能。

半监督学习(Nigam et al.2000),本文算法也使用标记和未标记数据,但是和典型文献中的半监督学习方法不同,我们并不假设无标记数据能够分配到监督学习的类别标签。为了区别于这种半监督学习,我们称我们的任务为自学习。

自学习方法主要包括以下两个阶段:

  • 首先使用无标记数据来学习一种表达,然后将此种表达应用于标记的数据以及分类任务中。
  • 一旦在第一阶段学习到这种表达,它也可以重复应用于不同的分类任务。例如在上例中,一旦从互联网图片学习到这种表达,则不仅能够将其应用在大象和犀牛的图像中,也可以应用在其他图像分类任务。
    实验证明稀疏编码特征,或许与原始特征相结合,在大部分领域中都比只使用原始特征和PCA特征效果要好得多。

稀疏编码基向量从随机自然灰度图像块(14×14像素)学习得到。在方格里面的每个正方形表达一个基向量。

下面两个表格展示了不同应用领域上的实验结果。

.


三、对偶学习 Dual learning

来源于微软研究院AI头条:秦涛:深度学习的五个挑战和其解决方案 以及 对偶学习在行动:从文本到图像

对偶学习的思路和前面生成式对抗学习会非常不一样。对偶学习的提出是受到一个现象的启发:我们发现很多人工智能的任务在结构上有对偶属性。比如说在机器翻译里面,我们把中文翻译成英文,这是一个任务,但是我们同样也需要把英文翻译成中文,这是一个对偶的任务。这种原任务和对偶任务之间,他们的输入和输出正好是反着来的。在语音处理里面,语音识别是把语音转化成文字,语音合成是把文字转化成语音,也是互为对偶的两个任务。在图像理解里面,看图说话,也就是给一张图生成一句描述性的语句,它的对偶任务是给一句话生成一张图,这两个任务一个是从图像到文本,另外一个是从文本到图像。
在机器翻译里面做了一些实验,发现通过对偶学习的过程,我们只需要用10%标注的数据(大概100万英法双语句对),再加上很多没有标注的数据,达到用100%标注数据(1200万英法双语句对)训练的模型的准确度。

偶学习这个新范式去年掀起了一个小波澜,去年11月微软亚研院发的NIPS,原文链接:https://arxiv.org/pdf/1611.00179.pdf
但是慢慢沉寂了,方法的idea不错,但没有得到大规模推广。去年的是在文本翻译这块,图像去年的热门是GAN网络。好了,今天这文章把对偶学习渗透到了图像了。
看论文我喜欢把一些来龙去脉搞清楚。每一个idea都不是凭空而来的,追本溯源,我们看看去年秦涛博士他们文章的主要精髓。一句话说:一个英语句子A,首先用一个网络n1翻译成法语w,然后将翻译好法语w用另一个网络n2翻译成英语句子B。两个网络合在一起成为一个对偶网络。损失函数就是A与B之间的差值。文章说英语翻译成法语的精度可以匹敌neural machine translation (NMT)的精度。我想说,首先英语跟法语比较像,这个问题相对简单一些;其实我的担心是,这个loss不太好学,很有可能不收敛。文章说他们的学习方法是网络n1教网络n2,网络n2教网络n1,使用一种增强学习的方法。这个是可以的,但这个老师感觉是变化的哦。
今天的这篇文章名字是:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks。使用有回路的对抗网络来做未配对的图片-图片的翻译。首先来谈谈对抗网络。深度生成对抗网络是给一批图片,如猫的图片,一个网络学习这些图片用于生成猫,一个已有的判别网络,判断生成的猫是不是真。

我们一起来解开她的扣子。所有网络,不管多深,展开拉直了都是一个方程。方程G将X转变成Y,方程F将Y转变成X1。它搞了两个loss来训练两个网络,一个loss是x-F(G(x)),一个loss是y-G(F(y))。怎么样?其实就是对偶学习。
文章中讲了如何实现这样的网络的,并做了不少对比实验。
文章的源码地址:https://junyanz.github.io/CycleGAN/
对比网络CoGAN的源码:https://github.com/mingyuliutw/CoGAN
这些源码我还没来的及看。
最后这个方法的用处很广,可以将油画变成照片,可以将普通照片变成单反相机的大光圈一样的北京虚化,可以只改变图片中的物体,如把马变成斑马,可以进行季节变更。
看看作者到底干了什么事情。附上效果图:


延伸一:VAE for NLP

GANs在图像中作用比较强,但是在NLP不行,NLP里面VAE则是”霸主“,本节来源于paperweekly分享:PaperWeekly 第二十七期 | VAE for NLP

VAE 的核心:

1) 如上图所示,VAE 可以看做是 Standard autoencoder 的 regularized version(在 autoencoder 的架构上引入随机 latent variable)

2) VAE 从 data 学到的是在 latent space 的 region,而不是单个点。换句话说是 encode 学到了一个概率分布 q(z|x)

3) 引入 KL divergence 让后验 q(z|x)接近先验 p(z)。这里的 motivation 在于如果仅用 reconstruction loss,q(z|x)的 variances 还是会很小(又和原有的单个点差不多了)

VAE 详细推导这里就不展开,各种 tutorial 也非常多。只要掌握变分推断和理解 reparametrization trick 就基本 ok 了。

.

延伸二:用条件对抗式自动编码器进行人脸老化、退龄

该代码是对论文《用条件对抗式自动编码器进行人脸老化、退龄》中算法的Tensorflow实现
数据库

· FGNET
· MORPH
地址:https://ebill.uncw.edu/C20231_ustores/web/product_detail.jsp?PRODUCTID=8

· CACD
地址:http://bcsiriuschen.github.io/CARC/

· UTKFace (可以从Github 或维基百科获得)

准备训练数据

你可以使用任何带年龄标签和性别标签的数据库。在该demo中,我们使用了UTF人脸数据库,因为用这种标定并裁剪过的人脸照片更好一些。请保存并解压UTKFace.tar.gz到文件夹data下。

训练

$ python main.py

训练过程在NVIDIA TITAN X (12GB)上进行了测试。在UTK人脸数据库(23,708张图像,大小为128x128x3)上进行50次epoch的训练时间是两个半小时。

在训练过程中,会建立一个新文件夹save,包括四个子文件夹:summary, samples, test,和checkpoint

· samples :保存每个epoch之后重建的人脸。
· test :保存每个epoch之后的测试结果(基于输入人脸生成的不同年龄的人脸)。
· checkpoint :保存模型。
· summary :保存批损失和中间输出。

用以下命令来可视化summary:

cdsave/summary
tensorboard –logdir .

训练之后,可以检查文件夹samples和test来分别可视化重建和测试性能。下图展示了重建(左)和测试(右)的结果。重建结果(左)的第一行是测试样例,他们分别对应的测试结果(右)由上到下,按年龄增长顺序排列。

无监督学习︱GAN 在 NLP 中遇到瓶颈+稀疏编码自学习+对偶学习相关推荐

  1. 【采用】无监督学习在反欺诈中的应用

    一.反欺诈技术的发展历程 反欺诈技术的的发展经历了四个阶段,第一阶段黑名单.信誉库和设备指纹:第二阶段规则系统:第三阶段有监督的机器学习:第四阶段无监督的大数据欺诈检测.目前来说,前三种还是大家应用最 ...

  2. python中nlp的库_单词袋简介以及如何在Python for NLP中对其进行编码

    python中nlp的库 by Praveen Dubey 通过Praveen Dubey 单词词汇入门以及如何在Python中为NLP 编写代码的简介 (An introduction to Bag ...

  3. 机器学习中的无监督学习_无监督机器学习中聚类背后的直觉

    机器学习中的无监督学习 When it comes to analyzing & making sense of the data from the past and understandin ...

  4. 深度 | 一篇文章带你进入无监督学习:从基本概念到四种实现模型(附论文)

    作者:Eugenio Culurciello 机器之心编译 参与:李亚洲.武竞 微信公众号:(almosthuman2014)授权转载,禁止二次转载,点此为原文链接 这是今年 6 月份普渡大学副教授 ...

  5. 无监督学习:异常检测与剔除(局部异常因子法 SVM异常检测器)

    1.前言 前面介绍的都是有监督学习的回归和分类算法.有监督学习是指对输入和输出都有成对出现的训练样本{(xi,yi)}.在这里,主要介绍在没有输出信息时,只利用输入样本{xi}的信息进行无监督学习的方 ...

  6. 监督学习、半监督学习、无监督学习定义

    监督学习(supervised learning).半监督学习(Semi-supervised learning).无监督学习(unsupervised learning)是以训练样本中的标签进行区分 ...

  7. 无监督学习和监督学习的区别

    1.什么是无监督学习? 无监督学习是机器学习技术中的一类,用于发现数据 中的模式.利用 学习数据的分布或数据与数 据之间的关系被称作无监督学习. 2.无监督学习代表算法: 1.k-means算法(聚类 ...

  8. 无监督学习与监督学习的区别

          1.什么是无监督学习? 无监督学习是机器学习技术中的一类,用于发现数据 中的模式.利用 学习数据的分布或数据与数 据之间的关系被称作无监督学习. 2.无监督学习代表算法: 1.k-mean ...

  9. 无监督学习与监督学习_有监督与无监督学习

    无监督学习与监督学习 If we don't know what the objective of the machine learning algorithm is, we may fail to ...

最新文章

  1. C# HttpHelper帮助类,真正的Httprequest请求时无视编码,无视证书,无视Cookie,网页抓取...
  2. 22行代码AC_Prime Number Aizu - 0009(素数筛)(解题报告)
  3. python系列(三)python列表详解
  4. 理论基础 —— 二叉树 —— 三叉链表
  5. [设计模式-结构型]享元模式(Flyweight )
  6. 你见过哪些饭桌上不礼貌的行为?
  7. View的draw onDraw dispatchDraw顺序
  8. 为什么不能在scrollview中直接添加一个image,然后使animation.begin()??
  9. 数据库脏读,不可重复度,幻读以及对应的事务隔离级别
  10. 抽象类和接口到底是什么“垃圾“——教你分类
  11. 又是整数划分(poj1032)
  12. 从零开始学androidNotification通知.四十四.
  13. 翡翠手链的起源和发展历史
  14. Tensorflow与keras学习 (3)——循环神经网络RNN
  15. c语言查询学号(字符串),c语言短学期
  16. win10卸载更新的方法
  17. 一图读懂腾讯云SaaS连接生态专场
  18. 怎么关闭计算机139端口,如何关闭135、139、138、137、445端口的方法 关闭电脑端口教程...
  19. 谷歌PR值停止更新的影响
  20. java五子棋教程_java 简单五子棋

热门文章

  1. Golang教程:结构体
  2. 运维角度浅谈MySQL数据库优化
  3. 如何计算tomcat线程池大小?
  4. 关闭主窗口,启动另一个窗口
  5. 搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (三)实现数据库接口层和业务逻辑层(转)...
  6. 图解再谈ssh port forwarding-ssh隧道技术
  7. Android技巧:003使用Intent连接多个活动
  8. $(document).click() 在苹果手机上不能正常运行
  9. ASP.NET使用UpdatePanel实现AJAX
  10. php -- 取日期