摘要

Siamese网络用途,原理,如何训练?

背景

在人脸识别中,存在所谓的one-shot问题。举例来说,就是对公司员工进行人脸识别,每个员工只给你一张照片(训练集样本少),并且员工会离职、入职(每次变动都要重新训练模型)。有这样的问题存在,就没办法直接训练模型来解决这样的分类问题了。

为了解决one-shot问题,我们会训练一个模型来输出给定两张图像的相似度,所以模型学习得到的是similarity函数

哪些模型能通过学习得到similarity函数呢?Siamese网络就是这样的一种模型。

Siamese网络原理

Siamese网络要给出输入图像X1和X2的相似度,所以它必须能接受两个图像作为输入,如下图:

详解Siamese网络-LMLPHP

图中上下两个模型,都由CNN构成,两个模型的参数值完全相同。不同于传统CNN的地方,是Siamese网络并不直接输出类别,而是输出一个向量(比如上图中是128个数值组成的一维向量):

  • 若输入的图像X1和X2为同一个人,则上下两个模型输出的一维向量欧氏距离较小
  • 若输入的图像X1和X2不是同一个人,则上下两个模型输出的一维向量欧氏距离较大

所以通过对上下两个模型输出的向量做欧氏距离计算,就能得到输入两幅图像的相似度。

详解Siamese网络-LMLPHP

又因为上下两个模型具有相同的参数,所以训练模型时,只需要训练一个模型即可。那问题来了,这样的模型该怎么训练呢?模型的输出label该标注为什么呢?

如何训练Siamese网络

模型的训练,就是给定cost function后,用梯度下降法寻找最优值的过程。

训练Siamese网络,需要引入新的cost function。我们先看模型的学习目标(下图),再一步一步讲解cost function的最终表达式。

详解Siamese网络-LMLPHP

对图中的一幅照片A,如果给定了同一个人的另一幅照片P,则模型的输出向量f(A)和f§应该是距离比较小的。如果给定了另一个人的照片N,则模型的输出向量f(A)和f(N)之间的距离就比较小。所以d(A,P)<d(A,N)。

根据这个目标,就得到了cost function的定义:

详解Siamese网络-LMLPHP

其目的,是遍历所有三元组(A,P,N),求其L的最小。公式中的参数α,是一个超参数,用于做margin,能避免模型输出的都是零向量。

有了这个cost function,用梯度下降法就能找到模型的最优值。这个过程是不需要我们对模型的向量值进行人工标注的。

参考

12-05 15:13