对话生成模型中的条件变分自编码器(CVAE)

废话不多说直接上模型:

这是一个非常经典的对话生成模型,叫做HRED(Hierarchical RNN Enconder-Decoder)。思路很简单,就是用一个RNN来建模前 j − 1 j-1 j1句话,再用一个RNN来建模第 j j j句话的 k − 1 k-1 k1个词,然后再用一个RNN来解码第 j j j句话的第 k k k个词。

HRED模型的训练:给定一个词的上文,最大化这个词出现的对数似然(极大似然估计)

即: a r g m a x ( l o g p θ ( w j , k ∣ w 1 , w 2 , . . . , w j − 1 , w j , 1 , w j , 2 , . . . , w j , k ) ) argmax(logp_\theta(w_{j,k}|w_{1}, w_{2}, ..., w_{j-1}, w_{j, 1}, w_{j, 2}, ..., w_{j,k})) argmax(logpθ(wj,kw1,w2,...,wj1,wj,1,wj,2,...,wj,k))

为了方便下文的推导,let w w w = w j , k w_{j,k} wj,k, c c c = w 1 , w 2 , . . . , w j − 1 , w j , 1 , w j , 2 , . . . , w j , k w_{1}, w_{2}, ..., w_{j-1}, w_{j, 1}, w_{j, 2}, ..., w_{j,k} w1,w2,...,wj1,wj,1,wj,2,...,wj,k

训练目标简写为: a r g m a x ( l o g p θ ( w ∣ c ) ) argmax(logp_\theta(w|c)) argmax(logpθ(wc))

p θ p_\theta pθ其实就是我们定义的RNN,RNN的公式网上一查就查到了,因此计算梯度,反向传播,参数更新,都是理所当然的事情,最后我们就得到了一个对话生成模型。

但是极大似然估计有一个问题,那就是模型容易置信度过高。而在真实的对话流程中,一句输入,其实可能有无数种回答的方式,每一种回答都是合理的(因为是闲聊嘛)。将模型的所有变量都建模为可见的参数 θ \theta θ,会导致倾向于生成单调的通用性回复,比如“我不知道”,“嗯嗯”,等。这种回复本质上是没错的,但是很无聊。

于是我们提出了下面这个模型:

这个模型叫做VHRED(Variational Hierarchical RNN Encoder-Decoder),引入一个不可观测的隐变量,用于生成对话回复。隐变量每次都采样于一个分布,这样,回复的多样性极大的增加了。

VHRED模型的训练:在生成每一个词的时候,引入了一个隐变量 z z z,这个隐变量无法观测到,所以无法用参数 θ \theta θ建模。因此,训练目标重新写为:

a r g m a x ( l o g p θ ( w ∣ c ) ) = a r g m a x ( l o g ∫ p θ ( w ∣ c , z ) p θ ( z ∣ c ) d z ) argmax(logp_\theta(w|c)) = argmax(log\int p_\theta(w|c,z)p_\theta(z|c) d_{z}) argmax(logpθ(wc))=argmax(logpθ(wc,z)pθ(zc)dz)

问题出现了: z z z是一个高维变量,遍历所有 z z z是不可行的!也就是说,等式右边的式子你是写不出来的,自然也无法计算梯度,进行梯度反向传播,参数更新。

万幸,提出VAE(Variational Autoencoder,VHRED的V就是从这里来的)的论文提供了一个复杂且精妙的解决方案,那就是引入变分推断,用一个认知网络 q ϕ ( z ∣ c , w ) q_\phi(z|c,w) qϕ(zc,w)拟合真实的后验分布 p θ ( z ∣ c , w ) p_\theta(z|c,w) pθ(zc,w)

