ESIM模型详解

ESIM(Enhanced Sequential Inference Model)是一个综合应用了BiLSTM和注意力机制的模型,在文本匹配中效果十分强大,也是目前为止我见过结构最复杂的模型,下面将会结合公式和感性的理解去一步步推导这个模型。

首先什么是文本匹配,简单来说就是分析两个句子是否具有某种关系,比如有一个问题,现在给出一个答案,我们就需要分析这个答案是否匹配这个问题,所以也可以看成是一个二分类问题(输出是或者不是)。现在主要基于SNIL和MutilNLI这两个语料库,它们包含两个句子premise和hypothesis以及一个label,label就是判断这两个句子的关系,本文主要讲解的就是如何利用ESIM分析这个问题。

就像上面提到的,这个问题简单来说就是输入两个句子,输出一个label,这里一共有三个label(neutral、contradiction、entailment),那么我们就可以简单地用下图表示这个模型:
ポジショニングマップ
既然输入是两个句子,首先肯定是做word embedding了,方法有很多,这里假设直接用预训练的glove把句子转换成矩阵,注意,这时候我们得到的向量因为是基于glove预训练的向量得到的,并没有反映出句子中的前后文联系,所以我们这里继续利用BiLSTM再重新转换一下,得到最终的输入变量:
$$\overline a_i = BiLSTM(a,i)$$
$$\overline b_i = BiLSTM(b,i)$$
上面的ai、bi就是premise和hypothesis的某个单词的表示,以上过程就是ESIM中的input encoding过程。

接下来就是需要分析这两个句子之间的联系了,具体怎么分析,首先要注意的是,我们现在得到的句子和单词的表示向量,是基于当前语境以及单词之间的意思综合分析得到的,那么如果两个单词之间联系越大,就意味着他们之间的距离和夹角就越少,比如(1,0)和(0,1)之间的联系,就没有(0.5,0.5)和(0.5,0.5)之间的联系大。在理解了这一点之后,我们再来看看ESIM是怎么分析的。

首先,两个句子的词向量之间相乘:
$$e_{ij} = \overline a_i^T \overline b_J$$
正如之前所说的,如果两个词向量联系较大,那么乘积也会较大,然后:
$$\widetilde a_i = \sum_{j=1}^{\iota _b} \frac{exp(e_{ij})}{\sum_{k=1}^{\iota _b} exp(e_{ik})} \overline b_j$$
$$\widetilde b_j = \sum_{i=1}^{\iota _a} \frac{exp(e_{ij})}{\sum_{k=1}^{\iota _a} exp(e_{kj})} \overline a_i$$
这两条公式我认为是整个ESIM的神来之笔,上述几条公式的目的,简单来说可以这样理解,比如premise中有一个单词"good",首先我分析这个词和另一句话中各个词之间的联系,计算得到的结果e_{ij}标准化后作为权重,用另一句话中的各个词向量按照权重去表示"good",这样一个个分析对比,得到新的序列。以上过程称为Local Inference Modelling。

很明显,接下来就是分析差异,从而判断两个句子之间的联系是否足够大了,ESIM主要是计算新旧序列之间的差和积,并把所有信息合并起来储存在一个序列中:
$$m_a = [\overline a; \widetilde a; (\overline a - \widetilde a); (\overline a \bigodot \widetilde a)]$$
$$m_b = [\overline b; \widetilde b; (\overline b - \widetilde b); (\overline b \bigodot \widetilde b)]$$
以上过程称为Enhancement of local inference information

为什么要把所有信息储存在一个序列中,因为ESIM最后还需要综合所有信息,做一个全局的分析,这个过程依然是通过BiLSTM处理这两个序列:
$$v_{a,t} = BiLSTM(F(m_{a,t}),t)$$
$$v_{b,t} = BiLSTM(F(m_{b,t}),t)$$
值得注意的是,F是一个单层神经网络(ReLU作为激活函数),主要用来减少模型的参数避免过拟合,另外,上面的t表示BiLSTM在t时刻的输出。

因为对于不同的句子,得到的向量v长度是不同的,为了方便最后一步的分析,这里进行了池化处理,把结果储存在一个固定长度的向量中。值得注意的是,因为考虑到求和运算对于序列长度是敏感的,因而降低了模型的鲁棒性,所以ESIM选择同时对两个序列进行average pooling和max pooling,再把结果放进一个向量中:
$$v = [v_{a,ave}; v_{a,max}; v_{b,ave}; v_{b,max}]$$
最终,终于来到最后一步了,那就是把向量v扔到一个多层感知器分类器,在输出层使用softmax函数。

以上,就是ESIM的完整模型了。