一次性学习是一种分类任务,其中使用一个或少量示例来对未来许多新示例进行分类。
这描述了人脸识别领域中的任务,例如人脸识别和人脸验证,在这些任务中,必须根据一个或几个模板照片,对具有不同面部表情、光照条件、配饰和发型的人进行正确分类。
现代人脸识别系统通过学习一种丰富的低维特征表示(称为人脸嵌入),来解决人脸识别中的一次性学习问题,这种表示可以轻松计算人脸,并用于验证和识别任务。
历史上,嵌入是使用暹罗网络学习一次性学习问题的。使用对比损失函数训练暹罗网络可以获得更好的性能,后来导致 Google 在 FaceNet 系统中使用了三重损失函数,并在基准人脸识别任务中取得了当时的最新成果。
在这篇文章中,您将发现人脸识别中一次性学习的挑战,以及如何使用对比损失函数和三重损失函数来学习高质量的人脸嵌入。
阅读本文后,你将了解:
- 一次性学习是分类任务,其中每个类别只有一个(或少量)示例需要进行许多预测,人脸识别就是一次性学习的一个示例。
- 暹罗网络是一种解决一次性学习的方法,其中比较已知示例和候选示例的学习特征向量。
- 对比损失和后来的三重损失函数可用于学习高质量的人脸嵌入向量,这些向量为现代人脸识别系统提供了基础。
通过我的新书《深度学习计算机视觉》启动您的项目,其中包括逐步教程和所有示例的Python 源代码文件。
让我们开始吧。

使用暹罗网络、对比损失和三重损失进行人脸识别的一次性学习
摄影者:Heath Cajandig,保留部分权利。
概述
本教程分为四个部分;它们是
- 一次性学习与人脸识别
- 用于一次性学习的暹罗网络
- 用于降维的对比损失
- 用于学习人脸嵌入的三重损失
一次性学习与人脸识别
通常,分类涉及根据每个类别的许多示例拟合模型,然后使用拟合模型对每个类别的许多示例进行预测。
例如,我们可能有来自三种不同物种的数千个植物测量值。可以在这些示例上拟合模型,从给定物种测量值之间的共性中进行概括,并对比不同物种测量值之间的差异。希望结果是一个鲁棒模型,在未来给定一组新的测量值时,可以准确预测植物物种。
一次性学习是一种分类任务,其中每个类别给定一个示例(或非常少的示例),用于准备模型,然后该模型必须对未来许多未知示例进行预测。
在一次性学习的情况下,算法会收到一个对象类别的单个示例。
——《学习识别视觉对象类别的知识转移》,2006 年。
这对人类来说是一个相对简单的问题。例如,一个人可能只见过一次法拉利跑车,未来就能在新的场景中、路上、电影中、书中、以及不同光照和颜色下识别出法拉利。
人类在很少的监督下就能学习新概念——例如,一个孩子可以从书中的一张图片中概括出“长颈鹿”的概念——然而我们最好的深度学习系统需要数百甚至数千个示例。
——《用于一次性学习的匹配网络》,2017。
一次性学习与零样本学习相关,但有所不同。
这应该与零样本学习区分开来,在零样本学习中,模型不能查看目标类别的任何示例。
——《用于一次性图像识别的暹罗神经网络》,2015。
人脸识别任务提供了一次性学习的示例。
具体来说,在人脸识别的情况下,模型或系统可能只有一个人脸的一个或几个示例,并且必须从新的照片中正确识别人脸,而这些照片中表情、发型、光照、配饰等都可能发生变化。
在人脸验证的情况下,模型或系统可能只记录了一个人脸的示例,并且必须正确验证该人的新照片,可能每天都需要验证。
因此,人脸识别是一次性学习的常见示例。
想通过深度学习实现计算机视觉成果吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
用于一次性学习的暹罗网络
暹罗网络是一种因其在一次性学习中的应用而广受欢迎的网络。
暹罗网络是一种具有两个并行神经网络的架构,每个神经网络接受不同的输入,其输出结合起来提供一些预测。
它是一种为验证任务设计的网络,最初由 Jane Bromley 等人在 1993 年的论文《使用暹罗时间延迟神经网络进行签名验证》中提出。
该算法基于一种新颖的人工神经网络,称为“暹罗”神经网络。该网络由两个相同的子网络组成,在它们的输出端连接起来。
——《使用“暹罗”时间延迟神经网络进行签名验证》,1993 年。
使用两个相同的网络,一个接收已知签名,另一个接收候选签名。两个网络的输出被组合并评分,以指示候选签名是真实的还是伪造的。
验证包括将提取的特征向量与存储的签名者特征向量进行比较。与此存储表示接近度低于所选阈值的签名被接受,所有其他签名都被拒绝为伪造。
——《使用“暹罗”时间延迟神经网络进行签名验证》,1993 年。

