废话不多说直接上模型:
这是一个非常经典的对话生成模型,叫做HRED(Hierarchical RNN Enconder-Decoder)。思路很简单,就是用一个RNN来建模前 j − 1 j-1 j−1句话,再用一个RNN来建模第 j j j句话的 k − 1 k-1 k−1个词,然后再用一个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,k∣w1,w2,...,wj−1,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,...,wj−1,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θ(w∣c))
而 p θ p_\theta pθ其实就是我们定义的RNN,RNN的公式网上一查就查到了,因此计算梯度,反向传播,参数更新,都是理所当然的事情,最后我们就得到了一个对话生成模型。
但是极大似然估计有一个问题,那就是模型容易置信度过高。而在真实的对话流程中,一句输入,其实可能有无数种回答的方式,每一种回答都是合理的(因为是闲聊嘛)。将模型的所有变量都建模为可见的参数 θ \theta θ,会导致倾向于生成单调的通用性回复,比如“我不知道”,“嗯嗯”,等。这种回复本质上是没错的,但是很无聊。
于是我们提出了下面这个模型:
![](https://img-blog.csdnimg.cn/2021020817052649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JvbmpvdXJkZXV0c2No,size_16,color_FFFFFF,t_70#pic_center)
这个模型叫做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θ(w∣c))=argmax(log∫pθ(w∣c,z)pθ(z∣c)dz)
问题出现了: z z z是一个高维变量,遍历所有 z z z是不可行的!也就是说,等式右边的式子你是写不出来的,自然也无法计算梯度,进行梯度反向传播,参数更新。
万幸,提出VAE(Variational Autoencoder,VHRED的V就是从这里来的)的论文提供了一个复杂且精妙的解决方案,那就是引入变分推断,用一个认知网络 q ϕ ( z ∣ c , w ) q_\phi(z|c,w) qϕ(z∣c,w)拟合真实的后验分布 p θ ( z ∣ c , w ) p_\theta(z|c,w) pθ(z∣c,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