元学习——连体网络(Siamese Network)
1 概念和结构
1.1 引入
在介绍连体网络之前,我们首先来介绍单样本学习:
**单样本学习:**所谓的单样本学习是我们对于每一个分类使用一个样本进行学习。
这种单样本学习的方式在我们实际上经常出现,举一个例子来说,假设我们需要构建一个人脸识别的系统中,我们的目标是识别500个人的人脸。但是我们手里面的数据只有500份,也就是每一个人拥有一张图片作为训练数据。在这个时候,如果我们想要使用CNN神经网络进行识别,我们需要很多的训练图片才能够对这500个人的识别起到很好的效果。换句话来说,如果没有足够的训练数据,这种使用CNN神经网络或者其他的神经网络形式是不合适的。
此时,我们的连体网络就出现了,连体网络是一种特殊的神经的网络的结构,它是目前最为简单的使用单样本学习的算法。在不同的场景下,我们可以利用类似于连体网络这种可以从少量样本学习的网络结构来进行学习。
下面,我们来介绍连体网络的基本结构。
1.2 基本结构
首先,连体网络的基本结构是一个对称网络,两个对称的部分共享相同的权重,并且两个部分拥有相同的结构。最后,使用一些功能函数E将两个部分连接起来。连体网络的目标是学习到两个部分的输入是相同的或者不同的。举个例子来说,我们使用两个图片 X 1 , X 2 X_1,X_2 X1,X2作为输入,我们的目标就是学习到这两个图片是否相同。下面,我们给出其基本的结构图示:
接着我们上面小例子,我们使用
X
1
X_1
X1和
X
2
X_2
X2分别作为两个神经网络的输入,经过两个神经网络的操作之后,每一个神经网络可以每一个输入图片生成一个结果向量,这个过程可以看成是一个编码的过程,这个编码的过程使用的神经网络并没有特殊的限制,只需要抽取到特征即可。例如,我们使用的是CNN的网络结构来抽取两个输入的特征。但是我们不会直接对输入进行分类。并且两个神经网络使用的是相同的特征权重和网络结构。也就是说,如果网络1采用的是三层的卷积神经网络,那么网络2采用的也是三层的卷积神经网络,并且两个卷积神经网络的权重完全相同。获得输入之后。网络1和网络2会给出两个输入的特征向量。最后,我们将这两个向量输入到功能函数E中,通过功能函数E,我们可以确定两个图片之间的相似情况。功能函数E的实现形式可以是任何的相似度的衡量函数,例如
欧氏距离,Cos相似度等等。
最后,在理解了这种网络的整体结构之后,我们能够确定的是,这种连体网络结构不仅仅可以使用到人脸分类上,而且同时也可以应用到其他的小数据集并且需要学习到不同输入相似度的任务上,例如签名验证,类似问题检索等等
2 连体神经网络(Siamese Network)
通过上一节的内容,我们对于连体神经网络有了一定了解,在接下来的内容中,我们开始讲述这种神经网络的具体细节。
2.1 从一个例子开始
为了便于讨论连体神经网络的细节,我们从一个具体的例子来开始。假设,我们的任务是判断两个句子的相似性。此时,我们分别将两个句子作为输入,通过两个相同结构,相同参数的LSTM网络进行编码,然后生成两个句子的特征向量,最后我们使用欧式距离来判断相似情况。我们先给出整个网络的架构:
在理解力连体网络的基本结构之后,我们下面需要讨论这样几个问题:
- 如何训练这种网络结构?(下一节以具体例子来讲解)
- 如何定义Label?
- 目标函数应该如何定义?
2.2 如何确定Label?
在上面的一个小节中,我们明确了输入应该是一个句子对 ( X 1 , X 2 ) (X_1,X_2) (X1,X2),而我们的目标是判断两个句子是否相同。此时,如果两个句子类似,我们就将两个句子的Label定义为1,如果不相似,我们将Label定义为0。我们下面举几个例子来展示一下:
- 今天的天气不错,今天的天气很好,1
- 今天我没有吃饭,昨天他没有吃饭,0
- 糖尿病是一种疾病,糖尿病人需要注射胰岛素,0
2.3 如何确定目标函数
在理解数据的形式和对应的Label之后,我们下面要讨论的就是应该如何定义损失函数。我们在定义这种损失函数的时候,需要知道的是,网络结构的目标不是应对某一个具体的任务,而是需要来判断两个输入直接的相似度情况。因此,我们使用对比损失函数,其基本的表现形式为:
C
o
n
t
r
a
s
t
i
v
e
L
o
s
s
=
Y
(
E
)
2
+
(
1
−
Y
)
m
a
x
(
m
a
r
g
i
n
−
E
,
0
)
2
Contrastive Loss=Y(E)^2+(1-Y)max(margin-E,0)^2
ContrastiveLoss=Y(E)2+(1−Y)max(margin−E,0)2
在上述的公式中,Y函数用来判断两个输入直接是否相似,如果相似,则Y函数的输出为1,如果两者不相似则Y函数的输出为0。其中E表示的是我们的功能函数,其可以是任何的一种距离度量函数。其中Margin项用于保持约束,当两个输入不相似,或者两个输入距离结构超过了Margin,就不会产生损失。
3 连体网络(Siamese Networks)的应用
3.1 两篇Paper
对于连体神经神经网络第一篇Paper,作者主要将其应用到验证签名的对比任务中。这种任务的目标是确定一个用户的签名。因此,文章的作者使用了连体网络和正例对(相似)和负例对(不相似)来进行训练。在特征抽取的过程中,作者使用的是CNN的网络结构。在相似性度量中,作者使用的是距离函数来进行度量。最后,当一个签名被输入的时候,网络将提前储存好的其他签名也输入组成签名对作为网络结构的输入,如果两个签名的距离度量小于一定的阈值,我们将这个签名视为一个用户的签名并接受这个签名。否则我们将拒绝这个签名。
在第一次将连体网络应用到的Paper中,作者主要是将连体网络应用到计算两个文档额相似度的任务中。在特征抽取中使用的是双层的单元,同时使用Cos相似度作为功能函数E来计算两个文本之间的相似度情况。
对于连体网络的应用还有很多,包括人类的行为识别,情景改变检测和机器翻译的过程中。
4 总结
通过上面的叙述,我们可以对于连体网络有一个具体的了解。总的来讲,连体神经整体的结构很简单,并且其在样本相似度对比的任务中有着广泛的应用。在下一篇文章中,我们将来以一个人脸识别的项目来具体的了解网络的训练和学习过程。
5 参考
- Hands-On Meta Learning with Python