通过层次化三元组损失实现深度度量学习.
在深度度量学习中,Triplet Loss为每一个样本选择一个正样本和一个负样本,同时最小化正样本对之间的距离和最大化负样本对之间的距离。
给定个训练样本,则可构造的三元组,在训练期间遍历所有这些训练元组是不可行的,这样会产生大量冗余信息,并且多数训练数据不具有效训练信息,使网络无法得到很好的训练。
本文提出了Hierarchical Triplet Loss,能够通过自适应学习编码数据集的所有类别样本构建层级类结构,并生成样本的分层树(hierarchical tree);并基于分层树进行Anchor neighbor采样,再由动态变化的violate margin机制构建损失函数。
给定训练集和使用传统triplet loss预训练的神经网络,计算类间距离矩阵,其中第类和第类之间的距离计算为:
根据计算的类间距离创建分层树,叶节点是原始类别,然后基于计算的距离矩阵递归地合并不同层级的叶节点来创建层次结构。 树的深度设置级,平均类内距离作为合并第级节点的阈值:
合并第级节点的阈值设置为:
距离小于的两个类合并到第级的节点中。节点从第级合并到第级,最后生成一个分层树,它从原始类别的叶节点开始到顶部节点,可以捕获整个数据集上的类别关系,并在训练中不断更新。
从构造的分层树中进行A-N采样(Anchor neighbor sampling),作为训练过程中的批量数据。从第级随机选择个节点,每个节点代表一个原始类别。然后为每个类选择个在级最接近的类,以通过在视觉相似的类中学习最具区分性的特征。再在每个类中随机选取个样本,因此批量数据中共有个样本,可构造个三元组,表示随机抽取两个类(正类和负类);表示从正类中选择两个样本;表示从负类中随机选择负样本。
在此基础上作者把Triplet Loss中的margin参数调整为一个动态参数,它是根据构造的分层树上类间关系计算得到的:
其中是一个常数,它鼓励每一次迭代类间距更远;是把类合并后的节点的阈值;是类样本间的平均距离:
Related Issues not found
Please contact @0809zheng to initialize the comment