提及 Generative Models,Variational Autoencoder (VAE) 和 GAN 可以说是两座大山头。二十四期的「」一文中对 GAN 在 NLP 中的进展做了详细的介绍,推荐错过的朋友不要再错过。虽然 GAN 在图像生成上效果显著(当然 VAE 也很强),但在 NLP 方面暂时还是 VAE 较为 work。今天的分享作为姊妹篇(捂脸),对 VAE 在 NLP 的应用里最具有代表性的几篇 paper 进行介绍。我会尽量梳理论文之间的联系,希望对大家有所帮助。本期涉及的论文有: 《Generating Sentences From a Continuous Spaces》. ICLR 2016 《Neural Variational Inference for Text Processing》. ICML 2016 《Language as a Latent Variable: Discrete Generative Models for Sentence Compression》. EMNLP 2016 《A Hierarchical Latent Variable Encoder-Decoder Model for Generating Dialogues》. AAAI 2017 其他
在展开之前,我先带大家简单回顾一下 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 了。 下面进入正题。 — 01 — Generating Sentences From a Continuous Spaces 论文链接: https://aclweb.org/anthology/K/K16/K16-1002.pdf 这篇文章对后面很多 paper 影响很大而且我也很喜欢,所以重点介绍一下。paper 最早发表在 ICLR 2016 上,motivation 在于作者为了弥补传统的 RNNLM 结构缺少的一些 global feature(其实可以理解为想要 sentence representation)。其实抛开 generative model,之前也有一些比较成功的 non-generative 的方法,比如 sequence autoencoders[1],skip-thought[2]和 paragraph vector[3]。但随着 VAE 的加入,generative model 也开始在文本上有更多的可能性。
Loss 的组成还是和 VAE 一样。具体模型上,encoder 和 decoder 都采用单层的 LSTM,decoder 可以看做是特殊的 RNNLM,其 initial state 是这个 hidden code z(latent variable),z 采样自 Gaussian 分布 G,G 的参数由 encoder 后面加的一层 linear layer 得到。这里的 z 就是作者想要的 global latent sentence representation,被赋予了先验 diagonal Gaussians,同时 G 就是学到的后验。 模型很简单,但实际训练时有一个很严重的问题:KL 会迅速降到 0,后验失效了。原因在于,由于 RNN-based 的 decoder 有着非常强的 modeling power,直接导致即使依赖很少的 history 信息也可以让 reconstruction errors 降得很低,换句话说,decoder 不依赖 encoder 提供的这个 z 了,模型等同于退化成 RNNLM(摊手)。顺便一提,本文最后有一篇 paper 也是为了解决这个问题。 先看这篇 paper 提出的解决方法:KL cost annealing 和 Word dropout。 1) KL cost annealing 作者引入一个权重 w 来控制这个 KL 项,并让 w 从 0 开始随着训练逐渐慢慢增大。作者的意思是一开始让模型学会 encode 更多信息到 z 里,然后随着 w 增大再 smooth encodings。其实从工程/代码的角度看,因为 KL 这项更容易降低,模型会优先去优化 KL,j2直播,于是 KL 很快就降成 0。但如果我们乘以一开始很小的 w,模型就会选择忽视 KL(这项整体很小不用降低了),选择优先去降低 reconstruction errors。当 w 慢慢增大,模型也慢慢开始关注降低 KL 这项了。这个技巧在调参中其实也非常实用。 2) Word dropout
既然问题是 RNN-based 的 decoder 能力太强,那我们就来弱化它好了。具体方法是把 input 的词替换成 UNK(我可能是个假的 decoder),模型被迫只能去多多依赖z。当然保留多少 input 也需要尝试,我们把全都不保留的叫做 inputless decoder,实验表明,inputless VAE 比起 inputless RNN language model 不知道好到哪里去了。 (责任编辑:本港台直播) |