双边多视角自然语言句子匹配(BiMpm)
模型与图片来自论文Bilateral Multi-Perspective Matching for Natural Language Sentences.
问题定义与模型结构
双边多视角匹配(BiMPM)用来估计条件分布概率, 其中为长度为的句子, 为长度为的句子, 为标签代表和之间的关系. 该模型从两个方向来进行匹配. 在每个独立的方向, 模型从多个视角进行匹配. 图1给出了模型的结构, 模型总共有5层.
Word Representation Layer:其中词表示层使用预训练的Glove或Word2Vec词向量表示, 论文中还将每个单词中的字符喂给一个LSTM得到字符级别的字嵌入表示, 文中使用两者构造了一个维的词向量表示, 于是两个句子可以分别表示为.
Context Representation Layer: 上下文表示层, 使用相同的双向LSTM来对两个句子进行编码. 分别得到两个句子每个时间步的输出.
Matching layer: 对两个句子和从两个方向进行匹配, 其中表示某个句子的某个时间步的输出对另一个句子所有时间步的输出进行匹配的结果. 最终匹配的结果还是代表两个句子的匹配向量序列.
Aggregation Layer: 使用另一个双向LSTM模型, 将两个匹配向量序列两个方向的最后一个时间步的表示(共4个)进行拼接, 得到两个句子的聚合表示.
Prediction Layer: 对拼接后的表示, 使用全连接层, 再进行softmax得到最终每个标签的概率.
多视角匹配操作
图中操作共分为两步:
-
定义余弦匹配函数来匹配两个向量:
其中为两个维向量, 为可训练的参数. 为视角的个数, 返回值是一个维的向量. 其中每个元素为个视角的匹配值, 其通过计算两个加权向量的余弦相似度得到:
其中, 代表元素级别相乘. 为矩阵的第行, 其控制了个视角, 并且在维空间赋予了不同的权重. -
基于, 文中定义了4中匹配策略来对某个句子的一个时间步对另一个句子的所有时间步进行匹配. 两个方向做法类似.
- full-Matching: 如图2(a)所示, 某个句子的每个时间步和另一个句子的最后一个时间步的匹配.
- Maxpooling-Matching: 如图2(b)所示, 某个句子的每个时间步和另一个句子所有时间步进行匹配, 然后将所有匹配的向量取每个维度的最大值.
- Attentive-Matching: 如图2©所示, 某个句子的每个时间步对另一个句子的所有时间步求余弦相似度, 得到另一个句子所有时间步的权重, 对权重进行softmax, 然后对这个句子所有时间步的向量进行加权求和, 最后对这个加权后的向量输入进行匹配.
- Max-Attentive-Matching: 如图2(d)所示, 类似上一条策略, 这里并没有进行加权求和, 而是取余弦相似度最高的那个时间步的向量来进行匹配.
实验
这里我还是用斯坦福自然语言推理语料库进行测试. 模型不难理解, 但实现起来还是有些小麻烦, 好在AllenNLP已经实现好了, 我们只要直接进行调用就可以了. Allennlp库是基于pytorch的, 其为我们提供了从数据预处理到多种模型的实现以及训练测试的模板代码. 其模型的实现与论文的实现有一些不同, 或者说更加的完善, 我在这里使用了两层GRU来对句子进行表示, 分别在词向量表示, 两层GRU的输出进行了匹配, 最后再将这三层匹配的结果进行拼接. 此外, Allennlp还同时保留了单个视角和多视角的结果, 以及不光求了最大值还求了平均值等等. 具体细节可以参考Allennlp的源码. 我简单试了一下, 测试集的准确率大概为0.83左右, 有些低, 未调参也没有用预训练的词向量初始化. 下图为训练集和验证集的准确率以及损失, 我测试的代码在这里.