将输入值(到神经网络)进行归一化以加速学习过程是一种常见的做法,特别是当特征具有非常大的尺度时。
在理论上,归一化很容易理解。但如果训练数据集非常大,比如有100万个训练样本,我很好奇这是如何实现的?如果每个训练样本的特征数量也很大(比如,每个训练样本有100个特征),突然间就会出现两个问题:- 归一化所有训练样本需要一些时间- 归一化后的训练样本需要存储在某处,因此需要增加一倍的必要磁盘空间(特别是如果我们不想覆盖原始数据的话)。
在实践中,如何解决输入归一化问题,特别是当数据集非常大时?
一个可能的选项是在训练时按小批次动态地在内存中归一化输入.. 但这样归一化结果会从一个小批次变化到另一个小批次。这样可以容忍吗?
在这个平台上也许有人对此问题有实际经验。如果您能分享您的经验,我将非常感激。
提前感谢您。
回答:
大量的特征使得数据集的归一化更容易并行化。这并不是一个真正的问题。大数据集上的归一化可以很容易地通过GPU加速,并且速度会非常快。即使对于您描述的这种大型数据集。我编写的一个框架可以在4核4线程的CPU上在10秒内归一化整个MNIST数据集。GPU可以轻松地在2秒内完成。计算不是问题。对于较小的数据集,您可以在内存中保存整个归一化后的数据集,而对于您提到的较大的数据集,如果您归一化整个数据集,您将需要交换到磁盘上。但是,如果您使用合理的大批次,大约128或更高,您的最小值和最大值不会波动太多,这取决于数据集。这允许您在训练网络之前直接对小批次进行归一化,但这再次取决于网络。我建议根据您的数据集进行实验,并选择最佳方法。