ESIM模型解析-文本匹配

Enhanced LSTM for Natural Language Inference(ESIM)为文本匹配模型,在之前的短文本匹配比赛中取得了不错的效果,故现对该模型进行一些总结。该模型综合利用了biLSTM和attention机制,将一个句子各单词与另一个句子各单词特征相关性进行表示,再进行差积分析,凸显了局部推理信息,可以说这是这个模型的一大亮点。原论文中还有编码以及推理合成部分都利用TreeLSTM替代biLSTM,鉴于效果不如biLSTM本文不做讨论,感兴趣的可以去查看原论文。

论文链接:https://arxiv.org/pdf/1609.06038.pdf

  1. biLSTM编码
    假设输入句a、句b,首先采用biLSTM分别对这两个句子进行编码。
    a i ‾ = B i L S T M ( a , i ) b i ‾ = B i L S T M ( b , i ) \overline{a_{i}}=BiLSTM(a,i) \\ \overline{b_{i}}=BiLSTM(b,i) ai=BiLSTM(a,i)bi=BiLSTM(b,i)
    a i ‾ \overline{a_{i}} ai为 将a再输入时间i的隐藏状态,也就是a句中i单词进行编码时的输出状态,b句也按此操作。此处利用双向LSTM模型在单词的上下文关联上会有更好的效果,单词所在的语境可以表现在编码后。

  2. Local Inference Modeling
    这个模块为该模型最大的创新点,主要在句子基础上表征了两句词之间的关系,并凸显了某一句单词对另一句各单词之间的产生的影响。
    先采用点积计算两句间各单词的attention权重:
    e i , j = a i ‾ T b j ‾ e_{i,j}=\overline{a_i}^T\overline{b_j} ei,j=aiTbj
    然后对两句各单词之间进行交互性计算,可见该词与另一句子联系越大,则计算出的值也会越大:
    a i ~ = ∑ j = 1 l b e x p ( e i , j ) ∑ k = 1 l b b j ‾ \tilde{a_i}=\sum^{l_b}_{j=1}\frac{exp(e_{i,j})}{\sum^{l_b}_{k=1}}\overline{b_j} ai~=j=1lbk=1lbexp(ei,j)bj
    b i ~ = ∑ i = 1 l a e x p ( e i , j ) ∑ k = 1 l a a i ‾ \tilde{b_i}=\sum^{l_a}_{i=1}\frac{exp(e_{i,j})}{\sum^{l_a}_{k=1}}\overline{a_i} bi~=i=1lak=1laexp(ei,j)ai
    上面两个操作相当于先用attention机制计算出a句某一单词和b句中各个单词的权重,然后再将权重赋予b句各个单词用来表征a句中的该单词形成一个新的序列,b句亦然。
    得到了新的序列之后进行差异分析,ESIM计算原biLSTM编码与利用上述两个操作形成的新的序列进行差和积操作。
    m a = [ a ‾ ; a ~ ; ( a ‾ − a ~ ) ; a ‾ ∘ a ~ ] m_a=[\overline{a};\tilde{a};(\overline{a}-\tilde{a});\overline{a}\circ\tilde{a}] ma=[a;a~;(aa~);aa~]
    m b = [ b ‾ ; b ~ ; ( b ‾ − b ~ ) ; b ‾ ∘ b ~ ] m_b=[\overline{b};\tilde{b};(\overline{b}-\tilde{b});\overline{b}\circ\tilde{b}] mb=[b;b~;(bb~);bb~]
    我对此处的理解是:biLSTM分析的是a句中的某一单词在整个a句上下文中结合a句其他单词产生的编码,而新产生的序列为a句中某一单词对整个b句所有单词的联系性,所以再进行差异分析以后,我们可以看到a句各个单词对本句以及b句的序列编码结果相差多少、相关多少。然后再把这些信息(包括新旧序列、差积信息)通过简单拼接全部整合到一个序列中。

  3. Inference Composition
    再进行完Local Inference Modeling得到 m a m_a ma m b m_b mb后因为复杂度过高可能造成模型的过拟合,所以在这里用一个relu激活函数降低复杂度,然后再用biLSTM进行一次编码,将新序列信息内容在内部进行一个融合,并且再次用relu激活函数进行一次处理,得到 v a , i v_{a,i} va,i v b , i v_{b,i} vb,i
    v a , i = B i L S T M ( m a , i ) v_{a,i}=BiLSTM(m_a,i) va,i=BiLSTM(ma,i)
    v b , i = B i L S T M ( m b , i ) v_{b,i}=BiLSTM(m_b,i) vb,i=BiLSTM(mb,i)
    再对 v a , i v_{a,i} va,i v b , i v_{b,i} vb,i进行一个pooling操作,并将pooling后的结果简单拼接为最后进行分类器的向量:
    v a , a v e = ∑ i = 1 l a v a , i l a v_{a,ave}=\sum^{l_a}_{i=1}\frac{v_{a,i}}{l_a} va,ave=i=1lalava,i
    v b , a v e = ∑ i = 1 l b v b , i l b v_{b,ave}=\sum^{l_b}_{i=1}\frac{v_{b,i}}{l_b} vb,ave=i=1lblbvb,i
    v a , m a x = max ⁡ i v a , i v_{a,max}=\max_iv_{a,i} va,max=maxiva,i
    v b , m a x = max ⁡ i v b , i v_{b,max}=\max_iv_{b,i} vb,max=maxivb,i
    v = [ v a , a v e ; v b , a v e ; v a , m a x ; v b , m a x ] v=[v_{a,ave};v_{b,ave};v_{a,max};v_{b,max}] v=[va,ave;vb,ave;va,max;vb,max]
    这里pooling操作都是对整个句子进行pooling提取最最大和平均的序列,减少了复杂度,个人认为一定程度上也去掉了一些冗余信息的干扰,选取了最具有代表性的向量作为结果。最后将该结果放入全连接分类器进行分类便可得到结果,原论文中为三分类输出,其他数据集可按照需求进行输出类别选择,构建一个二分类或者多分类器。

你可能感兴趣的:(ESIM模型解析-文本匹配)