摘要
Siamese网络
用途,原理,如何训练?
背景
在人脸识别中,存在所谓的one-shot问题
。举例来说,就是对公司员工进行人脸识别,每个员工只给你一张照片(训练集样本少),并且员工会离职、入职(每次变动都要重新训练模型)。有这样的问题存在,就没办法直接训练模型来解决这样的分类问题了。
为了解决one-shot问题
,我们会训练一个模型来输出给定两张图像的相似度,所以模型学习得到的是similarity函数
。
哪些模型能通过学习得到similarity函数
呢?Siamese网络
就是这样的一种模型。
Siamese网络
原理
Siamese网络
要给出输入图像X1和X2的相似度,所以它必须能接受两个图像作为输入,如下图:
图中上下两个模型,都由CNN构成,两个模型的参数值完全相同。不同于传统CNN的地方,是Siamese网络
并不直接输出类别,而是输出一个向量(比如上图中是128个数值组成的一维向量):
- 若输入的图像X1和X2为同一个人,则上下两个模型输出的一维向量欧氏距离较小
- 若输入的图像X1和X2不是同一个人,则上下两个模型输出的一维向量欧氏距离较大
所以通过对上下两个模型输出的向量做欧氏距离计算,就能得到输入两幅图像的相似度。
又因为上下两个模型具有相同的参数,所以训练模型时,只需要训练一个模型即可。那问题来了,这样的模型该怎么训练呢?模型的输出label该标注为什么呢?
如何训练Siamese网络
模型的训练,就是给定cost function
后,用梯度下降法
寻找最优值的过程。
训练Siamese网络
,需要引入新的cost function
。我们先看模型的学习目标(下图),再一步一步讲解cost function
的最终表达式。
对图中的一幅照片A,如果给定了同一个人的另一幅照片P,则模型的输出向量f(A)和f§应该是距离比较小的。如果给定了另一个人的照片N,则模型的输出向量f(A)和f(N)之间的距离就比较小。所以d(A,P)<d(A,N)。
根据这个目标,就得到了cost function
的定义:
其目的,是遍历所有三元组(A,P,N),求其L的最小。公式中的参数α,是一个超参数,用于做margin,能避免模型输出的都是零向量。
有了这个cost function
,用梯度下降法
就能找到模型的最优值。这个过程是不需要我们对模型的向量值进行人工标注的。
参考
- https://www.cv-foundation.org/openaccess/content_cvpr_2015/ext/1A_089_ext.pdf
- Andrew NG, CNN, chapter-04