前言,我的研究方向要用到深度度量学习,但是一直以来对于度量学习只有一个模糊的概念。于是想办法把它弄清楚了,在这里将度量学习的基础概念记录在这里,如有不足之处还望批评指正。
度量学习(Metric Learning)的主要目的是学习一个距离函数 d ( ⋅ , ⋅ ) : R k × R k ↦ R + d(\cdot ,\cdot ):{{\mathbb{R}}^{k}}\times {{\mathbb{R}}^{k}}\mapsto {{\mathbb{R}}^{+}} d(⋅,⋅):Rk×Rk↦R+ ,该函数将两个 k k k 维的输入向量映射为二者之间的距离。其中输入向量通常是输入图像或图像的特征表示。距离函数的形式为 d ( x , y ) 2 = ( x − y ) T M ( x − y ) d{{(x,y)}^{2}}={{(x-y)}^{T}}M(x-y) d(x,y)2=(x−y)TM(x−y),其中 M M M是一个半正定矩阵,故该函数可分解为:
d ( x , y ) 2 = ( x − y ) T L L T ( x − y ) T = ∥ x T L − y T L ∥ 2 (1) d{{(x,y)}^{2}}\text{ = }{{(x-y)}^{T}}L{{L}^{T}}{{(x-y)}^{T}}={{\left\| {{x}^{T}}L-{{y}^{T}}L \right\|}^{2}} \tag{1} d(x,y)2 = (x−y)TLLT(x−y)T=∥∥xTL−yTL∥∥2(1)
L ∈ R k × d L\in {{\mathbb{R}}^{k\times d}} L∈Rk×d将图像或图像中的特征表示映射至一个 d d d 维的特征空间。在这个特征空间中,语义相似的图像彼此离得很近,而语义不同的图像则彼此离得很远。
具体的,如下图所示,图中不同颜色的符号代表不同类的样本特征,左边的虚线圆代表原始空间,右边的虚线圆代表嵌入空间(Embedding Space),通过度量学习,将原始空间中随机分布的样本特征映射到嵌入空间,且相似样本特征之间的距离大于不同类别样本特征之间的距离。
深度度量学习(Deep Metric Learning)利用了深层架构(例如,CNN)的非线性特征表示能力和度量学习的区分性能力,在各种计算机视觉任务中得到了广泛的应用。这里以卷积神经网络(Convolutional Neural Network, CNN)为例进行说明,下文中提到的深度度量学习中的深层架构指的就是CNN。深度度量学习主要是学习一个形为 ϕ ( ⋅ ) : R k ↦ R h \phi(\cdot):{{\mathbb{R}}^{k}}\mapsto {{\mathbb{R}}^{h}} ϕ(⋅):Rk↦Rh 的非线性的变换。而这种基于CNN的特征提取器,即 ϕ ( ⋅ ) \phi(\cdot) ϕ(⋅),可以预先在其他任务中进行预训练,然后在度量学习的数据集上进行微调。为了将特征表示映射到 d d d 维的向量空间,通常在CNN特征提取器的末尾添加额外的线性嵌入层。该层的数学表达式如下:
f ( x ) = ϕ ( x ) T W , W ∈ R h × d (2) f(x)=\phi {{\text{(}x)}^{T}}W,\text{ }W\in {{\mathbb{R}}^{h\times d}} \tag{2} f(x)=ϕ(x)TW, W∈Rh×d(2)
因此度量学习CNN将会学习一个距离函数 d ( x , y ) 2 = ( ϕ ( x ) − ϕ ( y ) ) T W W T ( ϕ ( x ) − ϕ ( y ) ) d{{(x,y)}^{2}}={{(\phi (x)-\phi (y))}^{T}}W{{W}^{T}}(\phi (x)-\phi (y)) d(x,y)2=(ϕ(x)−ϕ(y))TWWT(ϕ(x)−ϕ(y)),该函数等价于 ( ϕ ( x ) − ϕ ( y ) ) T M ( ϕ ( x ) − ϕ ( y ) ) {{(\phi (x)-\phi (y))}^{T}}M(\phi (x)-\phi (y)) (ϕ(x)−ϕ(y))TM(ϕ(x)−ϕ(y))。
为了同时学习CNN和嵌入层中的所有参数,通常使用基于图像对或三元组的特定的损失函数。
在深度度量学习中最为常用的基于图像对的损失函数是对比损失函数(Contrastive Loss),其数学表达式如下:
J c o n t r a s t i v e = ∑ i , j ℓ i j D 2 ( x i , x j ) + ( 1 − ℓ i j ) h ( α − D ( x i , x j ) ) 2 (3) {{J}_{contrastive}}=\sum\limits_{i,j}{{{\ell }_{ij}}{{D}^{2}}({{x}_{i}},{{x}_{j}})}+(1-{{\ell }_{ij}})h{{(\alpha -D({{x}_{i}},{{x}_{j}}))}^{2}} \tag{3} Jcontrastive=i,j∑ℓijD2(xi,xj)+(1−ℓij)h(α−D(xi,xj))2(3) 其中, ℓ i j ∈ { 0 1 } {{\ell }_{ij}}\in \text{ }\!\!\{\!\!\text{ 0}\text{ 1 }\!\!\}\!\!\text{ } ℓij∈ { 0 1 } 当输入的图像对来自同一类时 ℓ i j {{\ell }_{ij}} ℓij为1否则为0。 h ( x ) = max ( 0 , x ) h(x)=\max (0,x) h(x)=max(0,x), D ( x i , x j ) D({{x}_{i}},{{x}_{j}}) D(xi,xj)代表数据对 ( x i , x j ) ({{x}_{i}},{{x}_{j}}) (xi,xj)之间的欧氏距离。欧氏距离公式如下: D ( x i , x j ) = ∥ x i − x j ∥ 2 (4) D({{x}_{i}},{{x}_{j}})\text{=}{{\left\| {{x}_{i}}-{{x}_{j}} \right\|}_{2}} \tag{4} D(xi,xj)=∥xi−xj∥2(4)
而在度量学习中常用的基于三元组的损失函数是三元组损失函数(Triplet Loss)。该损失函数使用三元组数据 ( x a , x p , x n ) ({{x}_{a}},{{x}_{p}},{{x}_{n}}) (xa,xp,xn) 进行训练,其表达式为: J t r i p l e t = ∑ a , p , n h ( D ( x a , x p ) − D ( x a , x n ) + α ) 2 (5) {{J}_{triplet}}={{\sum\limits_{a,p,n}{h(D({{x}_{a}},{{x}_{p}})-D({{x}_{a}},{{x}_{n}})+\alpha )}}^{2}} \tag{5} Jtriplet=a,p,n∑h(D(xa,xp)−D(xa,xn)+α)2(5) 其中,三元组 ( x a , x p , x n ) ({{x}_{a}},{{x}_{p}},{{x}_{n}}) (xa,xp,xn) 是由来自两个不同类别的三个样本所组成,将 x a {{x}_{a}} xa 看做锚点构成正负数据对,正数据对 ( x a , x p ) ({{x}_{a}},{{x}_{p}}) (xa,xp) 来自相同的类标签,而负数据对 ( x a , x n ) ({{x}_{a}},{{x}_{n}}) (xa,xn) 来自不同的类标签。