使用来自同一分布的两个数据集时何时对数据进行归一化?

机器算法验证 神经网络 数据集 正常化 z分数
2022-03-30 06:16:40

假设您有两个数据集 D1 和 D2。两者都是从相同的底层分布 X 中采样的。我想用它们来训练神经网络。特征都是[0; 范围内的无符号整数;2^64]。

由于这些特征的尺度差异很大,我决定将 z-score 归一化与 sigmoid 函数结合使用。这意味着我将 z 分数归一化数据提供给逻辑函数以将特征映射到 [0; 1]范围。

在这一点上,我不确定在什么时候标准化数据。

1.) 我使用 D1 并用 mean_1 和 std_dev_1 对其进行归一化,它们是通过仅考虑 D1 获得的。我对 D2 重复该过程并使用 mean_2 和 std_dev_2 对其进行标准化。然后我用两个数据集依次训练网络。

2.) 我添加 D1 和 D2 得到一个集合 D3,并通过计算整个数据集 (D1 + D2) 上的 mean_3 和 std_dev_3 对其进行归一化。然后我用它训练网络。

这里有2个问题:

a) 这两种方法会导致相似的结果吗?这对我来说尤其重要,因为 D2 可能比 D1 更晚对我可用,我必须知道我是否必须用整个数据集重新训练网络。

b) 在对训练后的网络进行推理时,我必须使用哪些参数来规范化新输入?那么我是否必须使用 mean_3 和 std_dev_3 例如?

编辑:我发现两个数据集组合的平均值和标准差可以从原始数据集的平均值和标准差中计算出来。这意味着(理论上)可以按顺序训练它们,并且可以组合它们的分布参数来规范输入以进行推理。

3个回答

您应该对所有个体应用相同的转换。

不要使用方法1;会有偏见。实现这一点的一个简单方法是想象两个具有相同特征的个体存在于D1D2. 您希望这两个人在转换后的数据集中也相同,但您的方法 1 不允许这样做。

方法2是可以的。如果您想按顺序训练,另一种选择是将由 mean_1 和 std_dev_1 引入的转换应用于所有数据点;但是请注意,如果未来的数据点与D1.

如果 D1 和 D2 确实来自相同的分布,那么只要 D1 至少有几百个数据点,您就不应该看到平均值和标准差的太大变化,因此基于 D1 对所有数据进行归一化不应该造成很大的问题。根据每个数据子集的均值和标准差对其进行归一化意味着您的过度拟合将更多地遵循子集样本量而不是整体样本量,并且在某种程度上您引入了“什么子样本做了这个”的虚假特征数据点来自哪里?”。用不同的手段和标准对数据进行归一化不应该像收敛所需的时间那样影响神经网络训练的结果,如果你担心后者,可以考虑将结果作为初始值下一个。

几点说明:

  1. 如果两个数据集来自相同的分布,则两个过程应该给出相同的结果(因为 D1 和 D2 将具有相同的均值和方差)。但显然他们不是。

  2. 检查每个数据集的实际均值和方差。如果它们相同 - 没关系。如果它们不同,则使用自己的均值和方差对每个数据集进行归一化(方法 1)

  3. 在打乱的数据集上训练D3=D1¯D2¯,其中条表示标准化。首先在一个数据集上训练,然后在另一个数据集上训练可能会导致很多问题,应该谨慎进行(参见灾难性遗忘)。

  4. 如果新输入将来自与 D2 相同的来源,则使用 D2 的均值和方差对它们进行归一化。

  5. 可能不需要对标准化值应用 sigmoid。