A Diversity-Promoting Objective Function for Neural Conversation Models》阅读笔记


火爆的QA系统,现在常采用seq2seq的模型来做,这篇文章是为了优化一个问题。seq2seqm模型通常的回复会是更安全的(safe)、更通用(平常的)的内容,比如'i don't know'或者'i am Ok'之类。作者猜测,这是因为通常它们在decoder层采用的目标函数是计算输入与输出的似然性,比如最大似然估计(MLE)。作者采用最大互信息(Maximum Mutual Information ,MMI)作为目标函数来优化这一问题。

在seq2seq模型中,对于目标序列(target) T 和输入序列(source) S。给一个输入序列:X=\{x_1,x_2,...,x_{N_x} \},它都有一个对应的目标输出序列:
Y=\{y_1, y_2, ..., y_{N_y} \}。则下面的方程表示了LSTM模型使用softmax函数来刻画输入与输出的分布关系。这里h_{k-1}表示在h-1时刻LSTM的输出状态,f是激活函数。每句话的decoder输出以EOS结束。

p(Y|X)=\prod_{k=1}^{n} p(y_k|x_1,x_2,....,x_t,y_1, y_2,...y_{k-1})\\=\prod_{k=1}^{N_y}\frac{\exp(f(h_{k-1}, e_y))}{\sum_{y'}\exp(f(h_{k-1}, e_{y'}))}

所以对于输入S=\{s_1,s_2,...,s_{N_s}\}, 对应的目标序列是:T = \{ t_1, t_2,..., t_{N_t}, EOS\}。seq2seq标准的目标函数是对数似然函数形式,在测试时看做生成一个统计决策问题:
\hat{T} = \mathop {\arg\max}\limits_{T} \{\log p(T|S)\}
从这个公式,作者分析,seq2seq模型容易产生generic responses,原因是它仅仅从给定的输入选择目标序列,而没有从反方向考虑。为了修正这种观点,作者提出了最大互信息(Maximum Mutual Information ,MMI)作为目标函数,然后搜寻目标函数中的参数来最大化输入序列 S 和目标序列 T 之间的互信息。
\log\frac{p(S,T)}{p(S)p(T)}

采用互信息函数就可以避免产生非条件性的高频回应,也就是安全的、无用的回应,而更倾向于产生对应于特定输入的回应。由贝叶斯公式 p(T|S)={p(S,T)} / {p(S)} 有下面的递推式:
\log\frac{p(S,T)}{p(S)p(T)}=\log\frac{p(T|S)}{p(T)}=\log p(T|S)-\log p(T)
则有:
\hat{T} = \mathop {\arg\max}\limits_{T}\{\log p(T|S)-\log p(T) \}
再引入一个参数\lambda,可得最终的目标函数一:
\hat{T} = \arg\max\{\log p(T|S)- \lambda \log p(T) \}
这个参数\lambda 可以理解为,需要惩罚多少无用的回应(generic responses), \lambda越大惩罚的越多。

作者由贝叶斯公式构:
\log p(T)=\log p(T|S)+\log p(S)-\log p(S|T)
便可以重写上面的目标函数,得到目标函数二:
\hat{T} = \mathop {\arg\max}\limits_{T} \{(1-\lambda)\log p(T|S)+\lambda \log p(S|T) - \lambda \log p(S) \} \\ = \mathop {\arg\max}\limits_{T} \{(1- \lambda)\log p(T|S) + \lambda \log p(S|T) \}
因此,这个加权重MMI的目标函数可以看做是表示由输入考虑目标p(T|S), 和由目标考虑输入p(S|T)的一种折中。

作者将上面两种方案分别称作MMI-antiLM和MMI-bidi。但是在实际的实现中,采用MMI-antiLM方案容易导致语法错误的结果(ungrammatical responses);而采用MMI-bidi是,直接解码会很难解决的(intractable),因为在计算p(S|T)之前,也就是给定回复下得到输入句的概率,这就要求先生成所有目标序列T,因为目标序列T在一个巨大的搜索空间中,因此找到所有可能的分布是几乎无法实现的。为此,作者分别给出了下面的解决方案。

  • MMI-antiLM中的语法错误回复问题:

目标函数一的第一部分 \log p(T|S)- \lambda \log p(T),就是 \lambda \log p(T), 可以看做是一种反语言模型(anti-language model),它 不仅惩罚了高频出现、通俗的回应(generic responses),也惩罚了通顺的句子,因此这就会导致语法错误的结果。理论上,当\lambda的值小于1时就会避免出现这个问题,因为,当\lambda<1 语法错误的结果会更多的被目标函数中的第一项所惩罚,但是实际上并不是这样理想的。解决方案如下:
假设N_t是目标输出T 的长度,所以目标函数一中的语言模型 p(T) 可以写成:
p(T) = \prod_{k=1}^{N_t} p(t_k| t_1,t_2,...,t_{k-1})
作者采用标准的语言模型乘以一个递减的函数g(k), 命名为U(k),来替换p(T), g(k) 是一个随着目前token的下标而数值递减的函数,于是得到:
U(T) = \prod_{k=1}^{N_t} p(t_k| t_1,t_2,...,t_{k-1}) * g(k)
作者之所以这样做的考虑是,第一,神经网络的解码结合了之前已经建立的表征和目前要预测的word,在解码过程中,初始输入对解码结果的影响将随着已经预测的单词的变多而渐渐减弱。换句话说,最开始被预测的词将非常大的影响后面的结果。因此采用语言模型对开头的词语执行更大的惩罚会比惩罚后面的词对产生多样性(diversity)有更大的影响,这是g(k)递减的意义所在。第二,随着最初的输入对解码过程的影响减弱,语言模型的影响将会逐渐成为支配力量。所以语法错误的回复会在后面的解码过程中渐渐消失,尤其是在长句子中。作者在实验中发现,g(k)逐渐递减式并没有起到更好的效果,所以采用了下面的这个分段式递减函数:
\begin{equation}{g(x)=}
\left{
\begin{array}{lr}
1 & if\ k \le \gamma \
0 & if\ k > \gamma
\end{array}
\right.
\end{equation}
其中,阈值 \gamma 也视作模型参数,表示惩罚前面的 \gamma 个words!
于是,最初的目标函数一可以改写成:
\hat{T} = \mathop {\arg\max}\limits_{T} \{ \log p(T|S) - \gamma \log U(T) \}

另外,作者在实验中发现,解码时 target T 的长度(N_t)也对模型的结果产生了有益的影响,所以最终的损失定义如下:
Score(T) = \log p(T|S) - \gamma \log U(T)+\gamma N_t

  • MMI-bidi中的问题:

作者采用了一种近似的求法,先使用P(S|T)求得N-best候选应答,然后在再根据完整的目标函数二重排,得到最佳应答。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容