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

TensorFlow中Sigmoid交叉熵损失函数权重设置及类别不平衡处理

针对类别极度不平衡场景的损失函数构建方案

嘿,针对你这种95%是类别0、仅5%是类别1的极度不平衡二分类场景,核心解决思路就是给少数类的损失加权重,让模型不再“偷懒”只盯着多数类预测。下面具体说怎么落地,尤其是你提到的TensorFlow工具的用法:

1. 先搞懂权重怎么算

咱们要给少数类(标签1)的损失乘以更高的系数,最常用的计算方式是反类别频率:

  • 类别权重 = 总样本数 / (该类样本数 × 类别总数)
    对你的场景来说:
    • 类别0的权重 ≈ 1/0.95 ≈ 1.05
    • 类别1的权重 = 1/0.05 = 20
      简单说就是,每一个类别1样本的损失贡献,相当于20个类别0样本的贡献,这样模型就不得不重视少数类的学习了。

2. 用tf.losses.sigmoid_cross_entropy正确加权

你提到的这个函数确实支持权重参数,但要注意别用错:

  • 如果你只传一个标量权重,那所有样本的损失都会被统一缩放,这达不到咱们要的“给不同类别加权”的目的。
  • 正确的做法是传入和样本数量匹配的权重张量:给每个标签为1的样本分配20的权重,标签为0的分配1.05(或者也可以直接用1,因为多数类样本基数大,权重稍小也能平衡)。

给你写个简单的代码示例:

import tensorflow as tf

# 假设y_true是形状为[batch_size]的标签张量(值为0或1)
# 生成样本级权重:标签为1的用20,标签为0的用1.05
sample_weights = tf.where(tf.equal(y_true, 1), 20.0, 1.05)

# 计算带权重的sigmoid交叉熵损失
loss = tf.losses.sigmoid_cross_entropy(
    multi_class_labels=y_true,
    logits=model_output_logits,  # 注意这里传的是模型输出的logits,不是sigmoid后的概率
    weights=sample_weights
)

3. 补充:如果加权交叉熵不够,试试这些方案

  • Focal Loss:它比普通加权交叉熵更进一步,会降低那些容易分类的样本(比如绝大多数的类别0)的损失占比,让模型聚焦在难分类的少数类上。你可以基于sigmoid交叉熵自定义实现,核心是给损失乘以(1-p_t)^gamma(gamma通常取2)。
  • 结合采样策略:损失加权可以配合过采样(复制少数类样本)或欠采样(随机删除多数类样本)一起用,双管齐下效果会更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:28:03