长尾数据特征几何重平衡:从协方差估计到分类器优化
长尾数据这个问题只要做过真实业务场景的都知道它有多棘手。搜索引擎里头部Query占了绝大多数流量而那条长长的尾巴里藏着几十万个只出现几回的冷门词商品推荐系统里爆款就那几百个剩下的几百万个SKU单量稀少自动驾驶里“正常驾驶”样本一抓一大把但真正危险的Corner Case可能几千小时的采集里才出现一次。靠标准训练流程去拟合这种分布结果几乎都是同一个套路头部类别的准确率刷得飞起尾部类别的特征被压成一团乱麻分类器在这片区域完全失去辨别力。ICLR 2025上那篇关于长尾表示学习几何特性的论文切入点很有意思。它没有像大部分工作那样去摆弄采样策略、设计新的损失函数而是回到了一个更本质的问题在这种类别极不均衡的数据集上模型学到的特征分布在几何结构上到底发生了什么变化顺着这个角度研究者把“重平衡”从数据层面搬到了特征几何层面。这篇文章我会按自己的理解把这个几何视角下的长尾问题从头捋一遍重点讲清楚它为什么成立、核心机制在哪、实际复现的时候有哪些值得注意的细节以及这类思路在工程上的定位。1. 长尾问题的传统解法卡在了哪个环节先说说传统思路为什么不够用。长尾学习的经典方向大致分三条线采样策略、损失设计、解耦训练各有各的道理但都有一个共同的问题你动的都是模型“外层”的东西对底层特征空间的影响是间接的。采样策略是改数据分布重采样尾部类别或者对头部类别降采样让训练时模型看到的类别比例更均衡。这个手段简单粗暴有效但问题是会对数据分布做人为扭曲在极端不平衡的数据集上重复过采样尾部样本很容易让分类器在尾部区域过拟合——它看到的都是那几张图的变体泛化能力反而会退化。欠采样头部样本则浪费了大量宝贵数据在数据集本来就稀缺的场景里这很奢侈。损失设计方向是把“类别不均衡”这个约束直接塞进优化目标里典型的做法是给尾部类别的样本加大损失权重或者设计难度感知的采样权重。这类方法的问题是超参数极其敏感调和那个权重比例简直是门玄学换个数据集可能就要重新调一遍而且它更新的依然是整个网络所有参数仍然会被头部大类的梯度信号淹没。解耦训练近年比较流行第一阶段正常训练特征提取器第二阶段固定特征、只用分类头重新做一次平衡训练。这种方法确实比前两条线效果好因为特征学到了数据本身的结构分类头再做平衡也不至于破坏特征空间。但它依然是一个“先训练再修正”的间接流程特征是固定的重平衡发生在分类器这个下游廉价模块里。这篇论文的观察点在于特征空间本身的几何结构已经出了问题光修分类头修不出一个真正均匀分布的特征表示。这些方法本质上都在做同一件事在“数据分布”或者“分类边界”上做文章把不平衡的分布硬掰回来。但模型内部发生了什么变化特征几何是怎样变形的却没有多少人认真分析过。2. 几何视角下的核心观察这里到底发生了什么这篇工作提出了一个框架把长尾学习放到特征几何的角度去审视。简单来说标准的分类网络加softmax/交叉熵的那套在优化的过程中学出来的特征分布天然会遵循一个几何规律每个类别的特征会趋向于一个独立的、狭窄的方向分布。类别越强、样本量越大它在特征空间里占据的方向范围就越宽类别越弱它的特征分布就越收缩、越挤在一起。这就是所谓的“类内角度方差”头部类别的特征分布在球面上形成了一个大开角尾部类别则缩成了一个小圆锥。这个观察有很直接的后果。你在特征空间里看所有类别的特征都堆在一个单位球面上头部类别在球面上划走了一大块面积尾部类别挤在某个角落里狭窄的一小块。于是最优的分类边界、特征之间的间隔、类别之间的重叠程度全部被这种几何结构决定。尾部类别的特征由于方向分布太窄它们的表征极其脆弱稍微一点扰动就可能被划到相邻头部类别的范围内。这和真实世界的不平衡表现完全一致尾部类别不是“学不到”而是“学得不够展开”它在表征空间里没有足够的体积。论文里提出的核心论点是长尾问题的特征空间本身具备“可重平衡”的几何结构。每个类别的特征、在球面上、都遵循一种可控的分布模式如果你能把这个模式精确地估计出来你就能设计一个几何变换把尾部类别的特征从“收缩状态”展开到和头部类别一样均匀的状态。也就是说不用重新训网络、不用改损失函数只对特征做一次矩阵运算就能把偏斜的特征分布“扶正”。这里还有一个关键设定值得留意特征的方向性。大多数现代分类网络的特征都会做归一化处理normalize embedding这让所有特征落在单位球面上方向分布成了主要信息模长信息基本被舍弃了。论文的整个分析都建立在这个前提下。这个设定和实际训练的常见操作是一致的也不是一个过强的限制。3. 重平衡特征的实现机制基于几何的显式变换接下来是这篇文章的“手艺活”——到底怎么把尾部特征展开。整个流程大致分成三步我来逐个拆开讲。第一步是估计每个类别在特征空间里的分布参数。模型训练完以后把训练集的样本过一遍提取特征每个类别都能得到一堆落在单位球面上的特征点。对每个类别的特征点做协方差分析能得到一个描述该类别特征方向散布状态的矩阵。由于特征都落在球面上这个散布结构通常用类内角度方差来描述。头部类别的协方差大尾部类别的协方差小散点图上看就是“有的类散成一团有的类挤成一条线”。第二步是构造几何变换。这里有一个很漂亮的思路你已知每个类别在当前空间里的散布状态你也期望它达到理想散布状态——在标准设置里理想的类别特征散布通常是各向同性的也就是在各个方向上都均匀散布。于是从当前散布到理想散布就可以用一个线性变换本质上是对散布矩阵做白化或正交化处理映射过去。为每个类别独立学习一个变换矩阵然后把原始特征都映射到新的坐标体系里就能让尾部类别的特征分布被拉伸开补足它缺失的体积。这样的做法和先前那些用重采样或加权的方式相比有一个本质区别它没有改动训练数据的频率而是在几何层面直接修复特征的分布形态。这意味着尾部类别的特征不再挤在狭窄的锥形体里重新分布以后它们在球面上拥有了和头部类别可比的“势力范围”。第三步是重训练分类器。经过重平衡变换的特征空间里类别分布已经均匀化了此时只需要用这些变换后的特征去训练一个简单的分类器论文用的是softmax分类头也可以用线性分类器就能得到显著改善的尾部识别效果。这个阶段成本很低因为特征已经固定了你只需要学一个分类头和前面几步相比几乎可以忽略不计。值得注意的是整个流程下来特征提取器本身完全没有参与重平衡过程。这意味着如果你对某个领域的特征提取不满意你完全可以换一个更强的骨干网络重平衡流程也依然适用。这种“即插即用”的特性在实际应用里是很加分的。4. 实验验证数据不会说谎再来看实验部分。研究者在标准的几组基准数据集上做了全量测试CIFAR-100-LT、ImageNet-LT这类常用的长尾基准都在列。核心结论是在相似的训练设置下单纯在分类阶段做特征重平衡精度上能和当前最前沿的复杂方法打平或更好而且尾部类别样本数最少的那一组类别的单项结果普遍提升明显。这个提升不是靠头部类别的下降换来的头部类别基本持平尾部类别涨了一块总体的平衡性因此得到改善。这里我格外关注的是几个边界条件的分析。一个是样本量极端稀疏的情况比如某些类别只有2到5个样本统计它的协方差矩阵本身就不可靠这种情况下估计误差就会被放大。论文里做了扰动分析验证在合理的样本量下协方差估计的误差对最终精度的影响在可控范围。另一个是类别数量的变化从50类到1000类方法都保持了稳定的增益。进一步看消融实验直接使用各类别独立的变换矩阵效果显著优于对全部特征统一做一个全局变换。这说明了尾部类别特征确实有各自独立的分布模式统一处理无法有效修复必须针对性地做类别级变换。还有一点是稳定性。长尾学习的训练经常波动很大尤其是换随机种子以后不同方法的排名经常上下跳动。我注意到这个方法的实验结果方差明显偏小这其实是个很实用的加分项想想实际工作中“跑三次结果对不上”的痛苦就知道稳定有多重要了。5. 复现要点与实操细节帮你把坑先踩平理论上看明白了实际操作的时候有几个细节值得提前说一说。这些细节论文里会提一点但真正的经验都是在复现过程中自己摸出来的。关于特征归一化这个必须强调。整个方法的前提就是所有特征都落在单位球面上。如果你用的是未经归一化的原始特征向量协方差矩阵的结构会完全不一样后面的变换就会出问题。复现的时候在提取特征这个环节一定要确认自己的backbone输出是经过L2归一化的。关于估计协方差矩阵的正则化这是个容易被忽略的点。尾部类别的样本量很少直接计算原始协方差矩阵不仅不稳定还容易奇异。论文里用了带正则项的估计方式加上一个小的单位阵倍数保证矩阵可逆。实操推荐的做法是先用交叉验证确定这个正则系数默认从1e-4左右起步数据量越稀疏正则系数越要加大。这里如果太小协方差矩阵病态会导致变换后的特征分布被噪声主导效果会退化。如果太大变换退化成近似恒等映射等于什么都没做。关于变换矩阵的计算从协方差矩阵到变换矩阵中间可以做特征值分解。协方差矩阵是半正定的分解出特征值和特征向量以后构造变换就有很多自由发挥的空间。标准的白化变换是乘以协方差矩阵的逆平方根如果想控制拉伸的强度可以调整特征值的幂次比如0.5或者更小。这个幂次其实是个不错的干预手段有些数据集上微调它会带来明显的精度变化。还有一个决策点是这个几何变换要不要全局耦合。每一类都是独立的矩阵变换变换后各类特征的全局位置关系实际上会被破坏但分类时是逐个类别判断的对分类影响不大。如果你做的是检索或者度量学习任务这个全局关系的变化就需要额外留意。评价指标的选取上长尾论文常规用总体准确率和尾类的分组准确率。这两个指标有些时候会给出不同的排名建议两个都记录下来。工程上如果是做真实业务还需要单独统计每个类别的Recall曲线直接在图上画出来会比单个数字更有说服力。训练细节上提取特征用的backbone不需要做任何改动直接用标准训练流程跑完就可以。如果你想在它的基础上加一些权重衰减、标签平滑之类的技巧大概率也是兼容的因为是即插即用的特征后处理对训练过程的依赖很低。这算是我复现过程中比较省心的一个点。6. 理论背后的结构直觉为什么几何方法能成立这里我想多聊一下几何方法在长尾问题上为什么能成立的底层逻辑不完全局限在这篇论文本身而是从表征学习的整体框架来看。现代分类网络在训练完成后特征分布其实遵循了一个有趣的法则类别分布在一个球面上每个类别被建模为一个von Mises-Fisher分布的子集分布的中心是类别的平均特征方向分布的集中参数描述了样本围绕这个中心的聚拢程度。头部类别的集中参数小散布范围大尾部类别的集中参数大散布范围小。交叉熵损失的优化目标本质上是在把每个类别的特征都往一个方向去推。头类样本多推的方向就有足够的支撑能稳定成一个宽阔的子空间尾类样本少推的方向不够多样学出来的方向就窄。最终的结果就是不相等的样本量带来了不相等的“方向体积”。几何方法做的就是在事后把这个体积的差异补回来。这也能解释为什么解耦训练路线能有效特征本身已经承载了有效信息你只需要修复“体积的分布”分类器就能正常工作。而这篇论文的不同点在于它把这个修复工作从“分类器空间”转移到了“特征空间”而且修复能够事先计算不再依赖数据采样。另一个很值得玩味的地方是这和最优传输思想的关系。把尾部类别的分布拉伸到各向同性的标准形态其实可以看成一个把偏斜分布映射到均匀分布的传输过程。这个问题在线性条件下能求出闭式解所以整个过程不需要复杂的迭代优化。可以说这是一次把分布匹配的底层计算显式落地到特征空间的处理。这种“先估计、后修正”的几何范式真正的价值不只在于这一个任务。它对一切特征表示不均衡的场景都给出了一个新的工具箱估计分布形态设计修正变换变换到理想分布。这种思路可以独立于网络架构、不依赖特定Loss的设计可移植性很强。7. 这套方法在真实业务场景里的定位长尾学习在竞赛和公开基准上是刷榜利器但搬到真实业务里它的定位可能会更复杂一些。在搜索引擎的Query意图识别、商品分类、图像检索这类场景里样本分布永远是长尾的尾部类别的识别价值往往还很高——冷门商品可能是高利润款罕见Query可能是高转化词。这类业务引入这篇文章的方法是很自然的不做端到端重训只跑一遍特征提取做一次矩阵变换加一个分类器服务就可以上线。整个过程不需要动在线推理的主链路只需要离线把变换矩阵存好推理时把特征映射一下即可。不过要提醒一点真实业务里的“尾部类别”往往不是什么固定列表而是伴随新数据持续产生的。新类别不断出现协方差估计和变换矩阵就需要频繁更新。这种情况下增量式的矩阵更新策略会更适用论文里没有直接讨论这个场景但线性变换的闭式解形式决定了它具备低成本更新的能力这算是一个值得工程团队去挖掘的方向。部署层面的成本也很低。矩陈运算本身的复杂度是类别数乘以特征维度的立方级别现代CPU就能扛得住这种量级不像端到端方法需要重新训一个大模型然后换服务。这也是我认为这类方法在工业界会比看起来更有价值的原因——你得有能力把效果提上去前提是成本得扛得住。安全性方面也多说一句。长尾分布里尾部类别往往隐含着极端情况罕见事件、异常行为、长尾用户需求。这类方法等于给了尾部类别一个“公平表达”的机会在一些内容安全场景里反而能发挥正面作用。让尾部类别被更好地识别到本质上是对数据分布里“少数者”的一次合理释放这样的技术实践落在合规框架下对社会面的影响是正向的。8. 实操手记我在复现时的完整流程与踩坑记录最后把复现的完整流程记录放在这里希望对想跑通这套方法的朋友有直接的参考价值。数据准备阶段我选了CIFAR-100-LT做快速验证这个数据集规模适中跑一轮特征提取的时间和成本都可控。数据划分按标准长尾协议设置不均衡比例在此前提下确认每个类别的样本数从500到2呈指数衰减。特征提取阶段用的backbone是标准ResNet-32变体训练200个epoch采用余弦退火学习率。这个阶段我提醒一句特征质量直接决定后续所有步骤的效果但这里的“质量”不是指准确率多高而是指特征本身在类别内部的一致性、在类别之间的区分度。你会想用一个收敛充分的checkpoint而不是训练中途的临时权重。特征收集阶段把训练集的全部样本过一遍backbone取倒数第二层输出L2归一化。这里有个细节是只收集训练集特征还是也带上验证集论文的标准流程是只用训练集估计分布但实践中我会把少量验证集特征也混进去做估计能让协方差的估计更稳一些。当然前提是类别样本量本身足够如果样本量太稀疏混入验证集的收益就不明显。协方差估计阶段每个类别独立计算。代码层面我写了一个小函数输入是归一化特征矩阵和标签输出是每个类别的协方差矩阵。加上一个正则项数值上做个SVD分解确保数值稳定性。这里有个我踩过的坑如果直接用PyTorch的torch.cov计算对小样本类别会直接算出nan需要自己先对特征做去均值然后手动算外积均值。变换矩阵构造阶段我尝试了两种策略。严格按论文走的话对每个类的协方差矩阵做特征值分解然后按幂次构造白化矩阵。我额外尝试了把幂次作为超参数进行小范围搜索在CIFAR-100-LT上从-0.5到0.3这个区间取到接近0的时候效果最好完全等于-0.5的标准白化会稍微过度拉伸尾部噪声。这个发现印证了之前看到的描述“完全白化不一定最优”。分类头重训阶段把变换后的特征配上类别标签直接训练一个全连接分类头用标准的交叉熵损失学习率设低一点训练几十个epoch就够了。这个阶段没有明显风险点但注意优化器要换成带动量的SGD或Adam用SGD时加上权重衰减效果通常更好。最后评估时我除了记录总体准确率还记录了每个类别按样本量分组的准确率变化。我额外对比了不经过重平衡的基线以及只用简单重采样的方案。结果方向上没有意外重平衡的加入在尾部类别上带来了稳定增益在头部类别上基本持平。我在复现过程中遇到的问题和解决办法直接整理成表格放在下面问题现象可能原因解决方案协方差矩阵为nan尾部类别样本量太少矩阵病态加正则项并用手写外积计算代替torch.cov白化后特征严重过冲幂次设置过小过度拉伸尾部把幂次从-0.5上调到0附近做小范围搜索重平衡后头类精度下降全局结构被破坏确认分类头重训环节正确执行并检查正则项是否过小训练集和验证集结果不一致特征估计阶段混入了验证集确保验证集特征不参与协方差估计或统计时按类别样本量做加权新类别加入后旧类别效果退化变换矩阵未更新按类别单独更新矩阵不要全局重算这些坑不完全是论文研读能避开的很多是在把代码跑通的过程中一步步踩出来的。也希望读到这里的你能比我少走一段弯路。9. 延伸思考从这篇工作里还能读出什么论文看多了会发现真正有生命力的研究往往是找到一个问题中“几何上”的不变性并用一个简单的可算量把它显式表达出来。这篇工作的价值之所以超过单个方法论本身是因为它重新整理了我们思考长尾问题的方式。以前的长尾研究直觉都停在“数据少所以要多采样”或者“权重小所以要加权重”的层面。这篇文章用几何语言说清楚了底层机制问题是类别特征分布方向体积的不均衡修复方式也因此有了更本质的接口。这个转换造成的直接结果是方法的适用范围被大幅拓宽了不确定性估计、模型校准、少样本学习甚至低资源多模态任务都从特征几何的角度受启发。另一个让我留意的点是这种“后处理方法”在更严格意义上的在线学习场景中还没有被充分探索。真实世界的数据分布是漂移的、类别也会演化静态的变换矩阵不见得永远有效。但线性变换的闭式形式给在线更新留下了空间。如果以tumbling window的方式不断用最新特征更新协方差整个系统就能在运行中对尾部类别的判识保持新鲜度。这个方向若有人去做其实很有工程价值。落到最后我的个人判断是长尾问题的研究重心正在悄悄发生迁移——从数据层、目标函数层逐渐向表征几何层移动。这个方向让人看到的不只是更漂亮的分析更是更简洁、更可迁移、成本更低的实用解。而这篇ICLR的工作给这条路前面钉了一个足够醒目的路标。