使用半硬三元组时损失减少

Hel*_*ili 2 neural-network conv-neural-network tensorflow

是对三元组学习的简短回顾。我使用三个具有共享权重的卷积神经网络来生成人脸嵌入(),损失描述如下

三重态损失:

anchor_output = ...  # shape [None, 128]
positive_output = ...  # shape [None, 128]
negative_output = ...  # shape [None, 128]

d_pos = tf.reduce_sum(tf.square(anchor_output - positive_output), 1)
d_neg = tf.reduce_sum(tf.square(anchor_output - negative_output), 1)

loss = tf.maximum(0., margin + d_pos - d_neg)
loss = tf.reduce_mean(loss)
Run Code Online (Sandbox Code Playgroud)

当我只选择硬三元组 ( distance(anchor, positive) < distance(anchor, negative)) 时,损失非常小:0.08。当我选择所有三元组时,损失变得更大0.17855。这些只是 10 000 个三联体对的测试值,但我在实际集合(600 000 个三联体对)上得到了类似的结果。

为什么会出现这种情况?这是对的吗?

我使用 SGD 进行动量,从学习率 0.001开始。

Oli*_*rot 6

以下是关于三元组硬度的术语的快速回顾:

  • easy triplets : 损失为 0 的三元组,因为d(a,p) + margin < d(a,n)
  • 硬三元组:负数比正数更接近锚点的三元组,即d(a,n) < d(a,p)
  • 半硬三元组:三元组中负数并不比正数更接近锚点,但仍然具有正损失:d(a, p) < d(a, n) < d(a, p) + margin

在此输入图像描述

你在这里描述的是:

当我仅选择硬三元组时(距离(锚点,正值)<距离(锚点,负值))

实际上是选择半困难三元组和简单三元组。你删除了困难的三元组,所以你的损失更小。