(一大波推导来袭)
l o g p θ ( w ∣ c ) = E z ∼ q ϕ ( z ∣ c , w ) l o g p θ ( w ∣ z ) # 样 本 分 布 与 认 知 网 络 无 关 = E z l o g ( p θ ( w ∣ c , z ) × p θ ( z ∣ c ) p θ ( z ∣ c , w ) ) = E z l o g ( p θ ( w ∣ c , z ) × p θ ( z ∣ c ) p θ ( z ∣ c , w ) × q ϕ ( z ∣ c , w ) q ϕ ( z ∣ c , w ) ) = E z l o g ( p θ ( w ∣ c , z ) × p θ ( z ∣ c ) q ϕ ( z ∣ c , w ) × q ϕ ( z ∣ c , w ) p θ ( z ∣ c , w ) ) = E z l o g ( p θ ( w ∣ c , z ) − E z l o g ( q ϕ ( z ∣ c , w ) p θ ( z ∣ c ) ) + E z l o g ( q ϕ ( z ∣ c , w ) p θ ( z ∣ c , w ) ) = E z l o g ( p θ ( w ∣ c , z ) − ∫ q ϕ ( z ∣ c , w ) l o g q ϕ ( z ∣ c , w ) p θ ( z ∣ c ) d z + ∫ q ϕ ( z ∣ c , w ) q ϕ ( z ∣ c , w ) p θ ( z ∣ c , w ) d z = E z ∼ q ϕ ( z ∣ c , w ) l o g p θ ( w ∣ c , z ) − K L ( q ϕ ( z ∣ c , w ) ∣ ∣ p θ ( z ∣ c ) ) + K L ( q ϕ ( z ∣ c , w ) ∣ ∣ p θ ( z ∣ c , w ) ) \begin{aligned} logp_\theta(w|c) &= \mathbb{E}_{z \sim q_\phi(z|c,w)}logp_\theta(w|z) \#样本分布与认知网络无关\\ & = \mathbb{E}_zlog( \frac{p_\theta(w|c, z) \times p_\theta(z|c)}{p_\theta(z|c, w)})\\ & = \mathbb{E}_zlog(\frac{p_\theta(w|c, z) \times p_\theta(z|c)}{p_\theta(z|c, w)} \times \frac{q_\phi(z|c, w)}{q_\phi(z|c, w)}) \\ & = \mathbb{E}_zlog(p_\theta(w|c, z) \times \frac{p_\theta(z|c)}{q_\phi(z|c,w)} \times \frac{q_\phi(z|c, w)}{p_\theta(z|c, w)}) \\ & = \mathbb{E}_zlog(p_\theta(w|c, z) - \mathbb{E}_z log(\frac{q_\phi(z|c,w)}{p_\theta(z|c)}) + \mathbb{E}_z log(\frac{q_\phi(z|c, w)}{p_\theta(z|c, w)}) \\ & = \mathbb{E}_zlog(p_\theta(w|c, z) - \int q_\phi(z|c,w)log\frac{q_\phi(z|c,w)}{p_\theta(z|c)} d_z + \int q_\phi(z|c,w) \frac{q_\phi(z|c, w)}{p_\theta(z|c, w)}d_z \\ & = \mathbb{E}_{z \sim q_\phi(z|c,w)}logp_\theta(w|c,z) - KL(q_\phi(z|c,w)||p_\theta(z|c)) + KL(q_\phi(z|c,w)||p_\theta(z|c, w)) \end{aligned} logpθ(wc)=Ezqϕ(zc,w)logpθ(wz)#=Ezlog(pθ(zc,w)pθ(wc,z)×pθ(zc))=Ezlog(pθ(zc,w)pθ(wc,z)×pθ(zc)×qϕ(zc,w)qϕ(zc,w))=Ezlog(pθ(wc,z)×qϕ(zc,w)pθ(zc)×pθ(zc,w)qϕ(zc,w))=Ezlog(pθ(wc,z)Ezlog(pθ(zc)qϕ(zc,w))+Ezlog(pθ(zc,w)qϕ(zc,w))=Ezlog(pθ(wc,z)qϕ(zc,w)logpθ(zc)qϕ(zc,w)dz+qϕ(zc,w)pθ(zc,w)qϕ(zc,w)dz=Ezqϕ(zc,w)logpθ(wc,z)KL(qϕ(zc,w)pθ(zc))+KL(qϕ(zc,w)pθ(zc,w))

