为什么在 MxNet 中规范化标签可以使准确率接近 100%?

Why normalizing labels in MxNet makes accuracy close to 100%?

我正在 MxNet(胶子 api)上使用多标签逻辑回归训练模型,如下所述:multi-label logit in gluon 我的自定义数据集有 13 个特征和一个形状为 [6] 的标签。 我的特征从原始值归一化为 [0,1] 我使用带有 2 个隐藏层的简单密集神经网络。

我注意到,当我不规范化标签时(它们采用离散值 1、2、3、4、5、6 并且纯粹是我选择将分类值映射到这些数字),我的训练过程会慢慢收敛例如:

Epoch: 0, ela: 8.8 sec, Loss: 1.118188, Train_acc 0.5589, Test_acc 0.5716
Epoch: 1, ela: 9.6 sec, Loss: 0.916276, Train_acc 0.6107, Test_acc 0.6273
Epoch: 2, ela: 10.3 sec, Loss: 0.849386, Train_acc 0.6249, Test_acc 0.6421
Epoch: 3, ela: 9.2 sec, Loss: 0.828530, Train_acc 0.6353, Test_acc 0.6304
Epoch: 4, ela: 9.3 sec, Loss: 0.824667, Train_acc 0.6350, Test_acc 0.6456
Epoch: 5, ela: 9.3 sec, Loss: 0.817131, Train_acc 0.6375, Test_acc 0.6455
Epoch: 6, ela: 10.6 sec, Loss: 0.815046, Train_acc 0.6386, Test_acc 0.6333
Epoch: 7, ela: 9.4 sec, Loss: 0.811139, Train_acc 0.6377, Test_acc 0.6289
Epoch: 8, ela: 9.2 sec, Loss: 0.808038, Train_acc 0.6381, Test_acc 0.6484
Epoch: 9, ela: 9.2 sec, Loss: 0.806301, Train_acc 0.6405, Test_acc 0.6485
Epoch: 10, ela: 9.4 sec, Loss: 0.804517, Train_acc 0.6433, Test_acc 0.6354
Epoch: 11, ela: 9.1 sec, Loss: 0.803954, Train_acc 0.6389, Test_acc 0.6280
Epoch: 12, ela: 9.3 sec, Loss: 0.803837, Train_acc 0.6426, Test_acc 0.6495
Epoch: 13, ela: 9.1 sec, Loss: 0.801444, Train_acc 0.6424, Test_acc 0.6328
Epoch: 14, ela: 9.4 sec, Loss: 0.799847, Train_acc 0.6445, Test_acc 0.6380
Epoch: 15, ela: 9.1 sec, Loss: 0.795130, Train_acc 0.6454, Test_acc 0.6471

但是,当我对标签进行归一化并再次训练时,我得到的结果显示训练和测试的准确率为 99.99%:

Epoch: 0, ela: 12.3 sec, Loss: 0.144049, Train_acc 0.9999, Test_acc 0.9999
Epoch: 1, ela: 12.7 sec, Loss: 0.023632, Train_acc 0.9999, Test_acc 0.9999
Epoch: 2, ela: 12.3 sec, Loss: 0.013996, Train_acc 0.9999, Test_acc 0.9999
Epoch: 3, ela: 12.7 sec, Loss: 0.010092, Train_acc 0.9999, Test_acc 0.9999
Epoch: 4, ela: 12.7 sec, Loss: 0.007964, Train_acc 0.9999, Test_acc 0.9999
Epoch: 5, ela: 12.6 sec, Loss: 0.006623, Train_acc 0.9999, Test_acc 0.9999
Epoch: 6, ela: 12.6 sec, Loss: 0.005700, Train_acc 0.9999, Test_acc 0.9999
Epoch: 7, ela: 12.4 sec, Loss: 0.005026, Train_acc 0.9999, Test_acc 0.9999
Epoch: 8, ela: 12.6 sec, Loss: 0.004512, Train_acc 0.9999, Test_acc 0.9999

这怎么可能?为什么归一化标签会以这种方式影响训练准确性?

您链接到的教程进行了多class class化。在多标签 class化中,示例的标签是一个 one-hot 数组。例如标签 [0 0 1 0] 表示此示例属于 class 2(假设 class 以 0 开头)。规范化这个向量没有意义,因为值已经在 0 和 1 之间。另外,在 multiclass classification 中,只有一个标签可以为真,另一个必须为假。 0 和 1 以外的值在 multi class classification.

中没有意义

在表示一批示例时,通常将标签写为整数而不是 on-hot 数组,以便于阅读。例如标签 [4 6 1 7] 表示第一个示例属于 class 4,第二个示例属于 class 6 等等。规范化此表示也没有意义,因为此表示在内部转换为一个热数组。

现在,如果您规范化第二个表示,行为是未定义的,因为浮点数不能是数组索引。有可能发生了一些奇怪的事情来给你 99% 的准确率。也许您将值标准化为 0 到 1,并且生成的 one-hot 数组大部分指向 class 0,很少指向 class 1。这可以给您 99% 的准确度。

我建议不要规范化标签。