今天我们来介绍一下“UMD-TTIC-UW at SemEval-2016 Task 1: Attention-Based
Multi-Perspective Convolutional Neural Networks for Textual Similarity
Measurement”这篇论文。其实本篇论文和之前所说的Multi-Perspective CNN原理是一样的。只不过做了一些小的改进。接下来,我们来讲一下。
首先看一下让他的模型架构, 其实就是在embedding层和Multi-Perspective句子建模层之间加入了一个Attention-Based输入层:
这么做的原因在于,MPCNN模型中,两个句子被相互独立的处理,直到full-connected层二者的信息才有了交互,这样会丢失很多有用的信息。而Attention-based层通过对两个句子的词嵌入矩阵进行融合,获得的新的“词向量”具有二者的信息,可以更好的表征句子的相互关系。其计算方法如下所示:
1,计算attention matrix D(m*n维矩阵,m和n分别代表sent1和sent2的长度)。
Dij代表sent1中第i个单词的词向量与sent2中第j个单词的词向量的余弦距离
2,计算每个句子的attention weight vector Ai(长度为对应句子长度)。其计算方法为:
即对于sent1而言,对矩阵D的每一行求和得到E0,对于sent2而言,对矩阵D的每一列求和得到E1,然后使用softmax函数对其进行处理。最终我们获得的新的词向量的计算方式如下所示:
至此,我们就把论文的模型介绍完了。接下来就是使用TensorFlow将Attention层实现即可。这里就不再对整个项目进行介绍,因为其都是基于MPCNN模型的,只不过在其上加了一个Attention层。直接介绍该函数的实现方法即可:
def attention_layer(sent1, sent2):
#在句子长度上对其进行切分,以获得每个单词的词向量
sent1_unstack = tf.unstack(sent1, axis=1)
sent2_unstack = tf.unstack(sent2, axis=1)
D = []
#求每个单词之间的余弦距离,得到Attention matrix D
for i in range(len(sent1_unstack)):
d = []
for j in range(len(sent2_unstack)):
dis = compute_cosine_distance(sent1_unstack[i], sent2_unstack[j])
d.append(dis)
D.append(d)
#将D转化为适当维度的Tensor
D = tf.reshape(D, [-1, len(sent1_unstack), len(sent2_unstack), 1])
#计算Attention weight vector A
A = [tf.nn.softmax(tf.expand_dims(tf.reduce_sum(D, axis=i), 2)) for i in [2, 1]]
atten_embed = []
#使用A与sent相乘,对其按照权重进行修正,计算新的词向量
atten_embed.append(tf.concat([sent1, A[0]*sent1], 2))
atten_embed.append(tf.concat([sent2, A[1] * sent2], 2))
return atten_embed
注意,这里句子的词向量矩阵经过Attention层之后其每个单词的词向量维度变成了原来的两倍,所以接下来的代码中相应的参数也应该做出对应的修改。
至此,我们在MPCNN的基础上就完成了Attention-Based这篇模型的代码实现。相比第一篇是不是简单了很多呢~~