三元组损失定义如下:
L(A, P, N) = max(‖f(A) - f(P)‖² - ‖f(A) - f(N)‖² + margin, 0)
其中 A=anchor
、P=positive
和 N=negative
是损失中的数据样本,margin
是锚点与正/负样本之间的最小距离。
我曾在某处读到可以用 (1 - cosine_similarity)
来代替 L2 distance
。
请注意,我使用的是 Tensorflow
– 余弦相似度损失的定义是,当其为-1到0之间的负数时,0表示正交,值越接近-1表示相似度越大。值越接近1表示差异性越大。因此,它与余弦相似度度量是相反的。
关于如何使用余弦相似度编写我的三元组损失,有什么建议吗?
编辑
答案(评论和答案)中都有很好的内容。根据所有提示 – 这对我来说运作良好:
self.margin = 1 self.loss = tf.keras.losses.CosineSimilarity(axis=1) ap_distance = self.loss(anchor, positive) an_distance = self.loss(anchor, negative) loss = tf.maximum(ap_distance - an_distance + self.margin, 0.0)
我最终希望使用@pygeek指出的tensorflow附加损失,但我还没有弄清楚如何传递数据。
注意要独立使用它 – 必须做类似这样的事情:
cosine_similarity = tf.keras.metrics.CosineSimilarity()cosine_similarity.reset_state()cosine_similarity.update_state(anch_prediction, other_prediction)similarity = cosine_similarity.result().numpy()
资源
回答:
首先,Cosine_distance = 1 - cosine_similarity
。距离和相似度是不同的。这在一些答案中没有正确提及!
其次,你应该查看TensorFlow代码,了解cosine similarity loss
是如何实现的 https://github.com/keras-team/keras/blob/v2.9.0/keras/losses.py#L2202-L2272,这与PyTorch不同!!
最后,我建议你使用现有的损失:你应该用 tf.losses.cosineDistance(...)
替换 || ... ||^2
。