最近一直在分享自然语言推理和文本蕴含的相关论文,并且之前已经分享过三篇,分别是bilateral multi-perspective matching (BiMPM)模型、Enhanced Sequential Inference Model(ESIM)模型和Densely Interactive Inference Network(DIIN)模型。这次分享一下最经典的文本蕴含模型,也就是孪生网络(Siamese Network)。

刘聪NLP:论文阅读笔记:文本蕴含之BiMPM​zhuanlan.zhihu.com

刘聪NLP:论文阅读笔记:文本蕴含之ESIM​zhuanlan.zhihu.com

刘聪NLP:论文阅读笔记:文本蕴含之DIIN​zhuanlan.zhihu.com

一、背景介绍

孪生网络一开始提出是在图像识别领域(例如人脸识别),来求解两张图片(两张人脸图像)相似度,判断两张图片是否相似。如下图所示1,输入两张图片,将两张图片经过同一个卷积神经网络,得到每张图片的向量表示,最后求解两个向量的编辑距离(可以是余弦距离,欧式距离,等等),根据得到的编辑距离判断两张图片是否相似。

孪生网络原文链接​www.cs.utoronto.ca

那么从哪里体现出孪生网络的“孪生”二字呢?从图1中,我们可以看到,其实每张图片是经过了各自的卷积神经网络,但是两个卷积神经网络的所有权值(所有参数)都是共享的,这就像一对双胞胎一样,因此我们管这种权值共享的网络称之为孪生网络。而权值共享的目的有两个:(1)减少参数量,减小模型的复杂度;(2)将两个不同空间维度的向量映射到同一个空间维度上,使其数据分布保持一致,在同一空间维度上对不同向量进行编码。

图1 基于孪生网络的图像相似度求解图

二、孪生网络在文本蕴含中的使用

在机器学习中,很多算法在图像和自然语言处理两个领域是可以互通的(可以相互借鉴的)。根据上一节的描述,我们可以看出,该任务和我们文本蕴含任务很像;都是输入两个不同的特征向量,最后判断两个特征向量之间的关系。如图2所示,我们将孪生网络应用在文本蕴含领域。

图2 文本蕴含之孪生网络

主要包含四层:词表示层(Embedding Layer)、编码层(Encoder Layer)、融合层(Aggregated Layer)和预测层(Predict Layer)。

下面通过代码详细介绍:

首先定义模型固定参数和其输入,其中forward()函数包含上文所提到的四层。

class SIAMESE(object):def __int__(self, config, word_embedding_matrix=None):self.word_embedding_dim = config.word_dimself.rnn_hidden_size = config.rnn_hidden_sizeself.fine_tune_embedding = config.fine_tune_embeddingself.num_sentence_words = config.max_length_contentself.learning_rate = config.learning_rateself.rnn_layers = config.rnn_layerswith tf.variable_scope("input"):self.sentence_one_word = tf.placeholder(tf.int32, [None, self.num_sentence_words], name="sentence_one_word")self.sentence_two_word = tf.placeholder(tf.int32, [None, self.num_sentence_words], name="sentence_two_word")self.y_true = tf.placeholder(tf.int32, [None, 2], name="true_labels")self.is_train = tf.placeholder(tf.bool, [], name="is_train")self.dropout_rate = tf.cond(self.is_train, lambda: config.dropout_rate, lambda: 0.0)self.word_mat = tf.get_variable("word_mat", initializer=tf.constant(word_embedding_matrix, dtype=tf.float32), trainabel=self.fine_tune_embedding)self.forward()

1、词表示层(Embedding Layer)

在这一层中,我们将在句子P和句子Q中的每个词映射成一个d维的向量,这d维的向量由word embedding组成,word embedding来自提前预训练好的词向量。

with tf.variable_scope("embedding_layer"):word_embedded_sentence_one = tf.nn.embedding_lookup(self.word_mat, self.sentence_one_word)word_embedded_sentence_two = tf.nn.embedding_lookup(self.word_mat, self.sentence_two_word)

2、编码层(Encoder Layer)

在这一层中,我们对上一层得到的词表示向量进行上下文编码,使用一个双向LSTM(权值共享)分别编码前提句和假设句的词表示向量,得到其上下文表征向量。

由于使用多层动态双向LSTM,因此首先获取每个句子的实际长度;

with tf.variable_scope("get_length_layer"):self.batch_size = tf.shape(self.sentence_one_word)[0]self.sentence_one_wordlevel_mask = tf.sign(self.sentence_one_word, name="sentence_one_wordlevel_mask")self.sentence_two_wordlevel_mask = tf.sign(self.sentence_two_word, name="sentence_two_wordlevel_mask")self.sentence_one_len = tf.reduce_sum(self.sentence_one_wordlevel_mask,1)self.sentence_two_len = tf.reduce_sum(self.sentence_two_wordlevel_mask,1)

然后对其编码,得到双向LSTM最后一个time step作为是该句子的句子表征向量;

