转自:https://www.sohu.com/a/216987798_297288

最近(其实是去年)和大家分享过 Variational Autoencoder (VAE) 在对话生成(文本生成)上的一些应用(点击查看)。由于生成模型的新颖性和效果都能让人眼前一亮,所以越来越多的学者都对其进行了探索与尝试。然而当 VAE 和强如RNN/PixelCNN 这样的autoregressive models 在一起训练时,会出现糟糕的 “KL-vanishing problem”,或者说是 “posterior collapse”。那我们今天深入一下这个问题,希望能在对大家有所帮助的同时呢顺便夹带一下私货(捂脸)。今天会涉及的论文有:

1.《Generating sentences from a continuous space》. CONLL 2016.

2. 《Improving variational inference with inverse autoregressive flow》. NIPS 2016.

3. 《Variational lossy autoencoder》. ICLR 2017.

4. 《Improving Variational Encoder-Decoders in Dialogue Generation》. AAAI 2018.

5. 《Z-Forcing: Training Stochastic Recurrent Networks》. NIPS 2017.

6. 《Improved Variational Autoencoders for Text Modeling using Dilated Convolutions》. ICML 2017.

7. 《Learning discourse-level diversity for neural dialog models using conditional variational autoencoders》. ACL 2017.

8. 《Data noising as smoothing inneural network language models》. ICLR 2017.

我们先来看看导致 KL-vanishing 的原因是什么?回到VAE 的 ELBO objective

包含reconstruction loss 和KL loss 两部分。我们的目标是最大化 ELBO,等价于最小化 KL 项并最大化 reconstruction 项。先看 KL 项,如果简单的将data x 和latent variable z 无关并让 q(z|x) = q(z) = p(z),即posterior 退化为和 prior 一样的高斯,KL 就可以取得最小值0。再看 reconstruction 部分,当扮演 p(x|z) 角色的decoder 足够强大,仅凭自己就可以 model q(x)分布,那么也没有必要去依赖 z。

以上两个原因导致了 KL-vanishing。因此,我们也可以有两大角度去解决这个问题。第一,对于 KL,我们需要为latent variable 寻找更为flexible 的 prior 和posterior,不仅仅是因为优化 mean- field Gaussian distribution的 KL 显得过于容易,而且真实情况下的 posterior 也不可能只是个 Gaussian distribution。第二,对于 reconstruction 项,我们需要一个不那么强大的decoder,让 decoder 也去依赖 z,不要一个人把事情做了。

那我们来把试图解决这个问题的方法按照上述的两个角度做个分类:

第一大类:从 KL 出发

1、KL cost annealing

KL cost annealing 在使用上非常简单,只需要在 KL 项上乘以一个权重系数,训练刚开始的时候系数大小为0,给 q(z|x) 多一点时间学会把 x 的信息 encode 到 z 里,再随着训练 step 的增加逐渐系数增大到 1。通常搭配 word drop-out(下面有介绍)一起使用效果最佳。

代表作:《Generating sentences from a continuous space》. CONLL 2016.

优点:代码改动很小

缺点:需要针对不同数据集调整增大的速度。推荐作为 baseline。

2、Free Bits

Free Bits 的想法也非常简单,为了能让更多的信息被 encode 到latent variable 里,我们让KL 项的每一维都“保留一点空间”。具体来说,如果这一维的 KL 值太小,我们就不去碰它,等到它增大超过一个阈值再优化。由此可得损失函数是:

当然,我们也可以在整个KL 上控制而不用细分到每一维度,但是这可能会导致只有很少的维度在起作用,z 的绝大部分维度并没有包含 x 的信息。

代表作:《Improving variationalinference with inverse autoregressive flow》. NIPS 2016.

优点:Free Bits的方法操作简单

缺点:阈值 ε 也是要不断尝试的,我个人建议选取比如5左右的一个相对较小值。

3、Normalizing flow

