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

TensorFlow自定义损失报错:未提供任何变量的梯度

解决TensorFlow中斯皮尔曼损失函数无法计算梯度的问题

你的问题核心在于**tf.argsort是不可微分操作**——它输出的是整数索引,反向传播时无法生成梯度,所以才会出现“No gradients provided for any variable”的错误。要解决这个问题,需要用可微分的近似排序方法替代硬排序(argsort)。

下面是修改后的可微分斯皮尔曼损失实现:

import tensorflow as tf
from tensorflow.keras.losses import Loss

def soft_rank(x, axis=0, temperature=1.0):
    x_shape = tf.shape(x)
    # 扩展维度,准备计算成对元素差异
    x_expanded = tf.expand_dims(x, axis=axis+1)
    # 沿目标轴复制张量,生成[N, N]形状的成对矩阵
    tile_dims = tf.concat([tf.ones(axis+1, dtype=tf.int32), [x_shape[axis]]], axis=0)
    x_tiled = tf.tile(x_expanded, tile_dims)
    # 计算成对元素的差值矩阵
    pairwise_diff = x_tiled - tf.transpose(x_tiled, perm=list(range(axis)) + [axis+1, axis])
    # 用sigmoid近似硬排序的阶跃逻辑,温度控制近似程度
    pairwise_rank = tf.sigmoid(pairwise_diff / temperature)
    # 求和得到每个元素的近似排名,+0.5对齐硬排序的索引范围
    rank = tf.reduce_sum(pairwise_rank, axis=axis+1) + 0.5
    return tf.cast(rank, tf.float32)

class Spearman(Loss):
    def __init__(self, temperature=1.0, **kwargs):
        super().__init__(**kwargs)
        self.temperature = temperature

    def call(self, target, pred):
        # 用可微分的软排序替代不可微分的argsort
        pred_rank = soft_rank(pred, axis=0, temperature=self.temperature)
        target_rank = soft_rank(target, axis=0, temperature=self.temperature)
        
        # 保持原有的标准化逻辑
        pred_rank = pred_rank - tf.reduce_mean(pred_rank)
        pred_rank = pred_rank / (tf.norm(pred_rank) + 0.01)
        
        target_rank = target_rank - tf.reduce_mean(target_rank)
        target_rank = target_rank / (tf.norm(target_rank) + 0.01)
        
        # 负点积作为损失:最大化斯皮尔曼相关系数等价于最小化该损失
        return -tf.reduce_sum(pred_rank * target_rank)

关键说明:

  • 软排序原理:通过引入temperature(温度)参数,用sigmoid函数近似硬排序的阶跃行为。温度越低,结果越接近真实的argsort;温度越高,排序结果越平滑,梯度传递更稳定。
  • 梯度可传递:整个soft_rank函数的所有操作都是可微分的,反向传播时能正常计算梯度,解决原代码的无梯度问题。
  • 参数调整:如果需要更接近硬排序的效果,可以降低temperature值(比如设为0.1);如果训练不稳定,可适当提高温度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:37:54