注意上面的第三项是写不出来的,原因:
p θ ( z ∣ c , w ) = p θ ( w ∣ c , z ) × p θ ( z ∣ c ) p θ ( w ∣ c ) p_\theta(z|c, w) = \frac{p_\theta(w|c, z) \times p_\theta(z|c)}{p_\theta(w|c)} pθ(zc,w)=pθ(wc)pθ(wc,z)×pθ(zc)

p θ ( w ∣ c ) p_\theta(w|c) pθ(wc)写不出来, p θ ( z ∣ c , w ) p_\theta(z|c,w) pθ(zc,w)就写不出来。但是KL散度有个性质,那就是KL散度始终是大于等于零的。

于是我们得到:

l o g p θ ( w ∣ c ) ≥ E z ∼ q ϕ ( z ∣ c ) l o g p θ ( w ∣ c , z ) − K L ( q ϕ ( z ∣ c , w ) ∣ ∣ p θ ( z ∣ c ) ) logp_\theta(w|c) \geq \mathbb{E}_{z \sim q_\phi(z|c)}logp_\theta(w|c,z) - KL(q_\phi(z|c,w)||p_\theta(z|c)) logpθ(wc)Ezqϕ(zc)logpθ(wc,z)KL(qϕ(zc,w)pθ(zc))

因此,只要最大化不等式右边的内容,就变相的最大化了训练样本的对数似然。而不等式右边的内容就称为证据下界(ELBO, Evidence Lower-Bound)。

综上, a r g m a x ( l o g p θ ( w ∣ c ) ) = a r g m a x ( E L B O ) argmax(logp_\theta(w|c)) = argmax(ELBO) argmax(logpθ(wc))=argmax(ELBO),而 E L B O = E z ∼ q ϕ ( z ∣ c ) l o g p θ ( w ∣ c , z ) − K L ( q ϕ ( z ∣ c , w ) ∣ ∣ p θ ( z ∣ c ) ) ELBO = \mathbb{E}_{z \sim q_\phi(z|c)}logp_\theta(w|c,z) - KL(q_\phi(z|c,w)||p_\theta(z|c)) ELBO=Ezqϕ(zc)logpθ(wc,z)KL(qϕ(zc,w)pθ(zc))

观察上式中的每一项, q ϕ ( z ∣ c , w ) q_\phi(z|c,w) qϕ(zc,w)就是我们的认知网络(其实也就是变分自编码器中的编码器), p θ ( w ∣ c , z ) p_\theta(w|c, z) pθ(wc,z)就是我们的RNN解码器,而 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc)是我们假设的先验分布(一般假设为一个协方差为对角矩阵的高斯分布),因此ELBO里的每一项都是可以写出来的,进而就可以计算梯度,进行梯度反向传播了。

最后要提的一件事,那就是 z ∼ q ϕ ( z ∣ c , w ) z \sim q_\phi(z|c,w) zqϕ(zc,w)这里涉及到一个采样操作,而采样是不可微的,所以论文中引入了重参数化技巧,使得梯度可以更新。但是这不是本文的重点,所以也不在这上面花费笔墨了。

行文至此,其实有几个关键的问题还是没有解决:

问题一:条件变分自编码器,条件在哪里?变分在哪里?自编码在哪里?

1.条件的意思,是我们假设隐变量 z z z的先验分布 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc)依赖于 c c c。如果 z z z不依赖与 c c c,即退化为原始的变分自编码器,仅仅需要假设 p θ ( z ) p_\theta(z) pθ(z)是一个标准高斯分布即可。但是推导过程是一样的。

在对话生成中,假设隐变量 z z z依赖于上文 c c c是一个非常自然的想法,这样 z z z可以用于建模上下文一致性。实际上,我们还可以让 z z z依赖于更多的内容,比如一个额外的知识图谱等,进而建模更多的高维特征。