暹罗网络用于签名验证的示例。
摘自:使用“暹罗”时间延迟神经网络进行签名验证。
暹罗网络最近再次被使用,Gregory Koch 等人在 2015 年的论文《用于一次性图像识别的暹罗神经网络》中,将深度卷积神经网络并行应用于图像输入。
深度 CNN 首先被训练以区分每个类别的示例。其思想是让模型学习能够有效从输入图像中提取抽象特征的特征向量。

用于训练暹罗网络的图像验证示例。
摘自:《用于一次性图像识别的暹罗神经网络》。
然后,这些模型被重新用于验证,以预测新示例是否与每个类别的模板匹配。
具体来说,每个网络都会为输入图像生成一个特征向量,然后使用 L1 距离和 sigmoid 激活函数进行比较。该模型应用于计算机视觉中使用的基准手写字符数据集。

用于测试暹罗网络的一次性图像分类示例。
摘自:《用于一次性图像识别的暹罗神经网络》。
暹罗网络因其通过学习特征表示(特征向量)来解决一次性学习问题的方法而引人注目,这些特征表示随后用于验证任务。
DeepFace 是一个使用暹罗网络开发的人脸识别系统示例,由 Yaniv Taigman 等人在 2014 年的论文《DeepFace:弥合人脸验证与人类水平性能的差距》中描述。
他们的方法首先训练模型进行人脸识别,然后移除模型的分类器层,并使用激活作为特征向量,然后计算和比较两个不同人脸的特征向量,以进行人脸验证。
我们还测试了一种端到端度量学习方法,称为暹罗网络:一旦学习完成,人脸识别网络(不带顶层)会复制两次(每个输入图像一次),然后使用这些特征直接预测两个输入图像是否属于同一个人。
——《DeepFace:弥合人脸验证与人类水平性能的差距》,2014 年。
用于降维的对比损失
学习复杂输入(如图像)的向量表示是降维的一个示例。
降维旨在将高维数据转换为低维表示,使得相似的输入对象映射到流形上附近的点。
——《通过学习不变映射进行降维》,2006 年。
有效降维的目标是学习一种新的低维表示,该表示保留输入的结构,使得输出向量之间的距离有意义地捕获输入中的差异。然而,这些向量必须捕获输入中的不变特征。
问题是,在给定输入空间中样本之间的邻域关系的情况下,如何找到一个函数,将高维输入模式映射到低维输出。
——《通过学习不变映射进行降维》,2006 年。
降维是暹罗网络用于解决一次性学习的方法。
在 2006 年的论文《通过学习不变映射进行降维》中,Raia Hadsell 等人探讨了使用暹罗网络进行图像数据卷积神经网络降维,并提出了通过对比损失来训练模型。
与其他可能评估模型在训练数据集中所有输入示例上的性能的损失函数不同,对比损失是在输入对之间计算的,例如在提供给暹罗网络的两个输入之间。
将示例对提供给网络,损失函数根据样本类别是否相同而以不同方式惩罚模型。具体来说,如果类别相同,损失函数会鼓励模型输出更相似的特征向量;如果类别不同,损失函数则鼓励模型输出不太相似的特征向量。
对比损失需要人脸图像对,然后将正对拉近,将负对推开。[...]然而,对比损失的主要问题是边距参数通常难以选择。
——《深度人脸识别:一项调查》,2018 年。
损失函数要求选择一个边距,该边距用于确定不同对的示例被惩罚的限制。选择此边距需要仔细考虑,这是使用损失函数的一个缺点。

