目录
1)What is face recognition?
2)One-shot learning
3)Siamese network
4)Triplet Loss(重点)
5)Face Verification and Binary Classification
6)What is neural style transfer?
7)What are deep ConvNets learning?
8)Cost function(理解)
9)Content cost function(重点)
10)Style cost function(重点)
11)1D and 3D generalizations f models
以下笔记是吴恩达老师深度学习课程第四门课第四周的的学习笔记:Face recognition & neural style transfer。笔记参考了黄海广博士的内容,在此表示感谢。
1)What is face recognition?
首先介绍一下人脸验证(Face Verification)和人脸识别(Face Recognition)的区别:
人脸验证:一般是一个一对一问题,只需要验证输入的人脸图像是否与某个已知的身份信息对应;
人脸识别:一个更为复杂的一对多问题,需要验证输入的人脸图像是否与多个已知身份信息中的某一个匹配。
一般来说,由于需要匹配的身份信息更多导致错误率增加,人脸识别比人脸验证更难一些。因为假设人脸验证系统的错误率是1%,那么在人脸识别中,输出分别与K个模板都进行比较,则相应的错误率就会增加,约K%。模板个数越多,错误率越大一些。
2)One-shot learning
人脸识别所面临的一个挑战是要求系统只采集某人的一个面部样本,就能快速准确地识别出这个人,即只用一个训练样本来获得准确的预测结果。这被称为One-Shot 学习。
有一种方法是假设数据库中存有 N 个人的身份信息,对于每张输入图像,用 Softmax 输出 N 种标签。然而这种方法的实际效果很差,因为过小的训练集不足以训练出一个稳健的神经网络;并且如果有新的身份信息入库,需要重新训练神经网络,不够灵活。
因此,我们通过学习一个 Similarity 函数来实现 One-Shot 学习过程。Similarity 函数定义了输入的两幅图像的差异度,其公式如下:
可以设置一个超参数 作为阈值,作为判断两幅图片是否为同一个人的依据。
3)Siamese network
实现 Similarity 函数的一种方式是使用Siamese 网络,它是一种对两个不同输入运行相同的卷积网络,然后对它们的结果进行比较的神经网络。
如上图示例,将图片 分别输入两个相同的卷积网络中,经过全连接层后不再进行 Softmax,而是得到特征向量 。这时,Similarity 函数就被定义为两个特征向量之差的 L2 范数:
值得一提的是,不同图片的CNN网络所有结构和参数都是一样的。我们的目标就是利用梯度下降算法,不断调整网络参数,使得属于同一人的图片之间d(x(1),x(2))很小,而不同人的图片之间d(x(1),x(2))很大。
相关论文:Taigman et al., 2014, DeepFace closing the gap to human level performance
4)Triplet Loss(重点)
Triplet 损失函数用于训练出合适的参数,以获得高质量的人脸图像编码。“Triplet”一词来源于训练这个神经网络需要大量包含 Anchor(靶目标)、Positive(正例)、Negative(反例)的图片组,其中 Anchor 和 Positive 需要是同一个人的人脸图像。
对于这三张图片,应该有:
其中, 被称为间隔(margin),用于确保不会总是输出零向量(或者一个恒定的值)。
Triplet 损失函数的定义:
其中,因为 的值需要小于等于 0,因此取它和 0 的更大值。
对于大小为m 的训练集,代价函数为:
通过梯度下降最小化代价函数。
在选择训练样本时,随机选择容易使 Anchor 和 Positive 极为接近,而 Anchor 和 Negative 相差较大,以致训练出来的模型容易抓不到关键的区别。因此,最好的做法是人为增加 Anchor 和 Positive 的区别,缩小 Anchor 和 Negative 的区别,促使模型去学习不同人脸之间的关键差异。
相关论文:Schroff et al., 2015, FaceNet: A unified embedding for face recognition and clustering
5)Face Verification and Binary Classification
除了 Triplet 损失函数,二分类结构也可用于学习参数以解决人脸识别问题。其做法是输入一对图片,将两个 Siamese 网络产生的特征向量输入至同一个 Sigmoid 单元,输出 1 则表示是识别为同一人,输出 0 则表示识别为不同的人。
Sigmoid 单元对应的表达式为:
其中, 和 b都是通过梯度下降算法迭代训练得到的参数。上述计算表达式也可以用另一种表达式代替:
其中,被称为方相似度。
无论是对于使用 Triplet 损失函数的网络,还是二分类结构,为了减少计算量,可以提前计算好编码输出 f(x)并保存。这样就不必存储原始图片,并且每次进行人脸识别时只需要计算测试图片的编码输出。
6)What is neural style transfer?
神经风格迁移(Neural style transfer)将参考风格图像的风格“迁移”到另外一张内容图像中,生成具有其特色的图像。 一般用C表示内容图片,S表示风格图片,G表示生成的图片。
7)What are deep ConvNets learning?
想要理解如何实现神经风格转换,首先要理解在输入图像数据后,一个深度卷积网络从中都学到了些什么。我们借助可视化来做到这一点。 典型的CNN网络如下所示:
我们通过遍历所有的训练样本,找出使该层激活函数输出最大的 9 块图像区域。可以看出,浅层的隐藏层通常检测出的是原始图像的边缘、颜色、阴影等简单信息。随着层数的增加,隐藏单元能捕捉的区域更大,学习到的特征也由从边缘到纹理再到具体物体,变得更加复杂。
相关论文:Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks
8)Cost function(理解)
神经风格迁移生成图片G的cost function由两部分组成:C与G的相似程度和S与G的相似程度。
其中, 是用于控制相似度比重的超参数。
神经风格迁移的基本算法流程是:
首先令G为随机像素点,然后使用梯度下降算法,不断修正G的所有像素点,使得J(G)不断减小,从而使G逐渐有C的内容和G的风格,如下图所示。
相关论文:Gatys al., 2015. A neural algorithm of artistic style
9)Content cost function(重点)
上述代价函数包含一个内容代价部分和风格代价部分。我们先来讨论内容代价函数 ,它表示内容图片 C 和生成图片 G 之间的相似度。
的计算过程如下:
使用一个预训练好的 CNN(例如 VGG);
选择一个隐藏层 l来计算内容代价。l太小则内容图片和生成图片像素级别相似,l太大则可能只有具体物体级别的相似。因此,l一般选一个中间层;
设 为 C 和 G 在 l层的激活,则有:
和 越相似,则 越小,方法就是使用梯度下降算法,不断迭代修正G的像素值。
10)Style cost function(重点)
什么是图片的风格?利用CNN网络模型,图片的风格可以定义成第l层隐藏层不同通道间激活函数的乘积(相关性)。
例如我们选取第l层隐藏层,其各通道使用不同颜色标注,如下图所示。因为每个通道提取图片的特征不同,比如1通道(红色)提取的是图片的垂直纹理特征,2通道(黄色)提取的是图片的橙色背景特征。那么计算这两个通道的相关性大小,相关性越大,表示原始图片及既包含了垂直纹理也包含了该橙色背景;相关性越小,表示原始图片并没有同时包含这两个特征。也就是说,计算不同通道的相关性,反映了原始图片特征间的相互关系,从某种程度上刻画了图片的“风格”。
对于风格图像 S,选定网络中的第层,则相关系数以一个 gram 矩阵的形式表示:
其中,和 为第 层的高度和宽度; 和 为选定的通道,其范围为 1到 。
同理,对于生成图像 G,有:
因此,第 层的风格代价函数为:
如果对各层都使用风格代价函数,效果会更好。因此有:
其中,是用于设置不同层所占权重的超参数。
11)1D and 3D generalizations f models
之前我们处理的都是二维图片,实际上卷积也可以延伸到一维和三维数据。我们举两个示例来说明。
EKG 数据(心电图)是由时间序列对应的每个瞬间的电压组成,是一维数据。一般来说我们会用 RNN(循环神经网络)来处理,不过如果用卷积处理,则有:
输入时间序列维度:14 x 1
滤波器尺寸:5 x 1,滤波器个数:16
输出时间序列维度:10 x 16
而对于三维图片的示例,有
输入 3D 图片维度:14 x 14 x 14 x 1
滤波器尺寸:5 x 5 x 5 x 1,滤波器个数:16
输出 3D 图片维度:10 x 10 x 10 x 16