4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

第四周 特殊应用:人脸识别和神经风格转换( Special applications: Face recognition &Neural style transfer)

4.1 什么是人脸识别?(What is face recognition? )

首先,让我们了解一下人脸识别的一些术语。

在人脸识别的相关文献中,人们经常提到人脸验证(face verification)和人脸识别(facerecognition)。

    人脸验证问题,如果你有一张输入图片,以及某人的 ID 或者是名字,这个系统要做的是,验证输入图片是否是这个人。有时候也被称作 1 对 1 问题,只需要弄明白这个人是否和他声称的身份相符。

人脸识别问题比人脸验证问题难很多(整理者注:1 对多问题(1:????)),为什么呢?假设你有一个验证系统,准确率是 99%,还可以。但是现在,假设在识别系统中,???? = 100,如果你把这个验证系统应用在 100 个人身上,人脸识别上,你犯错的机会就是 100 倍了。如果每个人犯错的概率是 1%,如果你有一个上百人的数据库,如果你想得到一个可接受的识误差,你要构造一个验证系统,其准确率为 99.9%或者更高,然后才可以在 100 人的数据库上运行,而保证有很大几率不出错。事实上,如果我们有一个 100 人的数据库,正确率可能需要远大于 99%,才能得到很好的效果。

4.2 One-Shot 学习(One-shot learning)

人脸识别所面临的一个挑战就是你需要解决一次学习问题,这意味着在大多数人脸识别应用中,你需要通过单单一张图片或者单单一个人脸样例就能去识别这个人。大多数人脸识别系统都需要解决这个问题,因为在你的数据库中每个雇员或者组员可能都只有一张照。

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

有一种办法是,将人的照片放进卷积神经网络中,使用 softmax 单元来输出 4 种,或者说 5 种标签,分别对应这 4 个人,或者 4 个都不是,所以 softmax 里我们会有 5 种输出。但实际上这样效果并不好,因为如此小的训练集不足以去训练一个稳健的神经网络。而且,假如有新人加入你的团队,你现在将会有 5 个组员需要识别,所以输出就变成了6 种,这时你要重新训练你的神经网络吗?这听起来实在不像一个好办法。

所以要让人脸识别能够做到一次学习,为了能有更好的效果,你现在要做的应该是学习Similarity 函数。详细地说,你想要神经网络学习这样一个用d表示地函数,????(img1,img2) = degree of difference between images,它以两张图片作为输入,然后输出这两张图片的差异值。如果放进两个长相差别很大的人的照片,它就输出一个很大的值。所以在识别过程中,如果这两张图片的差异值小于某个阈值????,它是一个超参数,那么这时就能预测这两张图片是同一个人,如果差异值大于 τ,就能预测这是不同的两个人,这就是解决人脸验证问题的一个可行办法。

要注意在这过程中你是如何解决一次学习问题的,只要你能学习这个函数d,通过输入一对图片,它将会告诉你这两张图片是否是同一个人。如果之后有新人加入了你的团队,你只需将他的照片加入你的数据库,系统依然能照常工作。

现在你已经知道函数 d 是如何工作的,通过输入两张照片,它将让你能够解决一次学习问题。那么,下节视频中,我们将会学习如何训练你的神经网络学会这个函数 d

4.3 Siamese 网络(Siamese network)

上个视频中你学到的函数 d 的作用就是输入两张人脸,然后告诉你它们的相似度。实现这个功能的一个方式就是用 Siamese 网络,我们看一下。

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

你经常看到这样的卷积网络,输入图片???? (1) ,然后通过一系列卷积池化和全连接层最终得到这样的特征向量(编号 1)。有时这个会被送进 softmax 单元来做分类,但在这个视频里我们不会这么做。我们关注的重点是这个向量(编号 1),加如它有 128 个数,它是

由网络深层的全连接层计算出来的,我要给这 128 个数命个名字,把它叫做f(x (1) )。你可以把f(x (1) )看作是输入图像x (1) 的编码,取这个输入图像(编号 2),在这里是 Kian 的图片,然后表示成 128 维的向量。

    建立一个人脸识别系统的方法就是,如果你要比较两个图片的话,例如这里的第一张(编号 1)和第二张图片(编号 2),你要做的就是把第二张图片喂给有同样参数的同样的神经网络,然后得到一个不同的 128 维的向量(编号 3),这个向量代表或者编码第二个图片,

我要把第二张图片的编码叫做f(x (2) )。这里我用x (1) 和x (2) 仅仅代表两个输入图片,他们没必要非是第一个和第二个训练样本,可以是任意两个图片。最后如果你相信这些编码很好地代表了这两个图片,你要做的就是定义d,将x (1) x (2)的距离定义为这两幅图片的编码之差的范数4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做 Siamese网络架构。

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

怎么训练这个 Siamese 神经网络呢?不要忘了这两个网络有相同的参数,所以你实际要做的就是训练一个网络,它计算得到的编码可以用于函数 d ,它可以告诉你两张图片是否是同一个人。更准确地说,神经网络的参数定义了一个编码函数????(???? (????) ),如果给定输入图像???? (????) ,这个网络会输出???? (????) 的 128 维的编码。你要做的就是学习参数,使得如果两个图片???? (????) 和???? (????)是同一个人,那么你得到的两个编码的距离就小。前面几个幻灯片我都用的是???? (1) 和???? (2) ,其实训练集里任意一对???? (????) 和???? (????) 都可以。相反,如果???? (????) 和???? (????) 是不同的人,那么你会想让它们之间的编码距离大一点。

如果你改变这个网络所有层的参数,你会得到不同的编码结果,你要做的就是用反向传播来改变这些所有的参数,以确保满足这些条件。

你已经了解了 Siamese 网络架构,并且知道你想要网络输出什么,即什么是好的编码。

但是如何定义实际的目标函数,能够让你的神经网络学习并做到我们刚才讨论的内容呢?在下一个视频里,我们会看到如何用三元组损失函数达到这个目的。

4.4 Triplet 损失(Triplet 损失)

要想通过学习神经网络的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

我们看下这是什么意思,为了应用三元组损失函数,你需要比较成对的图像,比如这个图片,为了学习网络的参数,你需要同时看几幅图片,比如这对图片(编号 1 和编号 2),你想要它们的编码相似,因为这是同一个人。然而假如是这对图片(编号 3 和编号 4),你

会想要它们的编码差异大一些,因为这是不同的人

用三元组损失的术语来说,你要做的通常是看一个 anchor 图片,你想让 anchor 图片和 positive 图片(positive 意味着是同一个人)的距离很接近。然而,当 anchor 图片与 negative图片(negative 意味着是非同一个人)对比时,你会想让他们的距离离得更远一点。

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

4.1--4.4 Triplet 损失 吴恩达 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

定义了这些包括A、P和N图片的数据集之后,你还需要做的就是用梯度下降最小化我们之前定义的代价函数 J这样做的效果就是反向传播到网络中的所有参数来学习到一种编码,使得如果两个图片是同一个人,那么它们的d就会很小,如果两个图片不是同一个人,它们的d就会很大。这就是三元组损失,并且如何用它来训练网络输出一个好的编码用于人脸识别。