北京网页网站设计,做网站的介绍,广州网络营销公司排名,网站qq弹窗基本概念
孪生网络#xff08;Siamese Network#xff09;是一类神经网络结构#xff0c;它是由两个或更多个完全相同的网络组成的。孪生网络通常被用于解决基于相似度比较的任务#xff0c;例如人脸识别、语音识别、目标跟踪等问题。
孪生网络的基本思想是将输入数据同时…基本概念
孪生网络Siamese Network是一类神经网络结构它是由两个或更多个完全相同的网络组成的。孪生网络通常被用于解决基于相似度比较的任务例如人脸识别、语音识别、目标跟踪等问题。
孪生网络的基本思想是将输入数据同时输入到两个完全相同的神经网络中这两个网络共享相同的权重和参数。通过学习输入数据在这两个网络中的表示孪生网络可以计算出两个输入样本之间的相似度。处理过程如下
将两个输入样本通过各自的神经网络得到两个表示向量。使用一种度量方法例如欧氏距离、余弦相似度等计算这两个向量之间的相似度得分。根据相似度得分进行分类或回归等操作。
细节
训练一个孪生网络首先要有一个大的分类数据集数据有标注每一类下面有很多的样本。比如下面的数据集有5类分别是哈士奇大象老虎鹦鹉汽车。 基于这个训练集我们要构造正样本Positive Samples和负样本Negative Samples。正样本可以告诉神经网络哪些事物是同一类负样本可以告诉神经网络事物之间的区别。给正样本打上标签1表示同一类负样本打上标签0表示不同类。如下图所示这些样本都是从上面的分类数据集里随机抽样出来的。 然后我们可以搭一个神经网络来提取特征比如做两次卷积最后得到特征向量 f ( x ) f(x) f(x)。
将输入的 x 1 x_{1} x1和 x 2 x_{2} x2送入我们搭建的神经网络 f ( ⋅ ) f(·) f(⋅)得到特征向量 h 1 h_{1} h1和 h 2 h_{2} h2然后将这两个向量相减再求绝对值得到向量 z ∣ h 1 − h 2 ∣ z\left | h_{1}-h_{2} \right | z∣h1−h2∣表示这两个向量之间的区别再通过一个或一些全连接层最后用Sigmoid激活函数将值映射到0到1之间。 这个最终的输出 s i m ( x 1 , x 2 ) sim(x_{1},x_{2}) sim(x1,x2)就可以用来衡量两个图片之间的相似度Similarity。如果两个图片相似输出应该接近1如果不同则应该接近0。
上面提到过样本是有标签的1表示同一类0表示不同类。结合标签和刚才的输出 s i m ( x 1 , x 2 ) sim(x_{1},x_{2}) sim(x1,x2)就能选择一个损失函数Loss来计算损失接着就是老一套的梯度下降和反向传播。反向传播首先更新全连接层的参数然后进一步传播到卷积层的参数如下图所示。 通过不断的迭代最终得到一个效果较好的网络。通过这个网络我们就可以让机器具有对比事物的能力为后续的小样本学习奠定基础。
Triplet Loss
Triplet Loss是另一种训练Siamese Network的方法。它也需要有和上面一样的分类数据集。基于这个数据集我们需要构造一个三元组。从数据集里随机选取一个图片作为锚点 x a x^{a} xaanchor然后在和它相同类别的数据中随机选一个不同的图片作为正样本 x x^{} xpositive在不同类别的数据中随机选一个作为负样本 x − x^{-} x−negative。
和前面一种方法一样得到三元组的样本之后也通过一个神经网络提取特征分别得到特征向量 f ( x ) , f ( x a ) , f ( x − ) f(x^{}),f(x^{a}),f(x^{-}) f(x),f(xa),f(x−)。然后分别计算正样本和负样本与锚点之间的距离二范数的平方得到 d d^{} d和 d − d^{-} d−。整个过程如下图所示。 由于正样本和锚点是同一类所以 d d^{} d应该小负样本和锚点是不同类 d − d^{-} d−应该大。并且 d d^{} d要尽可能小 d − d^{-} d−要尽可能大使得他们容易区分。呈现在特征空间里就是下面这个样子。 基于上面这种想法我们可以得到 d − ≥ d m a r g i n ( m a r g i n 0 ) d^{-}\ge d^{}margin(margin0) d−≥dmargin(margin0)然后就可以定义损失函数 L o s s m a x ( d − d − m a r g i n , 0 ) Lossmax(d^{}-d^{-}margin, 0) Lossmax(d−d−margin,0)。当 d d^{} d明显小 d − d^{-} d−明显大时这就是我们所追求的目标没必要让梯度再更新了。此时max的第一项小于0整体Loss等于0正好梯度不会变化。当 d d^{} d和 d − d^{-} d−接近甚至大于时Loss保留的就是第一项的正值于是就会让梯度继续更新寻求一个更小值。
至于为什么要设置margin是为了避免模型走捷径将负样本和正样本的嵌入向量训练成很相近。因为如果没margin只要 d d − d^{}d^{-} dd− 就可以让Loss一直为0一直满足训练目标但此时模型很难正确区分正例和负例。