如何在三元组损失中使用余弦相似度

三元组损失定义如下:

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)

我最终希望使用@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() 

资源

pytorch余弦嵌入层

tensorflow余弦相似度实现

tensorflow三元组损失硬/软边界


回答:

首先,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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注