Normalizing flow 的思想有很多变种,包括 Autoregressive Flow、Inverse Autoregressive Flow 等等。核心思想是我们先从一个简单分布采样 latent variable,接着通过不断迭代可逆的转换让 latent variable 更为flexible。这类方法大多是为了得到一个更好的 posterior,毕竟直接用 Gaussian 建模现实问题是不够准确的。但是方法复杂度较高,一个可行的替代方案是我们可以用 adversarial learning 的思想来学习 posterior,这里不多做展开。这个方法还没有在NLP 上实践过,也许可以发paper(大雾)。

代表作:《Variational lossy autoencoder》. ICLR 2017.

优点:不再局限于高斯分布

缺点:方法复杂度较高

4、Auxiliary Autoencoder

这个方法我们在对话生成上率先提出并进行了尝试,对于 VAE+RNN 的组合来说,RNN 和 VAE 各自的损失函数在训练初期其实会互相干扰,导致 posterior 学不好。同时,在用VAE(Conditional VAE,CVAE)建模对话时,posterior 得到的 z 是否能蕴含 response 的信息其实并不能保证。因此我们显式地利用 z 对 response 的 hidden 层做Autoencoder,并且将 VAE 和AE 两部分分开训练,保证更容易收敛。

如果只是应用在文本生成上就更为简单了,损失函数如下:

看上去只需要在decode 之前加一层 hidden 层,并在损失函数里加上对 hidden 层的autoencoder loss,但是却可以显著避免KL-vanishing 的问题,同时保证了最优值和原公式保持一致。近期我们会一起放出论文和代码。

代表作:《Improving Variational Encoder-Decoders in Dialogue Generation》. AAAI 2018.

《Z-Forcing: Training Stochastic Recurrent Networks》. NIPS 2017.

第二大类:从 reconstruction 项出发

5、Word drop-out

Word drop-out 是典型的弱化 decoder 的方法。在训练阶段,我们将decoder 的部分输入词替换为UNK,也就是说 RNN 无法仅依靠前面的生成的词来预测下一个词了,因此需要去多依赖 z。非常有趣的一点在于,这种弱化decoder 方法还带来了性能上的提升,在 ICLR 的《Data noising as smoothing inneural network language models》文中将 Word drop-out 证明为神经网络的平滑技术,因此大家可以放心使用。

代表作:《Generating sentences from a continuous space》. CONLL 2016.

6、CNN decoder

既然RNN 有问题,那不妨把目光放到 CNN 上。如果只用传统的CNN 可能 contextual capacity 较差,因此可以使用 Dilated CNN decoder,通过调整 CNN 的宽度,从最弱的 Bag-of-words model 到最强的LSTM ,Dilated CNN decoder 都可以无限逼近,因此不断尝试总可以找到最合适的,方法效果也非常的好。

代表作:《Improved Variational Autoencoders for Text Modeling using Dilated Convolutions》. ICML 2017.

7、Additional Loss

通过引入额外的 loss,例如让 z 额外去预测哪些单词会出现,因此也被称为 bag-of-words loss。之所以将其归类为第二类,因为这个方法可以看做是增大了 reconstruction 的权重,让 model 更多去关注优化reconstruction 项而不是KL。这个方法也可以非常有效避免 KL-vanishing。

代表作:《Learning discourse-level diversity for neural dialog models using conditional variational autoencoders》.ACL 2017.

以上就是今天全部的内容,如果还想了解更多,可以查看相关文章:

