前言:句子相似度计算,结合蚂蚁的竞赛来进行模型的分析,加深自己的理解
- 基于bilstm的句子相似度计算模型
【句子相似度计算模型】两句话经过bilstm后,需要提取语义融合特征,语义融合特征有两种计算方式,分别是multiply和additive,multiply方式,是降过了bilstm后的两个句子的输出分别相乘;additive的方式,则是使用dense层将过了bilstm后的输出两个句子的输出先缩放到同一个维度,相加,最后加上偏置b进行激活;
在计算出了语义融合特征后,可以进一步融合数据挖掘特征;
在挖掘了两句话经过bilstm后的特征,并且引入了数据挖掘特征后,使用全连接层来对得到的特征进行降维,该部分的代码如下:
def inference_bilstm(self):
# 1.feature:bilstm
x1=self.bi_lstm(self.input_x1,1) # [batch_size,hidden_size*2]
x2=self.bi_lstm(self.input_x2,2) # [batch_size,hidden_size*2]if self.similiarity_strategy == 'multiply':
print("similiarity strategy:", self.similiarity_strategy)
x1=tf.layers.dense(x1,self.hidden_size*2) # [None, hidden_size]
h_bilstm=tf.multiply(x1,x2) # [None,number_filters_total]
elif self.similiarity_strategy == 'additive':
print("similiarity strategy:",self.similiarity_strategy)
h_bilstm=self.additive_attention(x1,x2,self.hidden_size,"bilstm_attention")# 2.feature:data mining feature
h_bluescore= tf.layers.dense(self.input_bluescores, self.hidden_size/2, use_bias=True)
h_bluescore= tf.nn.relu(h_bluescore)# 3.concat feature
h = tf.concat([h_bilstm, h_bluescore], axis=1)# 4.fully connected layer
h = tf.layers.dense(h, self.hidden_size, activation=tf.nn.relu, use_bias=True)
h = tf.nn.dropout(h, keep_prob=self.dropout_keep_prob)with tf.name_scope("output"):
logits = tf.layers.dense(h, self.num_classes, use_bias=False)
return logits
2. 基于cnn的句子相似度计算模型
基于CNN的句子相似度计算模型和基于LSTM的相似,大体框架都是两个句子左右分别过一个计算模型,得到输出表示,计算其融合的语义特征,再与数据挖掘特征进行concat。这里有一点,就是代码里面用的是tf的conv2d来对序列建模的,但是因为在处理数据的时候,是[batch_size,sequence_length,embedding_size],expand_dim后就变成四维的了,当然必须指定是在哪一维上来进行expand。在经过了conv2d刷过一遍后,再计算其融合语义,也就是看和上文中一样使用additive的方式交互语义,该部分代码如下:
def inference_cnn(self):
"""main computation graph here: 1.get feature of input1 and input2;
2.multiplication;
3.linear classifier"""
#1.feature: data mining features
h_bluescore = tf.layers.dense(self.input_bluescores, self.hidden_size / 2, use_bias=True)
h_bluescore = tf.nn.relu(h_bluescore)#2.featuere2: cnn features
x1 = self.conv_layers(self.input_x1, 1)# [None,num_filters_total]
x2 = self.conv_layers(self.input_x2, 1, reuse_flag=True)# [None,num_filters_total]
h_cnn = self.additive_attention(x1, x2, self.hidden_size / 2, "cnn_attention")#4.concat feature
h = tf.concat([h_cnn, h_bluescore], axis=1)#5.fully connected layer
h = tf.layers.dense(h, self.hidden_size, activation=tf.nn.relu, use_bias=True)
h = tf.nn.dropout(h, keep_prob=self.dropout_keep_prob)
#h,self.update_ema=self.batchnorm(h,self.tst, self.iter, self.b1)with tf.name_scope("output"):
logits = tf.layers.dense(h, self.num_classes, use_bias=False)
self.update_ema = h#TODO need remove
return logits
推荐阅读
- 人工智能|hugginface-introduction 案例介绍
- 深度学习|论文阅读(《Deep Interest Evolution Network for Click-Through Rate Prediction》)
- nlp|Keras(十一)梯度带(GradientTape)的基本使用方法,与tf.keras结合使用
- NER|[论文阅读笔记01]Neural Architectures for Nested NER through Linearization
- 深度学习|2019年CS224N课程笔记-Lecture 17:Multitask Learning
- 深度学习|[深度学习] 一篇文章理解 word2vec
- 论文|预训练模型综述2020年三月《Pre-trained Models for Natural Language Processing: A Survey》
- NLP|NLP预训练模型综述
- NLP之文本表示——二值文本表示
- 隐马尔科夫HMM应用于中文分词