干货 | 你的 KL 散度 vanish 了吗?
转自: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 了吗?相关推荐
- 相对熵与交叉熵_熵、KL散度、交叉熵
公众号关注 "ML_NLP"设为 "星标",重磅干货,第一时间送达! 机器学习算法与自然语言处理出品 @公众号原创专栏作者 思婕的便携席梦思 单位 | 哈工大S ...
- 一篇文章讲清楚交叉熵和KL散度
每天给你送来NLP技术干货! 转载自 | PaperWeekly 作者 | 康斯坦丁 研究方向 | 信号处理与人工智能 看了很多讲交叉熵的文章,感觉都是拾人牙慧,又不得要领.还是分享一下自己的理解,如 ...
- 交叉熵损失函数、修正Huber损失、极大似然估计、负对数似然、似然与交叉熵、KL散度
交叉熵损失函数.修正Huber损失.极大似然估计.负对数似然.似然与交叉熵.KL散度 目录
- K-L散度(相对熵)
K-L散度(相对熵) KL散度(Kullback–Leibler divergence,KLD)也被称为相对熵 它表示2个函数或概率分布的差异性:差异越大则相对熵越大,差异越小则相对熵越小,特别地,若 ...
- tf.keras.losses.KLDivergence KL散度 损失函数 示例
KL 散度 loss=正确值×log(正确值/预测值)loss = 正确值 \times log(正确值/预测值)loss=正确值×log(正确值/预测值) import tensorflow as ...
- 为什么交叉熵和KL散度在作为损失函数时是近似相等的
来源:DeepHub IMBA 本文约900字,建议阅读5分钟 在本文中,我们将介绍熵.交叉熵和 Kullback-Leibler Divergence [2] 的概念,并了解如何将它们近似为相等. ...
- 相对熵/KL散度(Kullback–Leibler divergence,KLD)
相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence),信息增益(in ...
- pytorch kl散度学习笔记
KL散度,也叫做相对熵,计算公式如下: import torch.nn as nn import torch import torch.nn.functional as F if __name__ = ...
- kl散度学习笔记python实现
KL Divergence KL( Kullback–Leibler) Divergence中文译作KL散度,从信息论角度来讲,这个指标就是信息增益(Information Gain)或相对熵(Rel ...
最新文章
- HTML5 Canvas translate与rotate应用
- win10系统配置apache 2.4的虚拟主机以及查看 apache的版本
- GB2312、GBK与UTF-8的区别
- 链式栈的初始化,判空,进栈,出栈,求长,求顶,打印,清空和销毁
- C语言——vs2010的使用 || C语言入门知识
- LTE轻松进阶之帧结构
- C指针原理(5)-ATT汇编
- 2018多校1 hdu6298 6300 6308
- linux内核 sin头文件,Linux内核中中断request_irq详解--中断共享问题解决
- 计算机专业配置笔记本,学计算机专业的买什么样配置和价格的笔记本好?
- 前端面试题:高效地随机选取数组中的元素
- dmx512如何帧同步_同步DMX512控制器的设计详解
- Office 2010安装时缺少MSXML 6.10.1129.0
- 爬取Google Play中app的用户评论(1)
- 在搭载 M1 及 M2 芯片 MacBook 设备上玩 Stable Diffusion 模型
- 网页上能否加一个旺旺的连接? 就和qq那样的。
- 对 Linux 初级、中级、高级用户非常有用的 60 个命令(转)
- ElasticSearch 聚合查询 JavaApi
- 性能监控与调优篇之【3. JVM 监控及诊断工具-GUI 篇】
- GOM传奇引擎提示登陆器密码和网关密码不相同