文類似度計算モデル
3625 ワード
前言:文の類似度の計算、アリの競争を結びつけて模型の分析を行って、自分の理解を深めます
2つの文はbilstmを経た後、意味融合の特徴を抽出する必要があり、意味融合の特徴には2つの計算方式があり、それぞれmultiplyとadditive、multiply方式であり、bilstmを下げた2つの文の出力がそれぞれ乗算されている.additiveの方式は、dense層を用いてbilstmを通過した後の出力の2つの文の出力をまず同じ次元に縮小し、加算し、最後にバイアスbを加えて活性化する.
意味融合特徴を計算した後、データマイニング特徴をさらに融合することができる.
2つの文が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ベースの類似は,ほぼフレームワークが2文程度でそれぞれ1つの計算モデルを通過し,出力表示を得,その融合した意味特徴を計算し,データマイニング特徴とconcatを行う.ここで一つ、コードにはtfのconv 2 dを用いてシーケンスをモデリングしているが、データを処理する際には[batch_size,sequence_length,embedding_size],expand_dim後は4次元になりますが、もちろんどの次元でexpandを行うかを指定しなければなりません.conv 2 dを1回ブラシした後、その融合意味を計算します.すなわち、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