相似(红色)和不相似(蓝色)对的对比损失计算图。
摘自:通过学习不变映射进行降维
对比损失可用于训练人脸识别系统,特别是用于人脸验证任务。此外,这可以通过按顺序提供示例对并保存预测的特征向量,然后计算损失并更新模型,而无需使用暹罗网络架构中使用的并行模型。
DeepID2 及其后续系统(DeepID2+ 和 DeepID3)就是这样的例子,它们使用了深度卷积神经网络,但没有使用暹罗网络架构,并在基准人脸识别数据集上取得了当时的最新成果。
验证信号直接正则化 DeepID2,并能有效减少个体内部变异。常用的约束包括 L1/L2 范数和余弦相似度。我们采用基于 L2 范数的以下损失函数,该函数最初由 Hadsell 等人提出用于降维。
——《通过联合识别验证学习人脸表示》,2014 年。
用于学习人脸嵌入的三重损失
对比损失的思想可以从两个示例进一步扩展到三个,称为三重损失。
三重损失由 Google 的Florian Schroff 等人在其 2015 年论文《FaceNet:统一人脸识别和聚类的嵌入》中引入。
三重损失不是基于两个示例计算损失,而是涉及一个锚定示例、一个正匹配示例(同类)和一个负不匹配示例(不同类)。
损失函数对模型进行惩罚,使匹配示例之间的距离减小,非匹配示例之间的距离增大。
它需要人脸三元组,然后它最小化锚点和同一身份的正面样本之间的距离,并最大化锚点和不同身份的负面样本之间的距离。
——《深度人脸识别:一项调查》,2018 年。