with tf.variable_scope("sequence_encoder_layer"):one_fw_outputs, one_bw_outputs = self.my_bilstm(inputs=word_embedded_sentence_one,dropout=self.dropout_rate,n_layers=self.rnn_layers,scope="bilstm",sequence_length=self.sentence_one_len,hidden_units=self.rnn_hidden_size)two_fw_outputs, two_bw_outputs = self.my_bilstm(inputs=word_embedded_sentence_two,dropout=self.dropout_rate,n_layers=self.rnn_layers,scope="bilstm",sequence_length=self.sentence_two_len,hidden_units=self.rnn_hidden_size,reuse=True)last_one_fw_output = self.last_relevant_output(one_fw_outputs, self.sentence_one_len)last_one_bw_output = self.last_relevant_output(one_bw_outputs, self.sentence_one_len)last_one_output = tf.concat([last_one_fw_output, last_one_bw_output], axis=-1)last_two_fw_output = self.get_last_output(two_fw_outputs, self.sentence_two_len)last_two_bw_output = self.get_last_output(two_bw_outputs, self.sentence_ontwo_len)last_two_output = tf.concat([last_two_fw_output, last_two_bw_output], axis=-1)

多层动态双向LSTM代码如下:

def my_bilstn(self, inputs, dropout, n_layers, scope, sequence_length, hidden_size, reuse=None):with tf.variable_scope("fw"+scope, reuse=reuse):stacked_rnn_fw = []for _ in range(n_layers):fw_cell = LSTMCell(hidden_size)lstm_fw_cell = DropoutWrapper(fw_cell, output_keep_prob=1-dropout)stacked_rnn_fw.append(lstm_fw_cell)lstm_fw_cell_m = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_rnn_fw, state_is_tuple=True)with tf.variable_scope("bw"+scope, reuse=reuse):stacked_rnn_bw = []for _ in range(n_layers):bw_cell = LSTMCell(hidden_size)lstm_bw_cell = DropoutWrapper(bw_cell, output_keep_prob=1-dropout)stacked_rnn_bw.append(lstm_bw_cell)lstm_bw_cell_m = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_rnn_bw, state_is_tuple=True)    with tf.variable_scope(scope, reuse=reuse):(fw_outputs, bw_outputs), _ = tf.nn.bidirectional_dynamic_rnn(cell_fw=lstm_fw_cell_m,cell_bw=lstm_bw_cell_m,inputs=inputs,sequence_length=sequence_length,dtype=tf.float32)return fw_outputs, bw_outputs

获取动态双向LSTM最后一个time step向量代码如下:

def get_last_output(self, output, sequence_length):with tf.name_scope("get_last_output"):batch_size = tf.shape(output)[0]max_length = tf.shape(output)[-2]out_size = int(output.get_shape()[-1])index = tf.range(0, batch_size)*max_length + (sequence_length-1)flat = tf.reshape(output, [-1, out_size])last_output = tf.gather(flat, index)return last_output

3、融合层(Aggregated Layer)和预测层(Predict Layer)

在这一层中,我们将上文得到的两个句子的句子表征向量进行拼接([P,H,P*H,P-H]),然后通过两个全连接层去预测,两个句子是否存在蕴含关系。

with tf.variable_scope("output_layer"):aggregated_representation = tf.concat([last_one_output, last_two_output, last_one_output*last_two_output, last_one_output-last_two_output], axis=-1)predict_one_layer = tf.layers.dense(aggregated_representation,units=aggregated_representation.get_shape().as_list()[1],activation=tf.nn.tanh,name="predict_one_layer")d_predict_one_layer = tf.layers.dropout(predict_one_layer, rate=self.dropout_rate, training=self.is_train, name="predict_one_layer_dropout")self.predict_two_layer = tf.layers.dense(d_predict_one_layer, units=2,  name="predict_two_layer")self.y_pred = tf.nn.softmax(self.predict_two_layer, name="scores")self.predictions = tf.arg_max(self.y_pred, axis=1, name="predictions")

三、总结

本人认为,孪生网络的精髓就是两个编码器的参数共享,而孪生网络做文本蕴含应该是文本蕴含的开端;像是BiMPM、DIIN和ESIM,都是孪生网络的改进版,对其编码后的句子向量不是做简单的拼接,而是对其进行注意力提取和句子信息交互,使其结果更好。

以上就是我对孪生网络的理解,如果有不对的地方,请大家见谅并多多指教。

