文章here提到了一种为卷积神经网络生成三元组的智能方法(为了生成面嵌入)。
对于包含n张图像的小批量,只有半硬三联用于学习(包含半硬阴影的三元组,它们是负图像足够接近锚图像。)
在我们的实验中,我们对训练数据进行采样,大约40个 每个小批量的每个标识选择面。另外, 随机抽样的负面被添加到每个小批量。
我做了什么
我在Wild数据集中使用Labeled Faces进行训练(13233个图像,5749个人,1680个人有两个或更多图像,每个批次我选择了一个锚点,一些正面(意思是我)只能使用 1680批次,因为我需要一个人的多个图像)和负片 - 随机选择的其他人的图像。
我的训练集出了点问题。迷你批次是否应包含更多锚点?
我们使用所有锚定阳性,而不是选择最难的阳性 在小批量中配对,同时仍然选择硬底片
在线生成三元组。这可以通过选择硬盘来完成 小批量内的正/负样本。
要选择我需要计算三胞胎嵌入的半硬底片。所以我需要通过三重神经网络进行传递,并比较嵌入。然后,我需要使用硬三元组计算损失函数 。这就是我认为我必须做的事情。
我使用三个卷积神经网络和共享参数(四个具有最大池和一个完全连接层的卷积层)。 我没有使用在线三元组生成,因为我无法理解它是如何完成的。它导致精度不超过70%。
答案 0 :(得分:1)
这个三元组网络不是最先进的方法,但绝对是该领域最好的里程碑之一。这不是那么直观,但我们开始了:
您的意思是正确的:在训练期间,在您定义的每个“时期”之后,您使用您的嵌入模型来计算您的图库和查询的嵌入。然后,您想要创建那些“半硬”三元组。因此,假设您有 person1,即锚点,您尝试将其与其他所有人(person2、3 等)匹配。然后,你想取一个离他最近的,也许用一个阈值来定义它足够接近,这样你就可以称之为难。那是消极的。对于积极的,你也可以尝试采取离他最远的一个,但这不一定是好的。对不良数据要谨慎。你至少需要有一个积极的。
所以现在每个人都有一个三元组:1 个锚点、1 个否定(最接近)和 1 个肯定。你可以在整个数据集上预先计算这个,或者随机选择足够大的列表,这样你就有足够的时间来填充一个纪元。完成此操作后,您就可以使用这些三元组并填充一个批次。
您在每个时期重复该计算以生成新的三元组以用于下一个时期。您这样做的次数越多,您获得的“在线”就越多。 必须重复的原因是嵌入模型发生了变化。所以你可能已经改进了以前的“困难”,但现在模型处理得更好,其他情况因此变得“困难”。所以它一定是一个迭代的过程。您可以将其视为某种期望最大化,其中期望是您计算数据距离的地方,而最大化是最小化嵌入模型的损失(最大化可能性/准确性)。然后重复。
作者在论文中提到的另一件事是批处理的一部分是这样完成的(负挖掘),而其他的只是通过随机选择的负样本(从负池中)来完成,以保持嵌入空间的完整性。一旦你的模型训练得足够多,这实际上是一种浪费,因为如果负样本很远,由于边际损失,损失可能为 0,对网络没有任何梯度。这就是为什么你没有得到很好的准确度的部分原因——模型看到了他正确处理的东西。仅通过随机选择遇到“硬”三元组的概率相对较低(想想三元组空间的复杂性)。
所以基本上这个想法是有三元组的批次会导致损失,所以你将最小化改进模型的东西,而不是每隔很长一段时间都会遇到一个硬三元组。这对于将此类模型提高到它实际上值得信赖的准确度水平(FRR@FAR-wise)极其重要。
最后,关于此使用批次中的所有正数 - 您也可以使用所有负数。因此,您可能在一批中拥有同一个人的两个主播,或者甚至一个主播对另一个主播是负面的。您可以批量计算所有成对距离,然后将它们用作样本。不过也需要平衡一下。编码也更复杂,因为您需要小心,考虑哪个嵌入属于谁,相应地将其称为正面或负面。