PyTorch中CMU-MOSEI情感标签的0-1归一化方法选型咨询
问题背景与尝试方案
我正在使用PyTorch构建机器学习情感模型,采用CMU-MOSEI数据集的情感标签,数据格式如下:
| happy | sad | anger | surprise | disgust | fear |
|---|---|---|---|---|---|
| 1.33 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 2.0 | 0.0 | 0.0 | 0.33 | 0.0 | 0.0 |
| 0.0 | 0.0 | 1.33 | 0.33 | 2.0 | 0.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.02.0,0.0,0.0,0.33,0.0,0.0→0.67,0.0,0.0,0.11,0.0,0.00.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
相关产品推荐
相关产品推荐