孪生网络图像相似度_文本蕴含之孪生网络(Siamese Network)相关推荐

  1. 孪生网络图像相似度_生成对抗网络的进步多大,请看此文

    全文共4175字,预计学习时长8分钟 最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024x1024的高清图 ...

  2. 孪生网络图像相似度_孪生网络:使用双头神经网络进行元学习

    深度神经网络有一个大问题-他们一直渴望数据. 当数据太少时(无法到达算法可以接受的数量)深度神经网络很难推广. 这种现象突出了人类和机器认知之间的差距. 人们可以通过很少的训练示例来学习复杂的模式(尽 ...

  3. 孪生网络图像相似度_论文浅尝 | 使用孪生BERT网络生成句子的嵌入表示

    论文笔记整理:吴杨,浙江大学计算机学院,知识图谱.NLP方向. https://www.ctolib.com/https://arxiv.org/abs/1908.10084 动机 谷歌的 BERT ...

  4. 网络切片技术缺点_一文读懂网络切片和服务质量(QoS)的差异

    网络切片几乎在5G出现的每个行中都有提及,但通常情况下其定义是模糊的.网络切片究竟是什么,它与已经存在多年的服务质量(QoS)有何不同? 网络切片是一种特定的虚拟化形式,允许多个逻辑网络在共享的物理网 ...

  5. 网络切片技术缺点_一文读懂网络切片 - 技术综合版块 - 通信人家园 - Powered by C114...

    在各种新兴业务不断涌现的今天,现有的4G LTE网络已经无法满足日益增多的业务需求,因此未来的网络需要通过网络切片技术从"one size fits all"向"one ...

  6. python jieba 文本相似度_文本相似度分析(基于jieba和gensim)

    ##基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensi ...

  7. python词组语义相似度_文本匹配,语义相似度,匹配相似短语/单词python语义wordNet模糊匹配...

    通过使用wordnet文本匹配,我意识到wordnet只能将一个单词与一个单词进行匹配.它不能将一个单词与一个短语相匹配.在 如你所见,我有两个清单.在list1=['fruit', 'world'] ...

  8. python关系图谱_文本分析之制作网络关系图

    最近忙于学术,公众号更新的有点慢了,在这里给大家个歉,希望大家能继续支持我.由于学术需要,未来一段时间,我以后会有一些文本分析的脚本要出现,希望大家喜欢. 目前简单的文本分析已经满足我人物需要,所以还 ...

  9. python词汇网络分析_文本分析之制作网络关系图——Python

    今天给大年夜家带来我一个脚本,用来分析社会收集关系. 这个图我没有效到gephi或者其他的对象,是我用python纯脚本运行出来的.简单的实现了封装,大年夜家有兴趣可以下载下脚本,运行下. 1.建好小 ...

  10. python绘制社会关系网络图_文本分析之制作网络关系图——Python

    今天给大家带来我一个脚本,用来分析社会网络关系. 这个图我没有用到gephi或者其他的工具,是我用python纯脚本运行出来的.简单的实现了封装,大家有兴趣可以下载下脚本,运行下. 原理知识 我就简单 ...

最新文章

  1. 解决 Error:No suitable device found: no device found for connection quot;System eth0quot;
  2. 复杂存储过程学习_对象存储在无人驾驶高精度地图的场景实践
  3. socket编程实现文件传输功能
  4. 探索cqrs和事件源_编写基于事件的CQRS读取模型
  5. AI应用开发基础傻瓜书系列3-激活函数和损失函数
  6. IDEA远程调试Tomcat
  7. 《阿凡达》3月12日内地重映:部分影院已开启预售
  8. java接收参数_javaWeb收传参数方式总结
  9. C/C++中break、return、continue和goto在循环语句中的使用
  10. Postman都脱单了,我决定用他女朋友Postwoman了
  11. 水文方面数据产品总结1
  12. Selective Search for Object Recoginition(转)
  13. 2022建筑电工(建筑特殊工种)考试模拟100题及模拟考试
  14. Verilog 语法小结
  15. python计算日期是一年中的第几天,Python根据年月日,计算是一年的第几天
  16. Win10 笔记本 共享 wifi 热点
  17. 我国第一部机载脉冲火控雷达研制历程
  18. python彩色蟒蛇绘制代码_Python中用绘图库绘制一条蟒蛇
  19. 梯度类算法原理:最速下降法、牛顿法和拟牛顿法
  20. Android 获取联系人姓名与电话号码

热门文章

  1. 论文文献引用格式总结整理
  2. windows驱动开发 DDK/WDK/WDM/WDF区别
  3. flash Android 11.5,增强稳定性 Flash Player 11.5已发布
  4. 算法系列之二十三:离散傅立叶变换之音频播放与频谱显示
  5. vue 中 使用 clipboard 复制内容第一次点击两次才能成功问题修改
  6. 解决Iframe嵌入帆软BI系统后,Chrome升级后跨域出现登录界面,Cookie写入不成功。解决办法
  7. PHP毕业设计源码带论文和答辩、大作业、实例程序源码下载合集【21套】
  8. Maven开发笔记(三)—— Maven中dependencies和dependencyManagement
  9. android 微信 语音转文字,微信语音转文字功能
  10. 小米wifi linux 客户端下载,小米无线wifi安装_小米无线wifi客户端下载[最新版]-下载之家...