通过层次化三元组损失实现深度度量学习.

在深度度量学习中,Triplet Loss为每一个样本xx选择一个正样本x+x+和一个负样本xx,同时最小化正样本对之间的距离和最大化负样本对之间的距离。

max(0,D[fθ(x),fθ(x+)]D[fθ(x),fθ(x)]+ϵ)max(0,D[fθ(x),fθ(x+)]D[fθ(x),fθ(x)]+ϵ)

给定NN个训练样本,则可构造O(N3)O(N3)的三元组,在训练期间遍历所有这些训练元组是不可行的,这样会产生大量冗余信息,并且多数训练数据不具有效训练信息,使网络无法得到很好的训练。

本文提出了Hierarchical Triplet Loss,能够通过自适应学习编码数据集的所有类别样本构建层级类结构,并生成样本的分层树(hierarchical tree);并基于分层树进行Anchor neighbor采样,再由动态变化的violate margin机制构建损失函数。

给定训练集(X,Y)(X,Y)和使用传统triplet loss预训练的神经网络fθfθ,计算类间距离矩阵,其中第pp类和第qq类之间的距离计算为:

d(p,q)=1NpNqip,jq||fθ(xi)fθ(xj)||2d(p,q)=1NpNqip,jq||fθ(xi)fθ(xj)||2

根据计算的类间距离创建分层树,叶节点是原始类别,然后基于计算的距离矩阵递归地合并不同层级的叶节点来创建层次结构。 树的深度设置LL级,平均类内距离d0d0作为合并第00级节点的阈值:

d0=1CCc=1(1n2cncic,jc||fθ(xi)fθ(xj)||2)d0=1CCc=1(1n2cncic,jc||fθ(xi)fθ(xj)||2)

合并第l级节点的阈值设置为:

dl=l(4d0)L+d0

距离小于dl的两个类合并到第l级的节点中。节点从第0级合并到第L级,最后生成一个分层树,它从原始类别的叶节点开始到顶部节点,可以捕获整个数据集上的类别关系,并在训练中不断更新。

从构造的分层树中进行A-N采样(Anchor neighbor sampling),作为训练过程中的批量数据。从第0级随机选择l个节点,每个节点代表一个原始类别。然后为每个类选择m1个在0级最接近的类,以通过在视觉相似的类中学习最具区分性的特征。再在每个类中随机选取t个样本,因此批量数据中共有lmt个样本,可构造A2lmA2tC1t个三元组,A2lm表示随机抽取两个类(正类和负类);A2t表示从正类中选择两个样本;C1t表示从负类中随机选择负样本。

在此基础上作者把Triplet Loss中的margin参数ϵ调整为一个动态参数αz,它是根据构造的分层树上类间关系计算得到的:

αz=β+dH(ya,yn)Sya

其中β=0.1是一个常数,它鼓励每一次迭代类间距更远;dH(ya,yn)是把类ya,yn合并后的节点的阈值;Sya是类ya样本间的平均距离:

Sya=1n2yanyai,jya||fθ(xi)fθ(xj)||2