One-shot Learning 的损失函数以及背后的几何直观

$$ 作者:秘塔科技图像研究员 Yanbing Dong $$

在获取知识和识别新事物方面,人类有很强的能力,当人们被给予新的概念时,他们可以很快地理解,并且在以后遇到这个概念或者它的变种的时候可以很快的识别出来。尽管深度学习算法在很多方面都取得了很好的效果,但是当我们能够获取的数据量很少时,很多深度学习算法的预测能力就会直线下降。但深度学习其实并不一定需要依赖于海量的样本,极端情况下,我们甚至可以对每类只提供一个样本。这类问题被称之为 One-shot Learning。在这样的极端情况下,如何准确进行分类?

Siamese Neural Networks for One-shot Image Recognition 中,作者通过一个 Siamese Network 去学习图像对之间的相似性,从而将 One-shot 的分类问题转化为图像识别中标准的验证问题。而在人脸验证的系统中,我们也只是给了系统某个人的一张人脸照片,然后去判断相机拍摄的人脸和系统中保存的是不是同一个人,是一个典型的 One-shot Learning 问题。

那么要怎么做人脸验证呢?对于给定的两张人脸图片,,我们可以通过神经网络计算得到特征$f_1$和$f_2$,那么

  • 如果 $d(f_1, f_2)$ 很小,那么 $x_1$,$x_2$ 属于同一个人
  • 如果 $d(f_1, f_2)$ 很大,那么 $x_1$,$x_2$ 属于不同的两个人

其中 $d$ 表示距离度量,常用的有欧式距离和余弦距离。那么在理想的情况下,我们希望:同一个人的人脸特征之间距离的最大值比不同人的人脸特征之间距离的最小值还要小,我们可以从 n维锥体(n-dimensional Cone)的角度去理解这个问题。

One-shot Learning 的损失函数以及背后的几何直观_第1张图片

接下来我们介绍几种用于 One-shot Learning 的损失函数,以人脸为例。当然这样的方法可以用于其他非人脸识别的任务中。

Softmax Loss: 在 Deepface: Closing the gap to human-level performance in face verification 中作者把特征学习当成一个类别超多的分类问题去解决,通过 Softmax 去在人脸数据库上训练一个分类器,虽然 Softmax 学习到的特征是可分离的,但是同一个人的不同人脸之间的变化很大,基于欧式距离或者余弦距离的判断会导致最后的验证出错。

One-shot Learning 的损失函数以及背后的几何直观_第2张图片
One-shot Learning 的损失函数以及背后的几何直观_第3张图片

所以,线性可分仅仅是 One-shot Learning 的必要非充分条件。为了解决这个问题,研究者提出了新的损失函数。

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 的不同形式,减小了训练的难度。

Triplet Loss: 谷歌的研究者 2015 在 Facenet: A unified embedding for face recognition and clustering 中提出 Triplet Loss,希望在学习到的特征空间里: i) 同一个人的两张人脸比较接近 ii) 不同人的两张人脸相距较远。为了这个目的,通过图像的三元组 (Triplet) 去定义损失函数,这个三元组由:

  • A:某个人的一张人脸图片;
  • P:与 A 属于同一个人的一张人脸图片;
  • N:与 A 不同的人的一张人脸图片。

在距离度量 $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 的论文中讨论了几种选择负样本的方法:

  1. 选择损失最大的 N;
  2. 选择 $d(f_a, f_p) < d(f_a, f_n)$ 而且 $\mathcal{L} > 0$ 的 triplet,这时候选择的 triplet 由于满足 $d(f_a, f_p) < d(f_a, f_n)$ 的条件,难度并没有那么大,而又因为 $\mathcal{L} > 0$,计算梯度仍然能对参数进行改进。

这种对负样本的选择方法的思想可以类比课程学习 (Curriculum Learning) 。我们的训练先从比较容易的样本开始,逐渐增加样本的难度,使模型收敛到泛化能力更好的解。我们使用这种方式在 MNIST 上做了一个小的演示实验。从图中可以看出,各个数字的特征在球面上不仅是分开的,而且任意两个类之间都有很大的间隔,证明 Triplet Loss 的训练起到了分离特征的作用。

除了选择适合的损失函数以外,生成模型特征的网络结构选择,以及预训练的数据,都会对模型最终泛化能力产生很大影响,下次与大家分享!

你可能感兴趣的:(人工智能,javascript,数据库,ViewUI)