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

PyTorch中CMU-MOSEI情感标签的0-1归一化方法选型咨询

问题背景与尝试方案

我正在使用PyTorch构建机器学习情感模型,采用CMU-MOSEI数据集的情感标签,数据格式如下:

happysadangersurprisedisgustfear
1.330.00.00.00.00.0
2.00.00.00.330.00.0
0.00.01.330.332.00.0

每个情感标签的取值范围为0.0→3.0,现需将其归一化至0→1范围,我尝试了三种方法:

方法1:按列使用minmax_scale归一化

from sklearn.preprocessing import minmax_scale

for emo in ['happy', 'sad', 'anger', 'surprise', 'disgust', 'fear']:
    mosei[emo] = minmax_scale(mosei[emo])

示例转换结果:

  • 1.33,0.0,0.0,0.0,0.0,0.0 → 0.44,0.0,0.0,0.0,0.0,0.0
  • 2.0,0.0,0.0,0.33,0.0,0.0 → 0.67,0.0,0.0,0.11,0.0,0.0
  • 0.0,0.0,1.33,0.33,2.0,0.0 → 0.0,0.0,0.44,0.11,0.67,0.0

问题:部分行的结果总和大于1。

方法2:按列归一化后执行softmax()

在数据加载器中对按列归一化后的张量执行softmax:

>>> F.softmax(torch.tensor([0.44,0.0,0.0,0.0,0.0,0.0]), dim=0)
tensor([0.2370, 0.1526, 0.1526, 0.1526, 0.1526, 0.1526])

>>> F.softmax(torch.tensor([0.0,0.0,0.44,0.11,0.67,0.0]), dim=0)
tensor([0.1312, 0.1312, 0.2037, 0.1464, 0.2564, 0.1312])

方法3:按行使用minmax_scale归一化

>>> minmax_scale([1.33,0.0,0.0,0.0,0.0,0.0])
array([1., 0., 0., 0., 0., 0.])

>>> minmax_scale([0.0,0.0,1.33,0.33,2.0,0.0])
array([0.   , 0.   , 0.665, 0.165, 1.   , 0.   ])

问题:部分行结果总和仍大于1,尝试再执行softmax:

F.softmax(torch.tensor([0.   , 0.   , 0.665, 0.165, 1.   , 0.   ]), dim=0)
tensor([0.1131, 0.1131, 0.2199, 0.1334, 0.3074, 0.1131])

请问哪种方法更合适,或者是否存在其他更优的归一化方案?


方案分析与推荐

首先明确任务类型是关键,CMU-MOSEI支持两种情感任务逻辑,对应不同的归一化选择:

1. 多标签情感任务(样本可同时包含多种情感)

  • 禁止使用softmax:softmax强制行内所有情感概率和为1,违背多标签任务的核心逻辑——样本可以同时存在高开心度和高惊讶度,两者强度独立,无需互相压制。
  • 优先选择按列minmax_scale归一化:该方法保留了每个情感标签在全局数据集的相对强度,符合多标签任务中各情感独立标注的特性。你担心的“行总和大于1”完全合理,因为多标签任务不要求总和为1,每个标签的0-1取值直接代表该情感的强度概率。
  • 更简单的替代方案:直接对每个标签做除以3.0的归一化(原始标签范围固定0-3),操作便捷,还能保留原始标注的绝对强度,避免minmax_scale受极端样本干扰的问题。代码示例:
mosei[['happy', 'sad', 'anger', 'surprise', 'disgust', 'fear']] /= 3.0

2. 多分类情感任务(样本仅对应一种主导情感)

  • 推荐按列minmax_scale后加softmax:先通过按列归一化统一各情感标签的尺度,再用softmax将行向量转换为和为1的概率分布,符合多分类任务的概率解释。
  • 不推荐按行minmax_scale:该方法仅考虑单样本内的情感相对强度,会丢失不同样本间的全局强度对比——比如样本A原始开心值1.5,样本B原始开心值2.0,按行归一化后若A只有开心标签会变成1.0,B若还有其他情感则开心值可能小于1.0,会抹除B原本开心度更高的信息。

额外提示

  • 若模型使用交叉熵损失,多分类任务下无需提前做softmax,PyTorch的CrossEntropyLoss已内置softmax计算,提前处理反而可能导致数值不稳定。
  • 多标签任务通常使用二元交叉熵损失(BCEWithLogitsLoss),此时可不用提前归一化,直接输入原始标签(或除以3后的标签),让模型输出的logit通过sigmoid转换为0-1的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:35:34