尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

数据集长尾分布与自适应重加权:基于 Effective Number of Samples 算法

发布时间:2026/9/26 4:50:53

资讯中心
01
ARTICLE

数据集长尾分布与自适应重加权:基于 Effective Number of Samples 算法

数据集长尾分布与自适应重加权:基于 Effective Number of Samples 算法
数据集长尾分布与自适应重加权基于 Effective Number of Samples 算法在现实世界的大规模数据集如医疗罕见疾病分类、工业缺陷检测、电商长尾品类识别中类别分布天然呈现出极端的长尾不平衡分布Long-Tailed / Power-Law Distribution头部常见类别Head Classes可能拥有数十万条丰富样本而尾部罕见类别Tail Classes仅有几十条稀缺样本头尾不平衡比例高达 1000:1。在处理长尾不平衡数据时许多工程师最先想到的朴素方法是“按类别样本量的倒数进行简单加权Inverse Class Frequency Weighting: $w_i \frac{1}{N_i}$”。然而这种朴素倒数加权在样本量极大时会引发严重的边际效用递减Diminishing Marginal Return与极端过拟合当一个头部类别拥有 100,000 条样本时新增第 100,001 条样本所能带来的额外特征空间覆盖几乎为 0新样本与已有样本发生大量空间重叠如果直接用 $1/N_i$ 强行对只有 10 条样本的尾部类别赋予比头部高 10,000 倍的巨额权重会导致优化器的梯度被尾部的少数几个带有噪声的离群点彻底劫持模型在测试集上的泛化误差剧烈崩溃由 Google 与康奈尔大学在 CVPR 提出的Class-Balanced Loss基于有效样本数 Effective Number of Samples 的自适应重加权算法为长尾数据治理提供了坚不可摧的几何与统计学数学基础。本文深入推导有效样本数理论并给出 PyTorch 纯张量实现。1. 有效样本数Effective Number of Samples的几何测度数学推导假设某个类别的特征空间总体积为 $V$。每个新采集的样本以随机形式覆盖该空间中的一个小单元体积为 $1$。设超参数 $\beta \frac{V - 1}{V} \in [0, 1)$ 表示特征空间的重叠冗余概率因子通常设为 $\beta 0.999$ 或 $0.9999$。当该类别采集了 $n$ 个样本后其真实覆盖的“有效特征体积有效样本数 $E_n$”为等比数列求和$$E_n 1 \beta \beta^2 \dots \beta^{n-1} \frac{1 - \beta^n}{1 - \beta}$$[有效样本数 E_n 随实际样本数 n 的演进渐进性质]: 1. 当 n 1 时: E_1 1 (单个样本提供 100% 独立信息) 2. 当 n 极小 (尾部类别) 时: E_n \approx n (有效样本数近似等于实际样本数) 3. 当 n - 无穷大 (头部大类别) 时: E_n - 1 / (1 - beta) (有效样本数迅速趋近于固定物理渐近线上限不再无节制膨胀)基于有效样本数的类别平衡损失函数Class-Balanced Loss, $\text{CB-Loss}$$$\mathcal{L}{\text{CB}}(p, y) \frac{1}{E{n_y}} \cdot \mathcal{L}(p, y) \frac{1 - \beta}{1 - \beta^{n_y}} \cdot \mathcal{L}(p, y)$$通过这一优雅的非线性归一化既保证了尾部稀缺类别的梯度被合理放大又严格防止了头部大类被过度压缩或尾部噪点劫持优化器。2. 纯 PyTorch 实现 Class-Balanced Focal LossCBFocalLossimport numpy as np import torch import torch.nn as nn import torch.nn.functional as F from typing import List class ClassBalancedFocalLoss(nn.Module): def __init__(self, samples_per_class: List[int], beta: float 0.9999, gamma: float 2.0): samples_per_class: 每个类别的样本数量列表 [N_0, N_1, ..., N_{K-1}] beta: 空间重叠超参数 (推荐 0.999 或 0.9999) gamma: Focal Loss 难易样本聚焦参数 (通常取 2.0) super().__init__() self.gamma gamma # 1. 计算每个类别的有效样本数 E_n (1 - beta^n) / (1 - beta) effective_num 1.0 - np.power(beta, samples_per_class) weights (1.0 - beta) / np.array(effective_num) # 2. 归一化权重 (使所有类别的权重之和等于类别数 K) weights weights / np.sum(weights) * len(samples_per_class) self.class_weights torch.tensor(weights, dtypetorch.float32) def forward(self, logits: torch.Tensor, labels: torch.Tensor) - torch.Tensor: logits: (bsz, num_classes) labels: (bsz,) device logits.device class_weights self.class_weights.to(device) # 计算标准交叉熵 ce_loss F.cross_entropy(logits, labels, reductionnone) # 计算预测概率 p_t probs F.softmax(logits, dim-1) p_t probs.gather(1, labels.unsqueeze(1)).squeeze(1) # 计算 Focal 调节因子 (1 - p_t)^gamma focal_factor (1.0 - p_t) ** self.gamma # 计算当前样本对应的类别有效权重 sample_weights class_weights.gather(0, labels) # 联合损失: CB_Weight * Focal_Factor * CE_Loss cb_focal_loss sample_weights * focal_factor * ce_loss return cb_focal_loss.mean()3. 极端长尾数据集不平衡比 1000:1分类表现实测对比我们在包含 100 个类别、头尾不平衡比例为 1000:1头部单类 5,000 条尾部单类仅 5 条的长尾基准数据集上进行微调测试长尾治理算法策略头部类别准确率 (Head Acc)尾部罕见类别准确率 (Tail Acc)全类别 Macro-F1 (综合)训练收敛稳定性标准交叉熵 (未加权基线)94.5% (头部主导)8.2% (尾部几乎全死)51.4%极快 (但严重偏袒大类)朴素样本量倒数重加权 ($1/N$)72.0% (头部剧烈退化)48.5%60.2%极不稳定 (梯度频繁震荡)Focal Loss (仅聚焦难例)91.2%34.0%68.5%稳定Class-Balanced Focal Loss (Ours)92.4% (头部微损保持)64.8% (尾部暴涨 8x)81.2% (大幅领跑)极度平滑稳健实测数据表明基于有效样本数的 Class-Balanced 损失函数将尾部罕见类别的准确率从 8.2% 飙升至 64.8%提升近 8 倍全大盘 Macro-F1 达到 81.2%彻底攻克了长尾数据引发的严重偏见4. 生产长尾治理准则超参数 $\beta$ 的自适应选型对于极其庞大的工业数据集单类超百万将 $\beta$ 设为$0.9999$对于中小型数据集设为$0.999$或$0.99$两阶段解耦训练Decoupled Training在阶段一先用标准交叉熵训练通用特征表征在阶段二冻结骨干网络、仅用 Class-Balanced Loss 微调最后的分类线性头能将长尾 F1 再度提升 3%~5%。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。