论文链接地址
Learning Text Similarity with Siamese Recurrent Networks
github
https://github.com/KATEhuang920909/deep_text_match
前言
本文提出了一种文本匹配的深度神经网络结构。为有监督任务,该模型将字符级双向LSTM的堆栈与Siamese体系结构相结合。输入两个文本字符级特征,输出两段文本的匹配值。由Paul Neculoiu等于16年提出。
模型结构
\quad 整体结构如下图所示:
输入层
- 输入特征:对于英文以字母的维度作为输入特征,中文则以字的维度作为输入特征;
- 截断长度:依据数据集样本长度的分布选取合适的截断长度
- 输入向量初始化:可以采用xavier_uniform_initializer来初始化embedding向量, 然后加入网络中训练,xavier_uniform_initializer可以使得每一层的方差都尽可能相等, 使网络中的信息更好地流动;也可以使用word2vec、elmo、bert等预训练模型来初始化embedding矩阵,这样可以加快收敛并大大提高模型泛化能力。
siamese-BiLSTM层
采用孪生神经网络,左右两边的每一层网络权重共享。tensorflow中创建网络时使得resue=True即可实现网络权重共享。
将embedding矩阵输入到,四层Bi-LSTM网络,每一层的每个step前向后向拼接作为该step的输出,送入下一层,最终输出每一个step的向量。
tensorflow:
def model(x, dropout, hidden_units):
n_layers = 3
stacked_rnn_fw = []
stacked_rnn_bw = []
for _i in range(n_layers):
fw_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_units)
fw_cell = tf.nn.rnn_cell.DropoutWrapper(fw_cell, output_keep_prob=dropout)
stacked_rnn_fw.append(fw_cell)
lstm_fw_cell_m = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_rnn_fw, state_is_tuple=True)
for _i in range(n_layers):
bw_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_units)
bw_cell = tf.nn.rnn_cell.DropoutWrapper(bw_cell, output_keep_prob=dropout)
stacked_rnn_bw.append(bw_cell)
lstm_bw_cell_m = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_rnn_bw, state_is_tuple=True)
outputs, _ = tf.nn.bidirectional_dynamic_rnn(lstm_fw_cell_m, lstm_bw_cell_m, x, dtype=tf.float32)
return tf.concat(outputs, 2)
然后对每一个步长的输出平均,获得最终的输出向量,送入全连接层,最终输出维度为128的向量。
输出层
输出层采用energy function,也就是余弦函数,计算两向量之间的相似度值,代码如下:
def cosine(p, h):
p_norm = tf.norm(p, axis=1, keepdims=True)
h_norm = tf.norm(h, axis=1, keepdims=True)
cosine = tf.reduce_sum(tf.multiply(p, h), axis=1, keepdims=True) / (p_norm * h_norm)
损失函数
损失函数使用contrastive loss,公式如下:
L o s s = y ( i ) L + ( x 1 ( i ) , x 2 ( i ) ) + ( 1 − y ( i ) ) L − ( x 1 ( i ) , x 2 ( i ) ) Loss = y^{(i)} L_+(x_{1}^{(i)},x_{2}^{(i)})+(1-y^{(i)})L_-(x_{1}^{(i)},x_{2}^{(i)}) Loss=y(i)L+(x1(i),x2(i))+(1−y(i))L−(x1(i),x2(i)) …(1)
L + ( x 1 ( i ) , x 2 ( i ) ) = 1 4 ( 1 − E W ) 2 L_+{(x_{1}^{(i)},x_{2}^{(i)})} = \frac{1}{4}(1-E_W)^2 L+(x1(i),x2(i))=41(1−EW)2 …(2)
L _ ( x 1 , x 2 ) = { E W 2 i f E W < m 0 o t h e r w i s e L\_(x_1,x_2)\;=\;\left\{\begin{array}{lc}E_W^2&if\;E_W<m\\0&otherwise\end{array}\right. L_(x1,x2)={EW20ifEW<motherwise…(3)
def contrastive_loss(y, d):
tmp = (1 - y) * tf.square(d)
tmp2 = y * tf.square(tf.maximum((1 - d), 0)) / 4
return tmp + tmp2
本文中相关参数如下:
- text max length:100
- BiLSTM hidden size : 64
- BiLSTM layers :4
- fc hidden size:128
- rnn drop rate :0.2
- between layer drop rate :0.4