前言
我这几天才开始在qiita上发记事,不单止是为了分享实验成果,更重要的是通过语言为自己混乱的思维引入结构。这几天的记事大部分是关于VAE。第一次听说VAE已经是半年前在京都的时候,我为它的自动生成能力而折服,经过几个月的学习,我终于有能力用手边的工具搭建项目开展实验,而VAE的本质也逐渐在我的凝视下展示自身。
在探究研究方向的时候我就突发奇想,能不能像word2vec一样,对句子生成的embedding进行向量操作呢? 可是5年前已经有人想过这个问题了,而成果便是这篇paper: Generating Sentences from a Continuous Space。第一作者隶属谷歌,同时也是指针网络的创造者。
VAE最大的特点是可以提供我们一个检视潜在空间=检视输入数据同构性的手段。所以我们先来看看论文展示的成果如下图:
我们可以看到两个句子间确实能产生平滑的迁移。这是非常震撼人心的。如论文所言,这意味着我们拥有了量化句子与句子之间同构性的工具。
word2vec在2012年的时候带给自然语言处理领域强烈的震撼,透过w2v的视角来看,句子VAE实际上可以理解成w2v在句子上的应用。因为两者的主题是一致的: 潜在空间操作。
BERT
句子VAE可以用来填补句子中缺失的词语,这一下子就让我想起了BERT。BERT现在如日中天,它的训练方式正是填补句子的缺失词语。
BERT可以被用作句子VAE的encoder吗?我认为答案是可以,但是很难。我们可以用CLS token的输出作为句子在潜在空间的向量,然后解码——这正是困难所在,我唯一能想到的方法是用RNN一个字符一个字符地输出,直到完成整个句子。为什么我们不以单词为单位输出呢?因为BERT不是static embedding,单词在BERT里没有固定的向量表示。那么我们能借用类似word2vec的static embedding来训练吗?答案是可以。可是,无论是一个字符一个字符地输出,还是借用w2v的词汇表输出,都显得非常tricky,因为输出的结果跟bert完全无关。
BERT能够将句子编码到潜在空间,可是却丧失了解码的能力。这是抛弃static embedding的一个后果,是值得我们反思的。
QA上的应用
其实我重燃对VAE的兴趣的原因是,之前和一个同样研究NLP的网友聊研究方向,他做的是QA,想要用VAE产生的潜在空间来自动生成更加丰富的答案。
这里我看到的是一个VAE的变种应用,甚至可以说它们已经不再是AE,因为香草AE的目标首先是重建输入,而在问答上的应用,输入是问题,输出是回答。在这样的对比的张力下,我再次发现了AE的一个特点,那就是假定输入和输出存在唯一的对应关系。这个假设在图像重建上很好理解,输入和输出确实是一一对应的,而在QA的应用上则显得比较强硬——一个问题只能对应到一个固定的回答吗?要记住我们不是在做选择题。虽然VAE引入的随机数让输出的回答变得宽泛了,但是本质上我们的训练还是基于同样的假设。
不过,也许这只是受限于数据库——我们没有同个问题对应多个回答的数据库。但是训练的结果真的能那么称心如意吗?VAE的另一个假设是,原始输入里包含有一种未加区分的联系。两个差不多的问题,可以导致潜在空间邻近的两个点,解码的时候,两者的答案可能会产生混淆。但是由于问题差不多,所以答案混淆倒也是情理之中。
思考的结果是,这确实是一个值得研究的课题。
highway network
据说encoder和decoder之间要用高速公路网络连接,但是我没有这方面的知识,所以仅作参考。
作为总结
经过以上思考,我发现潜在空间确实是一个十分吸引人的主题,我们甚至能称之为自然语言的新大陆。
然后,我最近也在思考static embedding相关的问题,显然本质的吸引力还是源于潜在空间。最后,我们多了一个投身于BERT之前加以犹豫的理由。