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



我正在训练这个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++也很熟悉。

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

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

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

是的,我同意@bogatron的观点,即你可以单独标准化每个训练集,但我更强烈地说,不使用验证集数据是"必须的"。问题不在于训练集中的值超出了范围;这很好,仍然为任何值定义到标准法线的转换。你不能计算所有数据的平均值/标准差,因为你不能以任何方式使用训练集中的验证数据,即使只是通过这个统计数据。

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