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

使用Focal Loss时初始损失值过高的问题排查求助

Focal Loss时初始损失值过高的问题排查求助

大家好,我目前在处理一个高度不平衡的多分类任务,之前了解到TensorFlow里的Focal Loss可以缓解这类问题,于是自己实现了适配稀疏标签的版本,但遇到了一个困惑:模型初始损失依然高达4000-5000左右,和直接用基础的稀疏分类交叉熵损失的初始值差不多。

我已经做了这些准备工作:

  • 因为用的是稀疏标签,专门调整了Focal Loss函数,把稀疏标签转成独热编码,并且手动验证过这部分转换是正常工作的
  • 损失返回的是每个batch计算出的Focal Loss向量的均值
  • 参考二分类的初始偏置方法,给每个类别都设置了初始偏置

下面是我实现的SparseFocalLoss代码:

class SparseFocalLoss(tf.keras.losses.Loss):
    def __init__(self, gamma = 2.0, alpha = 0.25, from_logits = False, name = "sparse_focal_loss", reduction = tf.keras.losses.Reduction.AUTO):
        super().__init__(reduction = reduction, name = name)
        self.gamma = gamma
        self.alpha = alpha
        self.from_logits = from_logits

    def call(self, Y_true, Y_pred):
        if self.from_logits:
            Y_pred = tf.nn.softmax(Y_pred, axis = -1)
        
        # 获取总类别数
        Classes = tf.shape(Y_pred)[-1]
        # 调整真实标签形状并转成int32
        Y_true = tf.cast(tf.reshape(Y_true, [-1]), tf.int32)
        # 转成独热编码
        Y_true_OHE = tf.one_hot(Y_true, depth=Classes)
        # 调整预测值形状和真实标签一致
        Y_pred = tf.reshape(Y_pred, [-1, Classes])
        # 裁剪数值避免出现0或1
        Y_pred = tf.clip_by_value(
            t=Y_pred, 
            clip_value_min=1e-12, 
            clip_value_max=1. - 1e-12)
        
        # 计算Focal Loss
        # FL = -a * (1 - Pt)**gamma * log(Pt)
        Pt = tf.reduce_sum(Y_true_OHE * Y_pred, axis = -1)
        FL = -1 * self.alpha * tf.pow(1 - Pt, self.gamma) * tf.math.log(Pt)
        
        return(tf.reduce_mean(FL, axis = -1))

我已经用笔和纸验证过这个公式的推导是正确的,但实在想不通为什么初始损失和基础损失差不多。有没有朋友能帮我排查一下可能的问题点?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:24:34