2.而变分是因为,用 q ϕ ( z ∣ c , w ) q_\phi(z|c,w) qϕ(zc,w)去拟合 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc),然后最大化证据下界的过程,其实借用了泛函分析中的近似推断思想。因为无法求出先验分布 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc)的解析解,所以用 q ϕ ( z ∣ c , w ) q_\phi(z|c, w) qϕ(zc,w)去拟合 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc),曲径通幽,最终求出先验分布 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc)的数值解。更加严格的证明涉及到统计物理学中的平均场理论,笔者在此略过(qishimeikandong)。

3.最让人难以理解的,其实是自编码。特别是现有的讲解CVAE的博文总是从自编码器的角度出发,先假设一个编码器-解码器结构,再讨论变分推断的问题。

但是实际上,真实的网络结构,仅仅包含一个解码器!

再看一下VHRED的模型图,实线表示的是训练完成之后的推断过程,而虚线的部分(也就是用红框框起来的部分),实际上在推断过程中是不存在的。也就是说,在推断阶段,我们的隐变量仅仅参与了解码过程,而不存在一个自编码的过程。

而之所以训练过程中要引入红框框起来的认知网络,是因为 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc)不可解析,所以引入认知网络 q ϕ ( z ∣ c , w ) q_\phi(z|c, w) qϕ(zc,w)来拟合 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc),而认知网络 q ϕ ( z ∣ c , w ) q_\phi(z|c, w) qϕ(zc,w)+解码器 p θ ( w ∣ c , z ) p_\theta(w|c, z) pθ(wc,z)其实才构成了一个自编码器架构(自编码+自解码),且这个自编码器仅仅存在于训练过程中。

所谓的条件自编码器,仅仅是用于拟合先验分布的。一旦训练完成,在推断阶段,只需要使用我们事先假设的先验分布即可,条件自编码器就被丢到虚空中了。(这里其实也隐含了一个小陷阱,那就是CVAE在训练时的参数其实是比测试时多一点点的。)从这个角度来说,VHRED(Variational Hierarchical Encoder-Decoder)应该叫成LHRED(Latent Hierarchical Encoder-Decoder)更合适一些。

问题二:为什么要引入条件变分自编码器?

如果你读懂了上一个问题,那么你一定可以理解,引入条件变分自编码器,本质上是为了训练条件隐变量。所以我们应该问的问题,其实是为什么要在解码器处引入一个条件隐变量

而这个问题,其实在介绍VHRED模型之前就已经回答了。引入一个不可观测的隐变量,每次都采样于高斯分布,高斯分布的样本空间被认为在一个高维空间建模了所有可能的回复,采样任意一个点,都对应了一句合理并且流畅的回复,这样就在保证了回复多样性的同时,又不会生成乱七八糟的结果。

特别的,我们引入的是一个条件隐变量 z ∣ c z|c zc,高斯分布的均值和方差由上文 c c c生成,实际上建模了上文 c c c和回复 w w w之间的高维的、抽象的联系。但是因为此时的隐变量依然是采样生成的,又不会损坏回复的多样性。这样一举两得,岂不美哉。

综上,条件隐变量起到了两方面的作用:

  1. 建模上文c与回复w之间的高维联系;
  2. 增加回复多样性,减少通用性回复。

实际上,这两项也正好对应了我们损失函数中的两项:

L o s s = K L ( q ϕ ( z ∣ c , w ) ∣ ∣ p θ ( z ∣ c ) ) − E z ∼ q ϕ ( z ∣ c ) l o g p θ ( w ∣ c , z ) Loss = KL(q_\phi(z|c,w)||p_\theta(z|c)) - \mathbb{E}_{z \sim q_\phi(z|c)}logp_\theta(w|c,z) Loss=KL(qϕ(zc,w)pθ(zc))Ezqϕ(zc)logpθ(wc,z)

第一项KL散度,强制隐变量z的分布向高斯分布靠拢,本质上是在为解码过程添加噪音,增加回复的多样性;而第二项KL散度,也可以称为重建误差,强制解码的结果与真实回复一致,本质上是建模上文与回复之间的联系。