应用三重损失前后锚点、正样本和负样本的影响示例。
摘自:《Facenet:人脸识别和聚类的统一嵌入》。
结果是一个特征向量,称为“人脸嵌入”,它具有有意义的欧几里得关系,使得相似的人脸产生距离较小(例如可以聚类)的嵌入,而同一个人脸的不同示例产生非常小的嵌入,从而允许验证并与其他身份进行区分。
这种方法是 FaceNet 系统的基础,FaceNet 在基准人脸识别数据集上取得了当时的最新成果。
在本文中,我们提出了一个名为 FaceNet 的系统,该系统直接学习从人脸图像到紧凑欧几里得空间的映射,其中距离直接对应于人脸相似度的度量。
——《Facenet:人脸识别和聚类的统一嵌入》,2015 年。
用于训练模型的 triplet 被仔细选择。
“简单”的 triplet 导致较小的损失,并且对更新模型无效。相反,寻找“困难”的 triplet,它们鼓励模型和预测的人脸嵌入发生变化。
选择使用哪些三元组对于获得良好性能非常重要,受课程学习的启发,我们提出了一种新颖的在线负样本挖掘策略,该策略确保在网络训练过程中三元组的难度持续增加。
——《Facenet:人脸识别和聚类的统一嵌入》,2015 年。
三元组是在线生成的,然后找到所谓的困难正例(匹配)和困难负例(不匹配)情况,并将其用于批量损失的估计。
选择“困难”的三元组至关重要,因为它们是活跃的,因此可以有助于改进模型。
——《Facenet:人脸识别和聚类的统一嵌入》,2015 年。
直接训练人脸嵌入(例如通过三重损失),并使用这些嵌入作为人脸识别和人脸验证模型(例如 FaceNet)的基础,是现代最先进的人脸识别方法的基础。
……对于从头开始训练的模型以及预训练的模型,使用三重损失的变体执行端到端深度度量学习,其性能远远优于大多数其他已发表的方法。
——《为行人重识别中的三重损失辩护》,2017。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
论文
- 学习识别视觉对象类别的知识转移, 2006.
- 用于一次性学习的匹配网络, 2017.
- 用于一次性图像识别的暹罗神经网络, 2015.
- 使用“暹罗”时间延迟神经网络进行签名验证, 1993.
- DeepFace:弥合人脸验证与人类水平性能的差距, 2014.
- 通过学习不变映射进行降维, 2006.
- 深度人脸识别:一项调查, 2018.
- 通过联合识别验证学习人脸表示, 2014.
- Facenet:人脸识别和聚类的统一嵌入, 2015.
- 为行人重识别中的三重损失辩护, 2017.
文章
总结
在这篇文章中,您发现了人脸识别中一次性学习的挑战,以及如何使用对比损失函数和三重损失函数来学习高质量的人脸嵌入。
具体来说,你学到了:
- 一次性学习是分类任务,其中每个类别只有一个(或少量)示例需要进行许多预测,人脸识别就是一次性学习的一个示例。
- 暹罗网络是一种解决一次性学习的方法,其中比较已知示例和候选示例的学习特征向量。
- 对比损失和后来的三重损失函数可用于学习高质量的人脸嵌入向量,这些向量为现代人脸识别系统提供了基础。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
我们能否在任何层内向任何神经网络,特别是卷积神经网络,添加外部函数公式进行微调?非常感谢。
当然可以。
有没有使用三重损失预训练的暹罗网络和权重?既然它学习的是相似性函数,我们就不需要在特定的数据集上训练它,对吗?
据我所知,没有。
也许可以看看这篇关于人脸识别的文章
https://machinelearning.org.cn/how-to-develop-a-face-recognition-system-using-facenet-in-keras-and-an-svm-classifier/
嗨,Jason,
我有一个问题要问你
我搞不清人脸嵌入向量(你帖子中提到人脸嵌入向量的地方:https://machinelearning.org.cn/how-to-develop-a-face-recognition-system-using-facenet-in-keras-and-an-svm-classifier/#comment-499919)和一次性学习之间的区别。我找不到任何明确的界限来区分它们。
请您详细说明一下好吗?
谢谢您,
Saurabh
我相信概念是相同的。
谢谢杰森的友好回复。
我可以使用人脸嵌入向量来解决快乐 vs 悲伤人脸分类问题吗?
有什么评论吗?
谢谢您,
Saurabh
也许可以尝试一下,看看是否有效?
我目前正在进行关于暹罗网络的实验,它在图像分类/识别任务中表现良好。我正在思考这种网络如何在计算机视觉领域中的检测或分割问题中应用。你知道吗?
抱歉,我没有关于以这种方式使用暹罗网络的教程,感谢您的建议。我希望将来能涵盖它们。
您的书(深度学习计算机视觉)涵盖暹罗网络吗?
没有。
当然。我等不及了。 🙂
话说,我也想知道一次性学习的推理阶段是怎样的?它是否将我们想要预测的一张未见过图像与代表每个类别的所有图像数据进行比较,这些图像数据是我们训练模型时使用的?
例如,我们有一个用 10 种不同类型机器人训练好的暹罗网络,那么在推理阶段,任何未见过图像都会与这 10 个类别进行比较,以获得相似度分数并最终预测正确的类别吗?如果是这样,我认为模型预测会非常耗时。我对此仍然不清楚。
哪种方法更好?用 2 张图像训练还是用三元组训练?每种方法的优缺点是什么?
好问题,我希望将来能涵盖它。
我期待着您的回音。
好文章。
会有相关编程教程吗?
也许将来会。
嗨,Jason,帖子中有一个错别字,Bromley 等人撰写的《使用暹罗时间延迟神经网络进行签名验证》发表于 1993 年,而不是 2005 年。
谢谢,已修复!
https://dl.acm.org/doi/10.5555/2987189.2987282
您的书(深度学习计算机视觉)涵盖暹罗网络吗?
不,它没有。
你好!
这是我读过的第二篇关于一次性学习的博客/文章,其中都提到了 FaceNet。我认为重要的是要注意,FaceNet 是通过在 2.6 亿张图像的数据集上进行训练才达到最先进水平的。
作为一名初学者,我并没有立即看到讨论三重损失和 FaceNet 与一次性学习有什么相关性。我希望看到一些关于将这些架构和学习技术应用于小型数据集时的实际性能的讨论。FaceNet 白皮书中肯定没有涵盖这一点。我看到列出的最小数据集是 260 万张图像!
再次强调,我是一个初学者,可能遗漏了一些东西,但我真的没有看到与一次性学习的联系,我真的想知道如何实现一个真正只需要少量图像就能识别人脸的模型。
提及 FaceNet 是因为它是一个人们关注的模型示例,它使用了三重损失来训练模型。
你好 Jason,
你是将复杂的东西一步步地解释到位的佼佼者之一。你的书和博客都很棒。
MTCNN 的输出是边界框和关键点。我曾期望这些会成为 FaceNet 的输入。
但看起来你只使用了边界框信息作为 FaceNet 的输入?你为什么这样做?
我们如何将关键点信息用于人脸识别流程?
谢谢!
不,FaceNet 只是对图像进行分类,该模型中没有对象检测。你需要先有一个人脸检测模型,然后进行人脸分类。
抱歉,我在此帖中误发了上述问题。我本想在另一篇文章“how-to-develop-a-face-recognition-system-using-facenet-in-keras-and-an-svm-classifier”中提问。请您在那里回复好吗?
嗨,我们能用暹罗网络作为图像相似度度量吗?您能提供一个相关教程吗?
抱歉,我没有关于该主题的教程,感谢您的建议。
嗨,作者,您的解释很棒。我是这个领域的新手。想问一下,我能将它用于 RGB 图像(特别是产品图像)吗?如果可以,我能用产品对进行训练,使其输出输入产品图像对之间的相似度分数吗?
是的。
你好 Jason,
一次性学习是深度学习方法的一个类别吗?它与 CNN 等其他深度学习方法有何不同?
您能详细解释一下吗?