精华内容
下载资源
问答
  • 孪生网络又可以分为孪生网络和伪孪生网络,这两者的定义:孪生网络:两个网络结构相同且共享参数,当两个句子来自统一领域且在结构上有很大的相似度时选择该模型;伪孪生网络:两个网络结构相同但不共享参数,或者两...
  • 针对全卷积孪生(SiamFC)网络算法在相似目标共存和目标外观发生显著变化时跟踪失败的问题,提出一种基于注意力机制的在线自适应孪生网络跟踪算法(AAM-Siam)来增强网络模型的判别能力,实现在线学习目标外观变化并抑制...
  • 其中,我采用的是类似于孪生网络的结构提取特征向量。在此之前,孪生网络已经成功运用到了图像的局部匹配领域和人脸对比验证,但是还没有应用于图像的大规模匹配。我通过大量实验验证,提出的图像匹配方法的性能远...
  • 同时,我也进行了大量的数据测试,结果证明,采用孪生网络进行图像匹配具有非常大的优势。 图1.缩略图。我的目标在于学习一个通用的相似性测度函数,并应用于图像匹配中。为了编码这样一个函数,我大量探索了卷积...
  • 翻译的文章为应用于目标跟踪领域里的另一算法分支方向——孪生网络,希望大家多多交流、切磋!
  • 主要介绍了keras实现基于孪生网络的图片相似度计算方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 2021年数字孪生网络(DTN)白皮书(高清正式版)
  • 主要介绍了keras的siamese(孪生网络)实现案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 提出一种适用于图像块匹配的的图像描述子(名字起的很好听,convolutionaldescriptor,卷积描述子)。图匹配是很多计算机视觉应用领域非常基础的问题。从最近深度学习在目标检测和分类任务取得的成功受到了启发。...
  • 主要介绍了使用keras实现孪生网络中的权值共享教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 基于孪生网络的实时目标跟踪算法综述 目标追踪任务 目标追踪任务是指在一个视频中给出第一帧图像的bbox的位置在后续的帧中追踪该物体的任务 目标追踪不同于目标检测的是 1需要给出首帧的标定框2只需要给出标定框后续...
  • 针对非重叠多摄像头下的行人重识别(Person Re-identification,Re-ID)依然受到光照、姿势及遮挡等影响和实验过程中存在图像错误匹配的情况,提出一种基于孪生网络和重排序的行人重识别方法。给定一对行人训练图像,...
  • 目标跟踪系列汇报ppt,包含目标跟踪研究现状,孪生网络用于目标跟踪的发展史,各孪生网络的介绍,着重介绍SiamRPN++论文。
  • 在mnist数据集上简单实现了孪生网络的tensorflow代码,包括训练过程,测试过程和图示过程。代码包中自带图像,可以直接运行。
  • 图一SiamNet网络结构。搜索区域x,输出的是一个得分图,所谓的得分就是相似度度量,得分图的维度是由搜索图像块决定(样本模板和搜索区域进行密集交叉相关...本文中作者将一个全新的全卷积孪生网络fully-convolutionalSi
  • comment:利用孪生网络的匹配能力进行跟踪,这种思想不难想到。跟踪的很大的一个分支就是基于目标检测(匹配)的跟踪。在以后相当长的一段时间里,基于孪生网络的跟踪方案并解决长时间(long-term)问题一定是跟踪...
  • 为解决传统基于深度学习的调制识别算法在小样本条件下识别准确率较低的问题,提出一种基于深度级联孪生网络的通信信号小样本调制识别算法。根据通信信号时序图的时空特性,设计由卷积神经网络和长短时记忆网络级联的...
  • 分享一份孪生网络数据集,供初学者使用 内含已经切分好的训练集、验证集和测试集 格式为: q1,q2,tag
  • 孪生网络.pptx

    2019-06-24 16:40:35
    本文档是我在学校学校开设的课程智能计算里面做的汇报,主要是讲的是孪生网络,包括基本原理,优缺点,以及发展应用等等
  • 利用卷积神经网络在欧式空间下学习高效性能的描述子descriptor。的方法在四个方面与众不同,1.我们提出了一种渐进的抽样策略,使网络能够在几次的时间内访问数十亿的训练样本。2.从局部匹配问题的基本概念派生而来,...
  • 最近一直在分享自然语言推理和文本蕴含的相关论文,并且之前已经分享过三篇,分别是bilateral multi-perspective matching (BiMPM)模型、Enhanced Sequential...这次分享一下最经典的文本蕴含模型,也就是孪生网络...

    26c43c7164500e7529e3daa493963230.png

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

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

    一、背景介绍

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

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

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

    4293628ffc4f90e75f95c13ae5adfafc.png
    图1 基于孪生网络的图像相似度求解图

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

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

    72e06c23226966bf8dcc8a9863cf1aad.png
    图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_dim
            self.rnn_hidden_size = config.rnn_hidden_size
            self.fine_tune_embedding = config.fine_tune_embedding
            self.num_sentence_words = config.max_length_content
            self.learning_rate = config.learning_rate
            self.rnn_layers = config.rnn_layers
            
            with 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,都是孪生网络的改进版,对其编码后的句子向量不是做简单的拼接,而是对其进行注意力提取和句子信息交互,使其结果更好。

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

    展开全文
  • 孪生网络

    千次阅读 2019-02-20 20:03:43
    孪生网络(Siamese network) 孪生神经网络用于处理两个输入"比较类似"的情况。 比如,我们要计算两个句子或者词汇的语义相似度,使用siamese network比较适合; 伪孪生网络(pseudo-siamese ...

    孪生网络(Siamese network)

    孪生神经网络用于处理两个输入"比较类似"的情况。
    比如,我们要计算两个句子或者词汇的语义相似度,使用siamese network比较适合;

    伪孪生网络(pseudo-siamese network)

    伪孪生神经网络适用于处理两个输入"有一定差别"的情况。
    如果验证标题与正文的描述是否一致(标题和正文长度差别很大),或者文字是否描述了一幅图片(一个是图片,一个是文字),就应该使用pseudo-siamese network。

    ## Siamese network loss function一般用哪一种呢?

    Softmax当然是一种好的选择,但不一定是最优选择,即使是在分类问题中。传统的siamese network使用Contrastive Loss。损失函数还有更多的选择,siamese network的初衷是计算两个输入的相似度,。左右两个神经网络分别将输入转换成一个"向量",在新的空间中,通过判断cosine距离就能得到相似度了。Cosine是一个选择,exp function也是一种选择,欧式距离什么的都可以,训练的目标是让两个相似的输入距离尽可能的小,两个不同类别的输入距离尽可能的大。

    Siamese network的用途有哪些?

    这个可以说太多了,nlp&cv领域都有很多应用。

    前面提到的词汇的语义相似度分析,QA中question和answer的匹配,签名/人脸验证。
    手写体识别也可以用siamese network,网上已有github代码。
    还有kaggle上Quora的question pair的比赛,即判断两个提问是不是同一问题,冠军队伍用的就是n多特征+Siamese network,知乎团队也可以拿这个模型去把玩一下。
    在图像上,基于Siamese网络的视觉跟踪算法也已经成为热点《Fully-convolutional siamese networks for object tracking》。

    作者:fighting41love
    链接:https://www.jianshu.com/p/92d7f6eaacf5
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    当网络做单样本学习(One-shot learning)的时候,孪生网络简单的分类一下测试图像与训练集中的图像中哪个最相似就可以了。

    展开全文
  • 1,概述在NLP中孪生网络基本是用来计算句子间的语义相似度的...孪生网络又可以分为孪生网络和伪孪生网络,这两者的定义:孪生网络:两个网络结构相同且共享参数,当两个句子来自统一领域且在结构上有很大的相似度时...

    1,概述

    在NLP中孪生网络基本是用来计算句子间的语义相似度的。其结构如下

    b0510a1fed29152ae4ae78bd1f875d93.png

    在计算句子语义相似度的时候,都是以句子对的形式输入到网络中,孪生网络就是定义两个网络结构分别来表征句子对中的句子,然后通过曼哈顿距离,欧式距离,余弦相似度等来度量两个句子之间的空间相似度。

    孪生网络又可以分为孪生网络和伪孪生网络,这两者的定义:

    孪生网络:两个网络结构相同且共享参数,当两个句子来自统一领域且在结构上有很大的相似度时选择该模型;

    伪孪生网络:两个网络结构相同但不共享参数,或者两个网络结构不同,当两个句子结构上不同,或者来自不同的领域,或者时句子和图片之间的相似度计算时选择该模型;

    另外孪生网络的损失函数一般选择Contrastive loss Function(对比损失函数)。接下来具体看看孪生网络在句子语义相似度计算中的几篇论文:

    2,论文模型介绍

    1)Siamese CBOW: Optimizing Word Embeddings for Sentence Representations

    该论文提出了一种基于孪生网络+CBOW的方式来无监督式的训练句子的向量表示。网络的结构图如下:

    dcb3e1b5c245446476b1e192ab4043b8.png

    首先给定一个很大的语料库,语料库中的句子要保持原来文章中的顺序,那我们该怎么将这个无监督的任务构造成有监督式的任务呢?看论文中这个CBOW,其实就是采用了类似word2vec中的CBOW的形式来构造有监督式的任务的。我们给定一个中心句子si,然后将中心句子的上下句作为正样本(即和中心句子相关的句子),然后从其他句子中随机选择n个句子作为负样本,以论文中为例,负样本也选择2个。因此就构造成了这样一个句子集合

    a7889eb3c6c816fc046003c81937f7a9.png

    ,那么这样一个句子集合就作为一个样本输入到模型中,以这里的例子为例,就构造成了一个具有5个相同结构相同参数的网络来处理这5个句子。有了样本之后,标签该怎么定义呢?在这里的真实标签定义如下:

    e5dcdba3e4136e6c6e2b0b3575b9bb22.png

    上面式子中的S+,S?分别表示正样本句子集合和负样本句子集合。因此真实标签是服从概率分布的。接下来我们看看预测标签该怎么定义,其定义如下:

    a88b91f5f6d83625059e9a740c44f2e9.png

    上面式子为预测标签的概率分布(softmax后的结果),其中sθi是句子si的向量表示,那么问题来了,这个句子向量是怎么得到的呢?其实模型的输入最小粒度是词,在这里会用一个词嵌入矩阵(词向量)来将每个词映射到低维向量,然后对句子中的词向量取平均来表示句子的向量。之后再计算中心句子si和其他句子的余弦相似度,然后经过softmax得到预测的概率分布。既然真实标签和预测标签都服从概率分布,那么损失函数就可以直接用交叉熵了,因此损失函数如下:

    dc37311736d53a9edcc4e31939ca685a.png

    其实这里整个模型被训练的参数只有一开始的词嵌入矩阵,也就是说我们这个模型最终训练的到的也就是一个词向量,但因为目标任务是计算句子的相似度,而且损失函数的构造也是来建模句子之间的关系,因此个人人为这种方式获得的词向量,通过取平均的方式能更好的表示句子向量。因此在句子相似度的任务上的效果也是优于word2vec词向量的。

    2)Siamese Recurrent Architectures for Learning Sentence Similarity

    上面介绍了一种无监督的方式,接下来的模型都是有监督的。 本论文提出了一种MaLSTM的网络结构,其网络结构如下:

    7d9b7caf686681917fb73beb19e5c167.png

    其实网络结构是并没什么新意,其具体如下:

    1)通过两个LSTM网络(可以是孪生网络,也可以是伪孪生网络)来处理句子对,取LSTM最后时刻的输入作为两个句子的向量表示。

    2)用曼哈顿距离来度量两个句子的空间相似度。

    论文中没有提到用了什么损失函数,但一般孪生网络的损失函数都是Contrastive loss function。这个我们在下面再介绍,至于在这里作者为什么选择曼哈顿距离,作者认为欧式距离容易出现梯度消失。而且在实验中显示效果也是优于余弦相似度的,对于这个度量选择,个人认为还是以自己的实际项目来选择,并不存在一个绝对的好坏。

    3)Learning Text Similarity with Siamese Recurrent Networks

    该论文同样是用LSTM来处理句子对,其网络结构如下:

    a67e0c44663cc766c972c6951256a28c.png

    在这里将句子对的关系看作是一个二分类的问题,给定一个样本[x1,x2,y],在这里y的结果为[0,1],因此可以看作一个二分类问题,在这里的度量方式选择的是余弦相似度,其表达式如下:

    8a4483b7b74adc435ac994b64b2c4127.png

    损失函数用了Contrastive loss function,其表达式如下:

    a74ca7ed0c50f9141dc9c956b385e763.png

    从损失函数的形式上看类似于二元交叉熵损失函数,但是这里的L_并不等于1-L+,其表达式如下:

    123c0c0a8176429af0f6efbd639c9aa5.png

    其表示图如下:

    09f92f7fa08ee5b7dd48ad2a9bc60729.png

    注:从这里的图来看,上面的式子是有误的,EWm。

    我们来分析下上面的式子:假设现在是一个正样本,也就是y(i)=1,此时若预测的EW接近于1(即预测两个句子很相似),则整体损失很小,此时若预测的EW接近于-1(即预测两个句子不相似),则整体损失很大。假设现在是一个负样本,给定m=0.5,也就是y(i)=0,此时若预测的EW小于m,则损失为0,若预测的EW大于m,则损失很大。其实这个损失函数可以认为通过调整m的值,可以控制对句子相似度的苛刻度,m的值比较大时,会导致两个相似的句子的余弦相似度值是比较高的。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,964
精华内容 2,785
关键字:

孪生网络