4.5.10 分类项-对组排异损失(N-Pair Loss)

迭代公式:

Dni=negativeiyi2Dpi=positivei yi2Loss=1Ni=1Nlog[m+jiexp(DpiDni)]=1Ni=1Njilog[m+exp(DpiDni)]{\displaystyle \begin{aligned} Dn_i &= \sqrt{|| negative_i - y_i||^2} \\ Dp_i &= \sqrt{|| positive_i \ - y_i||^2} \\ Loss &= \frac{1}{N} \sum_{i=1}^{N} log[m+ \sum_{j\neq i} exp( Dp_i - Dn_i)] \\ &= \frac{1}{N} \sum_{i=1}^{N} \sum_{j\neq i} log[m+ exp(Dp_i - Dn_i)] \\ \end{aligned} }

图像:

图 4-34 N-Pair Loss 函数图[16]

特性:

  1. 使具有相同标签的样本(positive)之间的距离,尽量接近

  2. 使具有不同标签的样本(negative)之间的距离,尽量远离

  3. 输入 N+1 个子集:1 个相似正样本集、N-1 个相反负样本集、1 个原样本对照集

  4. 同三元组损失一样,输入样本集,都在同权重下并行训练

  5. mm 项代表二维平面上多角度排斥最小力矩,一般 m=1m = 1 防止样本过近重合

  6. 越接近目标,损失越小

  7. 光滑(smooth),适合优化算法

  8. 非指数计算,算力消耗相对较低

对组排异损失(N-Pair Loss) 的提出,旨在解决 对比损失(Contrastive Loss) 和 三元组损失(Triplet Loss) 在分类上的局限性问题 [16] 。这两者,从物理学受力角度分析权重促成的样本聚集,会发现都是一维运动过程。

N-Pair Loss 的使用

N-Pair Loss 在每一次计算中,采用了 同样本集(Positive Set)负样本类集(Negative Classes Set) 的概念。类集中的每一个负样本,都会对预测结果产生排斥,而单一的正样本则会对预测结果产生吸引。这样就能够更好地实现同类型聚集效果。一个比较适当的例子,就像一滴油散到了水中,最终会被水排斥而聚成一个集合的油滴。

实际上,基克·索恩(Kihyuk Sohn) 在对组排异损失的推导过程中,详细描述了从 Triplet Loss -> (N+1)-Tuplet Loss -> N-Pair Loss 的完整过程。其中,(N+1)-Tuplet Loss 可认为是 N-Pair Loss 的过渡。

文中指出,当 N = 2 时,(N+1)-Tuplet Loss 可认为近似于 Triplet Loss。以此为起点,我们很快便会发现,对组排异损失 相当于将 三元组损失中 一组 相似正样本集(Positives)一组 相反负样本集(Negatives)一组 原样本对照集(Anchors) 总共三组之间,两两样本集间样本的距离均值计算,改换成了 一组 相似正样本集(Positives)多组 相反负样本集(Negatives)一组 原样本对照集(Anchors) 总共 N+1 组之间的距离计算。

即,相较于三元组损失,进一步细化了 相反负样本集(Negatives)内,不同标签的对正样本集的驱动作用。

同样以人脸识别(FD [Face Detection])为例,由 PP 位不同人的 DD 张该人不同脸的图片样本组成的,样本总量 PDP \cdot D 大小的数据集。

对组排异损失要求,也是三种样本分类子集分类:

  • 相似正样本集(Positives),由同人不同脸组成的 D1D -1 大小子集

  • 相反负样本集(Negatives),由不同人不同脸组成的 P1P - 1 组各 D1D - 1 大小子集

  • 原样本对照集(Anchors),由不同人同脸(选一校订)组成的 PP 大小子集

这三类子集,在数据分批后,会被分为相同批数并组合为一批数据,作为单次迭代输入数据,参与训练。我们仍然采用角标 [i][_i] 来表示分批,那么有:

batch_size=(Di1)+Pi1(Di1)+Pi=DiPi{batch\_size} = (D_i-1) + \sum^{P_i-1}(D_i-1)+P_i = D_iP_i

则,在分批数据参与一次批计算后,最终还是会构成同三元组损失类似的 batch_size{batch\_size} 大小的一组嵌入集(Embeddings),被我们用来计算损失函数(Loss)的实际处理对象。

因此,在工程上,我们 只需要更换单次损失的计算公式,就能从三元组损失的迁移至对组排异损失的计算过程。

N-Pair Loss 算子化

利用 C 语言实现对算子的封装,有:

运行验证可得到结果:

对组排异损失从样本宏观角度,统一了正负样本概念。指明了,非当前指向类的负样本,可以被认为是指向负样本类型情况的正样本。因此,对于 N 分类处理过程,整个运算损失计算时间复杂度被化简为仅有 2N。相当的高效。

Last updated

Was this helpful?