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

mp8*_*p85 3 machine-learning standardized neural-network

我正在训练这个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
Run Code Online (Sandbox Code Playgroud)

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

现在,问题是标题所暗示的:我应该单独标准化每个列车/验证集还是我只需要将整个数据集标准化一次

请注意,如果我执行后者,网络不会产生有意义的预测,但我更喜欢有一个更"理论"的答案而不仅仅是查看输出.

顺便说一下,我用C语言实现了它,但我对C++也很满意.

bog*_*ron 7

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

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