Coursera 笔记

Module 04 · Special Applications: Face recognition & Neural Style Transfer

Siamese Network孪生网络

Coursera ↗

在前一个视频中,我们探讨了函数 d 的作用,即输入两张面部照片并告知它们有多相似或多不同。一种常见的解决方案是使用 Siamese 网络(孪生网络)。接下来,我们将深入了解这种网络架构。


传统卷积神经网络 vs. Siamese 网络

你可能已经熟悉这样的 卷积神经网络(CNN) 结构:

  • 输入一张图片(例如:x₁),通过一系列的卷积层、池化层以及全连接层,最终得到一个特征向量。
  • 该特征向量通常会传递给 softmax 单元进行分类,但在本视频中我们不使用分类。

我们将重点关注由网络中较深层的全连接层计算出的 128维特征向量。
我们可以把这个向量称作 f(x₁),你可以将它视为输入图像 x₁ 的一种 编码。这意味着,网络将 x₁(例如 Kian 的照片)转化为一个包含 128 个数值的向量。


如何使用 Siamese 网络进行面部识别

为了比较两张图片,假设第一张图片为 x₁,第二张图片为 x₂,你可以这样做:

  • 将第二张图片 x₂ 输入同一个神经网络,并通过相同的网络参数,计算出另一组 128维编码向量,我们称其为 f(x₂)。
  • 这两张图片的编码是 f(x₁) 和 f(x₂),表示两张图片的特征。

计算图片相似度:距离度量

  • 如果你认为这些编码是对图片的良好表示,那么接下来的步骤就是计算 x₁ 和 x₂ 之间的距离度量。
  • 这个距离度量可以通过计算它们的 编码差异的范数 来实现。

我们用公式表示:

其中,d(x₁, x₂) 表示 x₁ 和 x₂ 之间的距离,通常用向量的欧几里得范数表示。


Siamese 网络架构

这种方法,即对 两个不同输入 使用 相同的卷积神经网络 并进行比较,有时被称为 Siamese 网络架构。
许多关于这个想法的研究来源于 Yaniv Taigman、Ming Yang、Marc'Aurelio Ranzato 和 Lior Wolf 所开发的 DeepFace 系统。


训练 Siamese 网络:目标函数

要训练这种 Siamese 网络,我们需要确保 两个神经网络的参数相同。
目标是通过训练使得网络 编码出的特征向量 能够有效地计算出一个 距离函数 d,从而判断两张图片是否属于同一个人。

目标:

  • 给定任意输入图片 xᵢ,神经网络输出 128维的编码 f(xᵢ)。
  • 如果两张图片 xᵢ 和 xⱼ 属于同一个人,那么它们的 编码之间的距离应该较小。
  • 如果两张图片属于不同的人,编码之间的 距离应该较大。

通过不断调整神经网络中所有层的参数,并使用 反向传播 算法,我们可以优化这些参数,使得 相似度函数 满足上述条件。


下一步:如何定义目标函数

你已经了解了 Siamese 网络架构,并对神经网络应该如何输出有效的 编码 有了初步了解。那么,接下来如何定义一个 目标函数 来训练神经网络,实现上述功能呢?

我们将在下一个视频中探讨如何使用 三元组损失函数(triplet loss function)来实现这一目标。


总结

在本视频中,我们探讨了如何利用 Siamese 网络 来解决面部识别中的 一-shot学习 问题。
通过学习图像的 128维编码 和计算 编码之间的距离,我们能够判断两张图片是否为同一个人。

在接下来的视频中,我们将继续深入了解如何使用 三元组损失函数 来训练网络并优化这一过程。