问题三:为什么可以把先验分布 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc)建模为一个高斯分布,而不能把后验分布 p θ ( z ∣ c , w ) p_\theta(z|c,w) pθ(zc,w)建模为一个高斯分布?

这其实是贝叶斯学派的作风。贝叶斯学派认为,观测是恒定的,不确定的是概率,所以你可以随便假设一个先验分布(只要不离谱就行),然后根据观测,不断地调整后验分布就行。所以我们把先验分布假设为了一个高斯分布,因为高斯分布算各种东西都很好算。但是对于后验分布就不能这么搞了,因为后验分布是要讲证据的。

然而,理想是美好的,现实却是骨感的。在实际的训练中,由于 c c c已经编码了足够多的信息,所以RNN解码器容易忽略 z z z,在这种情况之下,虽然认知网络还是在向先验网络靠拢,但是认知网络产生的 z z z却被丢到了虚空中(但是重建误差还是在不断减少的,因为RNN的学习能力就是这么强)。这样,我们的隐变量模型逐渐退化成了一个普通的RNN,所谓的建模高维特征、增加回复多样性也就无从谈起了……这就是VAE在做文本生成时,臭名昭著的Degeneration Problem。

典型的解决方案如下:

1.KL annealing

L o s s = λ K L ( q ϕ ( z ∣ c , w ) ∣ ∣ p θ ( z ∣ c ) ) − E z ∼ q ϕ ( z ∣ c , w ) l o g p θ ( w ∣ c , z ) Loss = \lambda KL(q_\phi(z|c,w)||p_\theta(z|c)) - \mathbb{E}_{z \sim q_\phi(z|c,w)}logp_\theta(w|c,z) Loss=λKL(qϕ(zc,w)pθ(zc))Ezqϕ(zc,w)logpθ(wc,z)

思路很简单,在KL散度前面加了一个常数项,这个常数项在训练过程中从0到1递增,也就是说,先不管KL散度,优先优化重建误差,这种情况之下,模型当然优先把 q ϕ ( z ∣ c , w ) q_\phi(z|c,w) qϕ(zc,w)采样为一个方差非常小的分布,这样 z z z蕴含的 w w w的信息自然会非常之多,因此重建过程也会更多的依赖于 z z z。然后再将 q ϕ q_\phi qϕ的分布和 p θ p_\theta pθ拉近,保证 z z z的多样性。

然而实际上,即便最开始重建是依赖于 z z z的,一旦 λ \lambda λ开始增大了,也就是 z z z的采样范围增大了,RNN还是会逐渐忽略掉 z z z。没办法,神经网络就是这么喜欢走捷径……

2.word dropout

这个思路就比较巧妙了,既然RNN解码器是如此之强,我就遮挡掉RNN解码器的一部分输入,也就是说,重建误差

E z ∼ q ϕ ( z ∣ c , w ) l o g p θ ( w ∣ c , z ) \mathbb{E}_{z \sim q_\phi(z|c,w)}logp_\theta(w|c,z) Ezqϕ(zc,w)logpθ(wc,z)变成了 E z ∼ q ϕ ( z ∣ c , w ) l o g p θ ( w ∣ z ) \mathbb{E}_{z \sim q_\phi(z|c,w)}logp_\theta(w|z) Ezqϕ(zc,w)logpθ(wz),重建的线索仅剩下了隐变量 z z z,因此RNN必须要学习到根据 z z z来重建 w w w的本领。这里的word dropout率不宜过低也不宜过高,过低的话,还是会degenration;过高的话,重建的线索太少,影响到了模型性能。

3.引入全局隐变量

这个方法来自NAACL18的一篇论文A Hierarchical Latent Structure for Variational Conversation Modeling。这篇论文先是对Degeneration Problem进行了分析,然后指出,在基于CVAE的对话生成模型中,Degenartion Problem问题有两方面原因:

  1. RNN解码器的强大表达能力;

  2. 条件VAE的条件架构造成的数据稀疏;

