文類似度計算モデル

3625 ワード

前言:文の類似度の計算、アリの競争を結びつけて模型の分析を行って、自分の理解を深めます

  • bilstmに基づく文類似度計算モデル
  • まず文に対応する双方向のlstmを得た後の表現であり,ここではまずembedding_を用いる.lookup関数は文の中の分詞に対応するembeddingを見つけ、分詞リストを前後方向のlstmに投げ込み、それぞれ順方向と後方向の符号化を得てtfを用いる.nn.bidirectional_dynamic_rnnはlstm符号化の出力と分詞listを前後に入力し、出力はtuple(output,output_states)であり、出力のoutput_statesの2次元はconcatを行い、bilstmブラシ後の出力とする.
    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