如何在三重态损失中使用余弦相似度



三元组损失定义如下:

L(A, P, N) = max(‖f(A) - f(P)‖² - ‖f(A) - f(N)‖² + margin, 0)

其中A=anchorP=positiveN=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)

我想最终使用tensorflow插件损失@pygeek指出,但我还没有弄清楚如何传递数据。

注意要单独使用它,必须这样做:

cosine_similarity = tf.keras.metrics.CosineSimilarity()
cosine_similarity.reset_state()
cosine_similarity.update_state(anch_prediction, other_prediction)
similarity = cosine_similarity.result().numpy() 

pytorch余弦嵌入层

tensorflow余弦相似度实现

tensorflow三重损失硬/软边界

首先是Cosine_distance = 1 - cosine_similarity。距离和相似性是不同的。在一些答案中没有正确提到这一点!

其次,你应该看看TensorFlow代码如何实现cosine similarity losshttps://github.com/keras-team/keras/blob/v2.9.0/keras/losses.py#L2202-L2272,这与PyTorch不同!!

最后,我建议您使用现有的损失:您应该将|| ... ||^2替换为tf.losses.cosineDistance(...)

我猜你从两个向量之间的余弦定义中用余弦原点替换L2的意思是:

cos(f(A), f(P)) = f(A) * f(P)/(‖f(A)‖*‖f(P)‖)

,其中沿特征维数的点积在上面是隐含的。接下来,注意

[1 - cos(f(A), f(P))]*‖f(A)‖*‖f(P)‖ = ‖f(A) - f(P)‖² - (‖f(A)‖ - ‖f(P)‖)²

给出了一个关于这个概念来自哪里的提示,当‖f(A)‖ = ‖f(P)‖。所以你的公式可以自然地变成

L(A, P, N) = max(cos(f(A), f(N)) - cos(f(A), f(P)) + margin, 0)

您的margin参数应该相应地调整。下面是一些计算向量

余弦的Tensorflow代码
def cos(A, B):
return tf.reduce_sum(A*B, axis=-1)/tf.norm(A, axis=-1)/tf.norm(B, axis=-1)

这种损失何时对你的特定问题有利取决于问题,所以祝你的实验好运。

最新更新