神经网络 - 训练集和验证集是否需要单独的标准化?

时间:2014-02-11 18:01:04

标签: machine-learning neural-network standardized

我正在训练这个5-5-2反向传播神经网络,在阅读了LeCun的这个真棒article之后,我开始实践他所建议的一些想法。

目前我正在使用我自己编写的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 ++也很满意。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

因此,您假设输入是正态分布并减去均值,除以标准差,得到N(0,1)分布式输入?

是的我同意@bogatron你单独标准化每个训练集,但我更强烈地说,不必使用验证集数据也是“必须”。问题不在于训练集范围之外的值;这没关系,仍然可以为任何值定义到标准法线的转换。您无法计算数据的平均值/标准偏差,因为您无法以任何方式使用训练集中的验证数据,即使只是通过此统计数据。

应进一步强调的是,您使用训练集中的均值和验证集,而不是验证集的均值。它必须与培训期间使用的功能相同。以不同方式转换验证集是无效的。