双边多视角自然语言句子匹配(BiMpm)

模型与图片来自论文Bilateral Multi-Perspective Matching for Natural Language Sentences.

问题定义与模型结构

双边多视角匹配(BiMPM)用来估计条件分布概率Pr(yP,Q)Pr(y|P,Q), 其中P=(p1, ,pM)P=(p1,\cdots, p_M)为长度为MM的句子, Q=(q1, ,qN)Q=(q_1, \cdots, q_N)为长度为NN的句子, yYy\in \mathcal{Y}为标签代表PPQQ之间的关系. 该模型从两个方向来进行匹配PQ,QPP\rightarrow Q, Q\rightarrow P. 在每个独立的方向, 模型从多个视角进行匹配. 图1给出了模型的结构, 模型总共有5层.
双边多视角自然语言句子匹配(BiMpm)
Word Representation Layer:其中词表示层使用预训练的Glove或Word2Vec词向量表示, 论文中还将每个单词中的字符喂给一个LSTM得到字符级别的字嵌入表示, 文中使用两者构造了一个dd维的词向量表示, 于是两个句子可以分别表示为P:[p1, ,pm],Q:[q1, ,qn]P:[p_1,\cdots, p_m], Q:[q_1, \cdots, q_n].

Context Representation Layer: 上下文表示层, 使用相同的双向LSTM来对两个句子进行编码. 分别得到两个句子每个时间步的输出.

Matching layer: 对两个句子PPQQ从两个方向进行匹配, 其中\otimes表示某个句子的某个时间步的输出对另一个句子所有时间步的输出进行匹配的结果. 最终匹配的结果还是代表两个句子的匹配向量序列.

Aggregation Layer: 使用另一个双向LSTM模型, 将两个匹配向量序列两个方向的最后一个时间步的表示(共4个)进行拼接, 得到两个句子的聚合表示.

Prediction Layer: 对拼接后的表示, 使用全连接层, 再进行softmax得到最终每个标签的概率.

多视角匹配操作

双边多视角自然语言句子匹配(BiMpm)
图中\otimes操作共分为两步:

  • 定义余弦匹配函数fmf_m来匹配两个向量:
    m=fm(v1,v2,W) m=f_m(v_1,v_2,W)
    其中v1,v2v_1,v_2为两个dd维向量, WRl×dW\in \R^{l\times d}为可训练的参数. ll为视角的个数, 返回值是一个ll维的向量m=[m1, ,ml]m=[m_1,\cdots, m_l]. 其中每个元素mkmm_k\in mkk个视角的匹配值, 其通过计算两个加权向量的余弦相似度得到:
    mk=cosine(Wkv1,Wkv2) m_k=cosine(W_k\circ v_1, W_k\circ v_2)
    其中, \circ代表元素级别相乘. WkW_kWW矩阵的第kk行, 其控制了kk个视角, 并且在dd维空间赋予了不同的权重.

  • 基于fmf_m, 文中定义了4中匹配策略来对某个句子的一个时间步对另一个句子的所有时间步进行匹配. 两个方向PQ,QPP\rightarrow Q, Q\rightarrow P做法类似.

    • full-Matching: 如图2(a)所示, 某个句子的每个时间步和另一个句子的最后一个时间步的匹配.
    • Maxpooling-Matching: 如图2(b)所示, 某个句子的每个时间步和另一个句子所有时间步进行匹配, 然后将所有匹配的向量取每个维度的最大值.
    • Attentive-Matching: 如图2©所示, 某个句子的每个时间步对另一个句子的所有时间步求余弦相似度, 得到另一个句子所有时间步的权重, 对权重进行softmax, 然后对这个句子所有时间步的向量进行加权求和, 最后对这个加权后的向量输入fmf_m进行匹配.
    • Max-Attentive-Matching: 如图2(d)所示, 类似上一条策略, 这里并没有进行加权求和, 而是取余弦相似度最高的那个时间步的向量来进行匹配.

实验

这里我还是用斯坦福自然语言推理语料库进行测试. 模型不难理解, 但实现起来还是有些小麻烦, 好在AllenNLP已经实现好了, 我们只要直接进行调用就可以了. Allennlp库是基于pytorch的, 其为我们提供了从数据预处理到多种模型的实现以及训练测试的模板代码. 其模型的实现与论文的实现有一些不同, 或者说更加的完善, 我在这里使用了两层GRU来对句子进行表示, 分别在词向量表示, 两层GRU的输出进行了匹配, 最后再将这三层匹配的结果进行拼接. 此外, Allennlp还同时保留了单个视角和多视角的结果, 以及不光求了最大值还求了平均值等等. 具体细节可以参考Allennlp的源码. 我简单试了一下, 测试集的准确率大概为0.83左右, 有些低, 未调参也没有用预训练的词向量初始化. 下图为训练集和验证集的准确率以及损失, 我测试的代码在这里.

双边多视角自然语言句子匹配(BiMpm)
双边多视角自然语言句子匹配(BiMpm)