人脸识别(Face recognization)
人脸识别和人脸验证(Face verification)在本课中的区别是人脸识别是对应一个输入与多个可能的目标值的对应,例如输入一张图片,与数据库中的图片进行对比,从而输出与数据库中相匹配的照片的姓名;而人脸验证则是一个输入与一个输出之间的对应,例如输入一张图片和姓名,输出照片是否和姓名对应的判断结果。由于对于准确率要求更高,因此识别问题比验证问题更加困难。
One-shot 学习
人脸识别问题中一个重要的挑战是需要系统根据存储在数据库中的一张照片来判断新的输入是否与已有数据匹配。由于不能把同一个人的多张不同角度的照片作为输入信息来进行对比,因此系统需要学习一个函数关系来使得其能在少量数据的情况下表现出色。在这里可以定义一个“相似度”函数 d(img1, img2) 用以衡量两张照片的差异程度,当 d(img1, img2) ≤ τ 时可以认为两张图片上的人的身份相符,反之亦然,这里 τ 是一个超参数。
Siamese 网络
Siamese 的实现原理是通过训练使得网络可以将输入照片编码输出为一个向量,再将两张不同的照片输入由同一套参数构建的网络后将输出向量进行对比。例如对于两张输入照片 x(1)、x(2),对应的网络输出是 f(x(1))、f(x(2)),则 d(x(1), x(2)) 可以定义为 ||f(x(1)) - f(x(2)) ||22,用这个量的大小来衡量两张照片是否是同一个人。
Triplet 损失函数
为了可以通过相似度 d 的大小来进行人脸识别,网络的损失函数定义方法之一是采用 Triplet 损失函数:假设对于同一个基准输入,在这里称为 Anchor,将与之匹配的输入定义为 Positive,而对于与之不匹配的输入则定义为 Negative,由于对于一组照片来说总是同时考虑三个输入,所以称作 Triplet。
由于在网络训练过程中我们希望 ||f(A) - f(p)||22 - ||f(A) - f(N)||22 ≤ 0,即基准和匹配照片的差异值应该小于基准和不匹配照片的差异值,但如果网络通过训练将上式各项均设为 0 ,则结果也满足要求。因此可以定义一个超参数 α,称为误差限(margin),使得 ||f(A) - f(p)||22 + α - ||f(A) - f(N)||22 ≤ 0,即希望基准和匹配照片的差异值与基准和不匹配照片的差异值应至少为 α。
一个 Triplet 输入的损失函数可以定义为:
L(A, P, N) = max(||f(A) - f(p)||22 - ||f(A) - f(N)||22 + α, 0)
训练集的成本函数为:
J = ∑ L(A(i), P(i), N(i)),其中 i = 1, 2, 3,...,m
在实际训练中,训练数据集中的 (A,P,N) 对一般有多个,例如提供 10,000 张包含 1000 个个体的照片,而如果随机选择这些配对则有可能误差限 α 非常容易满足,因此需要在训练中选择比较难的配对方式。
二分法人脸识别
人脸识别实现中还可以通过一个 siamese 网络来将两张不同的照片输入编码成为向量后转换成二分问题,即相同取 1,不同取 0,此时的输出会变成:
ŷ = σ( ∑wi |f(x(i)k - f(x(j)k| + b), 其中 k 为特征向量的第 k 个元素,i, j 为两个不同的输入
上式中的相应元素之差的绝对值部分还可以变成 (f(x(i)k - f(x(j)k)2 / (f(x(i)k + f(x(j)k)
风格迁移
近几年比较流行的一个有趣的应用是使用神经网络来进行图画作品的风格迁移,而想要深刻理解和实施风格迁移就需要了解卷积神经网络每一个隐含层所学习到的内容。直观的理解就是神经网络随着层次的深入,其所能识别的模式愈加复杂,在初期只能识别简单的线条,而到了后期则可以逐渐识别一个完整的图片。
在实施风格迁移时,其成本函数的定义过程为:
将需要做迁移的图片用 C, Content 来表示,而风格的来源则用 S, Style 表示,最终生成的图片用 G,Generated 来表示
风格迁移的成本函数定义为 J(G) = α * Jcontent(C, G) + β * Jstyle(S, G),其中前半部分衡量两张图片内容的相似度,后半部分衡量两张图片风格的相似度,α, β 为各自的权重
考虑到神经网络各层对于图片内容的识别程度,因此一般选择中间某层计算风格迁移的内容成本部分,越往前则对内容相似度要求越高。假设取在 l 层,如果内容图片和最终生成图片的激活函数为 a[ l ](C)、a[ l ](G),则可以令 Jcontent(C, G) = ||a[ l ](C) - a[ l ](G)||22 通过比较两个激活向量每一个元素的差异的平方和来判断两者内容的相似度
图片之间的风格比较则可以定义为不同通道间激活项的相关系数,也即不同通道之间特征的相关性:令 ai,j,k[ l ] 指代在 l 层高度为 i, 宽度为 j,通道为 k 位置的激活项,则可以构造两个 nC x nC 的风格矩阵 Gkk'[ l ](S) = ∑∑ai,j,k[ l ](S) ai,j,k'[ l ](S) 和 Gkk'[ l ](G) = ∑∑ai,j,k[ l ](G) ai,j,k'[ l ](G),其中 i = 1, 2, 3,...,nH,j = 1, 2, 3,...,nW,相应的成本函数则可以定义为 J[ l ]style(S, G) = ||Gkk'[ l ](S) - Gkk'[ l ](G)||22,在实际应用中为了使得最终的图片更加美观还可以进一步取多个层的成本函数的加和来进行风格比较 Jstyle(S, G) = ∑λ[ l ]J[ l ]style(S, G)