You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow中tf.losses.cosine_distance损失值大于1的技术问询

关于TensorFlow中tf.losses.cosine_distance损失值大于1的疑问解答

嘿,这个问题我做对比学习的时候也踩过坑,其实核心是对余弦距离的范围和TensorFlow这个函数的实现细节理解有偏差,咱们一步步理清楚:

首先:为什么归一化后的输入会出现损失大于1?

你可能混淆了余弦相似度和余弦距离的定义:

  • 余弦相似度是两个向量的夹角余弦值,范围是[-1, 1](完全同向为1,完全反向为-1)
  • 而余弦距离的标准定义是1 - 余弦相似度,所以范围是[0, 2]!

也就是说,当你的模型输出和标签完全反向时,余弦距离会达到最大值2,这完全是合理的数值,训练中出现损失大于1是正常现象,不是bug。

然后:tf.losses.cosine_distance的具体计算逻辑

这个函数的计算步骤可以拆解为:

  1. 归一化处理:默认会对predictions参数做L2归一化(除非你显式设置normalize=False)。如果你已经手动把输入张量归一化到单位长度,一定要加上这个参数,避免重复归一化的冗余计算。
  2. 余弦距离计算:对归一化后的向量计算1 - (predictions · labels)(因为单位向量的点积就是余弦相似度),得到单个样本的损失值。

最后:是不是批量损失之和?

这个取决于函数的reduction参数(默认是tf.losses.Reduction.SUM_BY_NONZERO_WEIGHTS):

  • 如果设置reduction=tf.losses.Reduction.SUM:返回的是批量中所有样本损失的总和
  • 如果是默认的SUM_BY_NONZERO_WEIGHTS:返回的是加权损失总和除以非零权重的样本数(相当于带权重的平均)
  • 如果设置reduction=tf.losses.Reduction.NONE:会返回每个样本单独的损失值,你可以自己手动求和或平均

所以默认情况下不是单纯的批量损失之和,而是加权平均后的结果,但如果你的批量里有多个样本的损失大于1,平均后自然也会超过1。

小验证建议

你可以手动跑个小测试确认:

import tensorflow as tf

# 两个完全反向的单位向量
y_true = tf.constant([[1.0, 0.0]])
y_pred = tf.constant([[-1.0, 0.0]])

loss = tf.losses.cosine_distance(y_true, y_pred, axis=1, normalize=False)
print(loss.numpy())  # 输出应该是2.0

内容的提问来源于stack exchange,提问作者Enrico Beltramo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:15:42