干货 | 你的 KL 散度 vanish 了吗?相关推荐

  1. 相对熵与交叉熵_熵、KL散度、交叉熵

    公众号关注 "ML_NLP"设为 "星标",重磅干货,第一时间送达! 机器学习算法与自然语言处理出品 @公众号原创专栏作者 思婕的便携席梦思 单位 | 哈工大S ...

  2. 一篇文章讲清楚交叉熵和KL散度

    每天给你送来NLP技术干货! 转载自 | PaperWeekly 作者 | 康斯坦丁 研究方向 | 信号处理与人工智能 看了很多讲交叉熵的文章,感觉都是拾人牙慧,又不得要领.还是分享一下自己的理解,如 ...

  3. 交叉熵损失函数、修正Huber损失、极大似然估计、负对数似然、似然与交叉熵、KL散度

    交叉熵损失函数.修正Huber损失.极大似然估计.负对数似然.似然与交叉熵.KL散度 目录

  4. K-L散度(相对熵)

    K-L散度(相对熵) KL散度(Kullback–Leibler divergence,KLD)也被称为相对熵 它表示2个函数或概率分布的差异性:差异越大则相对熵越大,差异越小则相对熵越小,特别地,若 ...

  5. tf.keras.losses.KLDivergence KL散度 损失函数 示例

    KL 散度 loss=正确值×log(正确值/预测值)loss = 正确值 \times log(正确值/预测值)loss=正确值×log(正确值/预测值) import tensorflow as ...

  6. 为什么交叉熵和KL散度在作为损失函数时是近似相等的

    来源:DeepHub IMBA 本文约900字,建议阅读5分钟 在本文中,我们将介绍熵.交叉熵和 Kullback-Leibler Divergence [2] 的概念,并了解如何将它们近似为相等. ...

  7. 相对熵/KL散度(Kullback–Leibler divergence,KLD)

    相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence),信息增益(in ...

  8. pytorch kl散度学习笔记

    KL散度,也叫做相对熵,计算公式如下: import torch.nn as nn import torch import torch.nn.functional as F if __name__ = ...

  9. kl散度学习笔记python实现

    KL Divergence KL( Kullback–Leibler) Divergence中文译作KL散度,从信息论角度来讲,这个指标就是信息增益(Information Gain)或相对熵(Rel ...

最新文章

  1. HTML5 Canvas translate与rotate应用
  2. win10系统配置apache 2.4的虚拟主机以及查看 apache的版本
  3. GB2312、GBK与UTF-8的区别
  4. 链式栈的初始化,判空,进栈,出栈,求长,求顶,打印,清空和销毁
  5. C语言——vs2010的使用 || C语言入门知识
  6. LTE轻松进阶之帧结构
  7. C指针原理(5)-ATT汇编
  8. 2018多校1 hdu6298 6300 6308
  9. linux内核 sin头文件,Linux内核中中断request_irq详解--中断共享问题解决
  10. 计算机专业配置笔记本,学计算机专业的买什么样配置和价格的笔记本好?
  11. 前端面试题:高效地随机选取数组中的元素
  12. dmx512如何帧同步_同步DMX512控制器的设计详解
  13. Office 2010安装时缺少MSXML 6.10.1129.0
  14. 爬取Google Play中app的用户评论(1)
  15. 在搭载 M1 及 M2 芯片 MacBook 设备上玩 Stable Diffusion 模型
  16. 网页上能否加一个旺旺的连接? 就和qq那样的。
  17. 对 Linux 初级、中级、高级用户非常有用的 60 个命令(转)
  18. ElasticSearch 聚合查询 JavaApi
  19. 性能监控与调优篇之【3. JVM 监控及诊断工具-GUI 篇】
  20. GOM传奇引擎提示登陆器密码和网关密码不相同

热门文章

  1. homebrew是个啥
  2. 计算机入会大会新生发言稿,新生大会发言稿(精选7篇)
  3. 监测数据报表系统使用和安装说明
  4. Xunsearch迅搜项目实战经验
  5. 这个传奇大佬,自杀了!
  6. Java个人对接口的理解
  7. Python 网络编程(6)总结【转】
  8. 计算机科学与技术优劣,计算机科学与技术专业优势多多
  9. Hi3516EV200图像调优
  10. WOL 实现命令。(Wake On LAN - 局域网唤醒)