UniVAE:基于Transformer的单模型、多尺度的VAE模型
©PaperWeekly 原创 · 作者 | 苏剑林
单位 | 追一科技
研究方向 | NLP、神经网络
本文介绍笔者构思的一个能用于文本的 UniVAE 模型,它沿用类似 UniLM 的思路,将 VAE 做到了一个 Transformer 模型里边,并且还具备多尺度特性。
UniAE
VAE(Variational Autoencoder)这里就不科普了,之前已经有多篇文章进行介绍,大家自行搜索就好。VAE 可以理解为带有正则项的 AE(Autoencoder),一般情况下,Encoder 负责将输入编码为一个向量,并且满足一定的分布,而 Decoder 则负责将编码向量重构为输入。所以很显然,要实现 UniVAE,首先要实现对应的 UniAE。
▲ UniLM式Attention Mask
多尺度
跟常规的 Seq2Seq 架构不同的地方在于,这里的 Encoder 和 Decoder 的权重是共享的。从上图还可以看出,如果我们每一层 Attention 都加上这种 Mask,那么 Decoder 将依赖于每一层输入的 [CLS] 向量,这也就意味如果有 L 层 Attention,那么这 L 层 Attention 的输入序列的所有 [CLS] 向量拼接起来,才是输入文本的完整的编码向量(当然,第一层可以去掉,因为第一层的 [CLS] 是其 Embedding 向量,对于每个输入来说它都是常向量),单独某一层的 [CLS] 向量,并不是完整编码向量。
对于 Decoder 来说,每一层Attention都有一个 [CLS] 向量传入,这其实就形成了一种多尺度结构。在 CV 中,最先进的生成模型基本上都是多尺度结构了,如StyleGAN [2]、Glow、NVAE 等,但是 NLP 中似乎还不多见。不难想象,在多尺度结构中,不同层次的输入对生成结果的调控程度也是不同的,越靠近输入层的变量,控制的部分越是“无伤大雅”,而越靠近输出层的变量,则控制着生成结果的关键信息。所以理想情况下,训练好一个多尺度模型后,我们可以通过编辑不同层级的输入变量,来实现对生成结果的不同层次的控制。
降低维度
解耦能力
前面的设计和讨论还只是针对普通的 AE 的,对于 VAE 来说,就是往 AE 的编码向量里边加入重参数操作,然后损失函数里边加入 KL 散度项,所以,设计好 UniAE 后,理论上就已经设计好 UniVAE 了。
不过,实际操作的时候,我们还有改进的空间。理论上来说,训练好 VAE 是具有一定的解耦(Disentanglement)能力的,也就是说,隐变量的每个维度是独立无关的,它们分别控制生成结果的某一方面,可以随机调节。不难理解,解耦是一件非常有挑战性的事情,所以如果 VAE 的 Encoder 能编码出解耦的编码向量,那么其拟合能力必然也是比较强的,换言之,其结构需要有一定的复杂了。
我们再来看 UniAE 的 Encoder,它的编码向量是每一层的 [CLS] 向量(或者对应的低维向量)的拼接,对于前面的层来说,它们的 [CLS] 向量仅仅是有限几层的 Transformer 的输出,它们的编码能力是很弱的,并不足以编码出解耦的向量,因此将它们作为 VAE 的隐变量是不合适的。
所以,在实际设计 UniVAE 的时候,我们不能使用 UniAE 的所有 [CLS] 向量作为编码向量,应该设置一个起始层数,Decoder 只使用大于这个层数的 [CLS] 向量,而小于等于这个层数的 [CLS] 向量则不使用,此时相对于使用下图右的 Attention Mask:
此时它等效于如下的 Encoder-Decoder 结构:
其他细节
首先是长度泄漏问题。不管是 UniLM 还是 UniVAE,因为 Encoder 和 Decoder 整合成了一个模型,所以我们都是将输入输出拼接起来作为单个样本训练的,这样的话每个样本在 Decoder 部分的起始位置就不一样了,取决于输入文本的长度,这就意味着输入长度是也是作为了输入条件传入到了 Decoder 中,这就是长度泄漏。
这个问题有两个解决方案:第一个就是所有输入都通过截断或者填充来变为同一长度,这就不会造成长度泄漏了;第二个就更简单了,干脆啥都不做,即确实把长度当成条件输入,解码时通过控制其实位置来控制生成长度,但这样可能带来的问题是长度信息可能没有跟编码向量完全解耦,因此同一编码向量配上不同的长度可能会得到不合理的结果。
然后是层数和维度的选择问题。前面说了,为了让隐变量具有较好的解耦能力,我们将前 k 层的 Attention 加上独立式 Attention Mask,剩下的 L-k 层则加上 UniAE 式 Attention Mask。那么这个 k 怎么选择呢?这是一个需要仔细调整的超参数,比较小的 k 能保留更多的信息,有利于重构,但不利于解耦;反之较大的 k 则更有利于解耦,但是不利于重构。在笔者的实验中,使用的是 k=8。
类似的问题出现在降维的维度选择上,较大的维度自然是有利于重构的,但也不利于解耦,反之则利于解耦而有损重构性能。这个参数需要根据任务本身的复杂度来具体调整,调整的大致方向是观察随机采样效果和重构效果,如果随机采样出来的样本多数可读、自然句子的重构效果也不错,那么说明这个维度适中了,否则则需要相应地调整。
最后,值得一提的是,UniAE 的设计不单单可以用来做 VAE,还可以用于构建 VQ-VAE [3] ,只需要对每个 [CLS] 向量做一下量化,就成为了一个将不定长句子编码为定长离散序列的 VQ-VAE 模型了。
参考实现
Github:https://github.com/bojone/univae
随机采样效果:
我在steam下载的游戏,怎样能在电脑上玩啊???
呼市男科医院哪家比较好实惠
我血压高,我妈妈手脚麻木,是怎么回事呀
怎样查询交通违章记录和处罚
为什么我提问的问题有点卡顿
小米2s用的是移动卡还是联通卡
幼儿园怎么发展幼儿教育
英国读研学校排名对于英国留学生来说重要吗
有专业的关于excel表格数据库的培训机构吗?
为什么一到晚上就容易咳嗽,不睡觉就不咳
原句:数字电视机顶盒坏了,可以免费维修吗
重构:数字电视机顶盒坏了可以换吗?
原句:青椒跟什么炒好吃
重构:青椒跟什么炒好吃
原句:王者荣耀carryyou什么意思
重构:王者荣耀carry芈月什么意思
原句:没感冒老是咳嗽要吃什么药好
重构:没感冒老是咳嗽要吃什么药好
原句:沁园(金科西城大院店)怎么样,好不好的默认点评
重构:沁园(金源店)怎么样,好不好的默认点评
原句:牙龈出血要吃什么药?
结果:牙龈出血还出血吃什么消炎药好
牙龈出血吃阿莫西林有效吗
牙龈出血是肝火旺吗?
牙龈出血去医院检查大概要多少钱?
牙龈出血去牙科看什么科室
牙龈出血去深圳哪里看牙科好
原句:广州和深圳哪个更好玩?
结果:广州和深圳哪个城市发展得好? 薪资高?
广州和深圳,哪个发达?深圳到广州的飞机票贵吗?
广州和深圳比哪个好
广州和深圳哪个人均gdp高
广州和深圳房价涨幅
广州和深圳自考一样吗
原句:牙龈出血要吃什么药?
结果:未来21年做什么生意好?
湿疹给身体有什么伤害?
朗逸现在要买什么配置?
马来西亚签证要多少钱?
早上给孩子吃什么水果好?
头晕发热去医院看什么科?
原句:广州和深圳哪个更好玩?
结果:99和98相差多少呢?
微信和支付宝怎么更换手机号
我的指甲和肉很不一样怎么回事?
吃了甲硝唑多久才能喝酒?
桂圆和红枣可以一起泡茶吗?
小米和华为哪个更好点?
可以看到,随机采样和重构的效果都不错的,而通过随机替换不同维度的隐变量,我们可以大致观察到多尺度结构的效果:替换前面部分维度的隐变量,大致上保持了主题词不变;替换后面部分维度的隐变量,大致上保持了句式不变。当然,自然语言的结构性本身就很弱,因此例子中通常也夹杂了一些例外情况。
文章小结
参考文献
[1] https://arxiv.org/abs/1909.07606
[2] https://arxiv.org/abs/1812.04948
[3] https://kexue.fm/archives/6760
更多阅读
#投 稿 通 道#
让你的文字被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:hr@paperweekly.site
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