有关第二点,需要进一步说明。在优化KL散度项 K L ( q ϕ ( z ∣ c , w ) ∣ ∣ p θ ( z ∣ c ) ) KL(q_\phi(z|c,w)||p_\theta(z|c)) KL(qϕ(zc,w)pθ(zc))的过程中, q ϕ ( z ∣ c , w ) q_\phi(z|c,w) qϕ(zc,w) p θ ( z ∣ c ) p_\theta(z|c) pθ(zc)会互相靠近,因为神经网络总是喜欢走捷径,所以 p θ ( z ∣ c ) p_\theta(z|c) pθ(zc)会学成一个方差非常小的高斯分布,这样留给 q ϕ q_\phi qϕ的就没什么学习空间了。相比之下,非条件的VAE就不存在这个问题,因为先验分布永远是一个0,1的高斯分布。

因此,这篇论文引入了一个全局的隐变量:

z c o n v z^{conv} zconv会参与到 h c t x h^{ctx} hctx z i u t t z^{utt}_i ziutt x i x_i xi的生成中,但是 z c o n v z^{conv} zconv本身却是从一个0,1高斯分布中采样出来的隐变量,不condition到任何变量上。因此, z c o n v z^{conv} zconv在建模输出的高维特征的同时,保证了输出始终带有不确定性。

这篇论文的直觉也很直接,因为条件VAE存在数据稀疏问题,所以再引入一个额外的非条件VAE,共同控制输出的多样性。最后的损失函数变为了三项:
L o s s = K L ( q ϕ ( z c o n v ∣ c , w ) ∣ ∣ p θ ( z c o n v ∣ c ) ) + K L ( q ϕ ( z u t t ∣ c , w ) ∣ ∣ p θ ( z u t t ∣ c ) ) − E z c o n v ∼ q ϕ ( z c o n v ∣ c , w ) , z u t t ∼ q ϕ ( z u t t ∣ c , w ) l o g p θ ( w ∣ c , z c o n v , z u t t ) \begin{aligned} Loss = &KL(q_\phi(z^{conv}|c,w)||p_\theta(z^{conv}|c)) \\ &+ KL(q_\phi(z^{utt}|c,w)||p_\theta(z^{utt}|c)) \\ &- \mathbb{E}_{z^{conv}\sim q_\phi(z^{conv}|c,w),z^{utt}\sim q_\phi(z^{utt}|c,w)}logp_\theta(w|c,z^{conv},z^{utt}) \end{aligned} Loss=KL(qϕ(zconvc,w)pθ(zconvc))+KL(qϕ(zuttc,w)pθ(zuttc))Ezconvqϕ(zconvc,w),zuttqϕ(zuttc,w)logpθ(wc,zconv,zutt)
(其实我不知道两个随机变量同时采样的期望是不是这么写)

写到这里,也是本篇博客的结束了。理解对话生成模型中CVAE的关键,在于不要老想着自编码的事情。CVAE的本质是从一个条件隐变量解码输出,引入认知网络(或者说自编码网络)只是为了方便训练。

鉴于条件隐变量具备建模高维特征,同时保证多样性的用途,在实际的使用中,我们可以让隐变量condition到各种内容上,再进行输出。从而建立各种内容和输出之间的联系。当然,这种联系必须是高维的,隐式的,比如情感的一致性、主题的一致性等等。或者换句话说,隐变量只能用来建模句子级别的因果关系,诸如词对齐这样显式的、精确的因果关系,还是用显变量建模更好一些。

[1] Auto-Encoding Variational Bayes, ICLR 2014.
[2] Building End-To-End Dialogue Systems Using Generative Hierarchical Neural Network Models, AAAI 2015.
[3] A Hierarchical Latent Variable Encoder-Decoder Model for Generating Dialogues, AAAI 2017.
[4] A Hierarchical Latent Structure for Variational Conversation Modeling, NAACL 2018.

猜你喜欢

转载自blog.csdn.net/bonjourdeutsch/article/details/113759718