$$ 做者:秘塔科技图像研究员 Yanbing Dong $$算法
在获取知识和识别新事物方面,人类有很强的能力,当人们被给予新的概念时,他们能够很快地理解,而且在之后遇到这个概念或者它的变种的时候能够很快的识别出来。尽管深度学习算法在不少方面都取得了很好的效果,可是当咱们可以获取的数据量不多时,不少深度学习算法的预测能力就会直线降低。但深度学习其实并不必定须要依赖于海量的样本,极端状况下,咱们甚至能够对每类只提供一个样本。这类问题被称之为 One-shot Learning。在这样的极端状况下,如何准确进行分类?数据库
在 Siamese Neural Networks for One-shot Image Recognition 中,做者经过一个 Siamese Network 去学习图像对之间的类似性,从而将 One-shot 的分类问题转化为图像识别中标准的验证问题。而在人脸验证的系统中,咱们也只是给了系统某我的的一张人脸照片,而后去判断相机拍摄的人脸和系统中保存的是否是同一我的,是一个典型的 One-shot Learning 问题。网络
那么要怎么作人脸验证呢?对于给定的两张人脸图片,,咱们能够经过神经网络计算获得特征$f_1$和$f_2$,那么app
其中 $d$ 表示距离度量,经常使用的有欧式距离和余弦距离。那么在理想的状况下,咱们但愿:同一我的的人脸特征之间距离的最大值比不一样人的人脸特征之间距离的最小值还要小,咱们能够从 n维锥体(n-dimensional Cone)的角度去理解这个问题。函数
接下来咱们介绍几种用于 One-shot Learning 的损失函数,以人脸为例。固然这样的方法能够用于其余非人脸识别的任务中。学习
Softmax Loss
: 在 Deepface: Closing the gap to human-level performance in face verification 中做者把特征学习当成一个类别超多的分类问题去解决,经过 Softmax 去在人脸数据库上训练一个分类器,虽然 Softmax 学习到的特征是可分离的,可是同一我的的不一样人脸之间的变化很大,基于欧式距离或者余弦距离的判断会致使最后的验证出错。spa
因此,线性可分仅仅是 One-shot Learning 的必要非充分条件。为了解决这个问题,研究者提出了新的损失函数。code
Angular Softmax Loss
: 为了使同一我的的人脸之间的特征更加紧凑,同时使不一样人脸之间的特征尽量分离,在 SphereFace: Deep Hypersphere Embedding for Face Recognition 中做者基于球面流形的分析,在 Softmax 的基础上,在不一样人的特征的角度之间增长了一个 Margin,使得不一样人的特征有着不一样的分类面。在这个的基础上,Additive Margin Softmax for Face Verification 和 Arcface: Additive angular margin loss for deep face recognition 又提出了添加 Angular Margin 的不一样形式,减少了训练的难度。orm
Triplet Loss
: 谷歌的研究者 2015 在 Facenet: A unified embedding for face recognition and clustering 中提出 Triplet Loss,但愿在学习到的特征空间里: i) 同一我的的两张人脸比较接近 ii) 不一样人的两张人脸相距较远。为了这个目的,经过图像的三元组 (Triplet) 去定义损失函数,这个三元组由:图片
在距离度量 $d$ 为欧式距离的状况下,定义损失函数为:
$$ \mathcal{L} = max(d^2(f_a, f_p) - d^2(f_a, f_n) + \alpha, 0) $$
其中 $f_a$,$f_p$ 和 $f_n$为三张图片对应的特征,$\alpha$ 为调节距离 Margin 的一个参数。由损失函数能够看出,理想状况下,咱们但愿正样本与负样本之间的距离至少为 $\alpha$.
虽然这个损失函数看上去很直观,但在实际的工程应用中其实有额外的注意事项。譬如,在 a 足够小的时候,咱们会发现,若是咱们经过神经网络所生成的全部图片特征都收敛到一个点时,损失接近于零,即:
$$ f_a=f_p=f_n\to\mathcal{L}\approx0 $$
为了不上述状况,须要对网络的输出进行额外的正则化处理。
从上面的描述中能够看出,因为引入了 Margin,使得不一样人的人脸特征之间更加具备区分性。那么在训练 Triplet Loss 的过程当中,怎样选择 Triplet 呢?给定某我的的一张人脸图片,正样本能够从这我的的其余人脸图片中随机挑选一张,因为其余人的任何图片均可以做为负样本。而不一样的选择策略所带来的训练难度与最终收敛的模型泛化能力有所差别。
Facenet 的论文中讨论了几种选择负样本的方法:
这种对负样本的选择方法的思想能够类比课程学习 (Curriculum Learning) 。咱们的训练先从比较容易的样本开始,逐渐增长样本的难度,使模型收敛到泛化能力更好的解。咱们使用这种方式在 MNIST 上作了一个小的演示实验。从图中能够看出,各个数字的特征在球面上不只是分开的,并且任意两个类之间都有很大的间隔,证实 Triplet Loss 的训练起到了分离特征的做用。
除了选择适合的损失函数之外,生成模型特征的网络结构选择,以及预训练的数据,都会对模型最终泛化能力产生很大影响,下次与你们分享!