深度学习专项课程(4)(第四周)

深度学习专项课程(4)(第四周)

本周介绍了一些卷积神经网络的应用,如人脸识别,风格转换等。

人脸识别

对于人脸识别问题简单的描述如下:

  • 数据库中有 k 个人的信息
  • 输入一张图像
  • 如果图像属于 k 个人之一,则输出 ID (或“未识别”)

one-shot 学习

人脸识别的难点在于解决 一次学习(one-shot)问题。这意味着在在绝大数人脸识别应用中你需要通过单单一张人脸照片或一个人脸样例,就可以识别出这个人。

想象这样一个场景,假设你的公司有四名员工,你搭建了一个神经网络最后使用了 softmax 层来识别人脸照片,但如果此时公司又来了一名新员工,你不得不重新训练网络。显然这不是一个好的方法。

事实上我们可以让神经网络学习到这样一个“相似”函数 d :

$$
\large
d(img1,img2) = 图片之间的差异度 \\
if \quad d(img1,img2) \le \tau \quad , \quad same \\
if \quad d(img1,img2) > \tau \quad , \quad different
$$

如果有了这个函数的话,新员工加入后也只需添加一张照片即可。

siamese network

siamese 网络可以帮助我们实现上面提到的“相似”函数。

我们把两张图像输入到同一个卷积神经网络中,经过卷积池化等操作后,输出一个 128 单元的全连接层。这128个单元中所包含的信息看作是对输入图片的编码,记为 $f(x^i)$,$x^i$是指第 i 个样本。我们比较这两张图片的编码,来判断其相似度。这里使用的是平方范数。

dl_91

Triplet 损失

对于 siamese 网络,我们需要一个 loss 函数来进行梯度下降,这里我们使用的是 Triplet(三元组) loss 函数。

这里的三元组是指 anchor , positive , negative,简写为 (A,P,N)。 positive 表示的人脸 与 anchor 相同,negative 是与 anchor 不同的人脸。

dl_92

我们想要的是 anchor 与 positive 的差别较小,而与 negative 的差异较大。

dl_93

用公式表示为:

$$
\large
||f(A)-f(P)||^2 \le ||f(A)-f(N)||^2
$$

仔细观察这个公式你会发现,如果 $||f(A)-f(P)||^2$ 和 $||f(A)-f(N)||^2$ 都等于 0 的话,这个不等式将恒满足,但这样是毫无意义的。所以我们需要加上一个参数 $\alpha$ 防止这种情况的发生:

$$
\large
||f(A)-f(P)||^2 + \alpha \le ||f(A)-f(N)||^2 \le 0
$$

所以完整三元组损失函数定义如下:

$$
\large
L(A,P,N) = max( ||f(A)-f(P)||^2 - ||f(A)-f(N)||^2 + \alpha , 0)
$$

max 函数的目的在于 只要能使 max 函数内左边的部分小于 0 ,我们就认为这个例子的损失为 0 。

整个网络的代价函数就是单个三元组目标函数的总和。

最后需要注意的是,如果我们随机组合三元组的训练数据时, $||f(A)-f(N)||^2$ 的值总是大于 $||f(A)-f(P)||^2$ ,这样的话梯度下降算法很难起作用。所以我们在选择三元组的时候要保证它“很难”去训练。

即:

$$
\large
||f(A)-f(P)||^2 \approx ||f(A)-f(N)||^2
$$

面部验证与二分类

除了使用上面的三元组损失函数之外,还可以将人脸识别问题转换为二分类的问题。

我们同样使用 siamese 网络,我们在网络的最后加入一个逻辑回归单元,对输入的图片编码做一个二分类。
如果输入的两张图片是相同的人,则输出 1 , 否则输出 0 。

可以使用反向传播算法来训练这个网络。

dl_94

逻辑单元具体作用如下:

划线部分也可替换成其它的函数。

$$
\large
\hat{y}=sigmoid(\sum_{k=1}^{128} w_i \underline{ |f(x^{(i)})-f(x^{(j)})|} + b)
$$

需要注意的是,这个网络的训练数据是两个图片组成的图片对。


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×