3

我正在训练这个 5-5-2 反向传播神经网络,在阅读了 LeCun 的这篇很棒的文章后,我开始将他提出的一些想法付诸实践。

目前我正在使用我自己制作的 10 倍交叉验证算法对其进行评估,基本上是这样的:

for each epoch      
  for each possible split (training, validation)
    train and validate
  end
  compute mean MSE between all k splits
end

我的输入和输出是标准化的(0 均值,方差 1),我使用的是 tanh 激活函数。所有网络算法似乎都能正常工作:我使用相同的实现来近似 sin 函数,它做得很好。

现在,问题正如标题所暗示的那样:我应该分别标准化每个训练/验证集还是只需要标准化整个数据集一次

请注意,如果我做后者,网络不会产生有意义的预测,但我更喜欢有一个更“理论”的答案,而不是只看输出。

顺便说一句,我用 C 实现了它,但我对 C++ 也很满意。

4

2 回答 2

7

最好将每个训练集单独标准化。交叉验证的目的是了解您的算法的泛化程度。当您将网络应用于新输入时,输入将不是用于计算标准化参数的输入。如果您一次标准化整个数据集,您将忽略新输入超出您标准化的值范围的可能性。

因此,除非您计划在每次处理新输入时重新标准化(我猜这不太可能),否则您应该只计算正在评估的分区的训练集的标准化参数。此外,您应该只在分区的训练集上计算这些参数,而不是在验证集上计算(即,10 倍分区中的每一个都将使用 90% 的数据来计算标准化参数)。

于 2014-02-11T19:28:24.383 回答
3

所以你假设输入是正态分布的,减去平均值,除以标准差,得到 N(0,1) 个分布输入?

是的,我同意@bogatron 的观点,即您分别对每个训练集进行标准化,但我更强烈地说,不使用验证集数据也是“必须”的。问题不在于训练集中范围之外的值;这很好,仍然为任何值定义了向标准法线的转换。您无法计算所有数据的均值/标准差,因为您无法以任何方式使用训练集中的验证数据,即使仅通过此统计数据也是如此。

应该进一步强调的是,您将训练集的平均值与验证集一起使用,而不是验证集的平均值。它必须与训练期间使用的特征转换相同。以不同方式转换验证集是无效的。

于 2014-02-12T01:19:57.670 回答