我正在训练这个 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++。
最佳答案
您很可能最好单独标准化每个训练集。交叉验证的目的是了解算法的泛化程度。当您将网络应用于新输入时,输入将不是用于计算标准化参数的输入。如果您一次对整个数据集进行标准化,则您忽略了新输入超出您标准化的值范围的可能性。
因此,除非您计划在每次处理新输入时重新标准化(我猜这不太可能),否则您应该只计算被评估分区的训练集的标准化参数。此外,您应该仅在分区的训练集上计算这些参数,而不是验证集(即,10 倍分区中的每一个都将使用 90% 的数据来计算标准化参数)。
关于machine-learning - 神经网络 - 训练集和验证集是否需要单独标准化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21709537/