如何使用比内存更多的数据训练神经网络?

时间:2016-06-04 08:44:18

标签: matlab machine-learning neural-network recurrent-neural-network bigdata

尝试使用大量数据训练具有重复层的分类器。结果,所有数据都无法适应内存。它给我提供了以下错误:

Error using zeros
Requested 1x2114046976 (15.8GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long
time and cause MATLAB to become unresponsive. See array size limit or preference panel for more information.
Error in nnMex.perfsGrad (line 3)
TEMP = zeros(1,ceil(hints.tempSizeBG/8)*8);
Error in nnCalcLib/perfsGrad (line 294)
                lib.calcMode.perfsGrad(calcNet,lib.calcData,lib.calcHints);
Error in trainscg>initializeTraining (line 153)
[worker.perf,worker.vperf,worker.tperf,worker.gWB,worker.gradient] = calcLib.perfsGrad(calcNet);
Error in nnet.train.trainNetwork>trainNetworkInMainThread (line 28)
worker = localFcns.initializeTraining(archNet,calcLib,calcNet,tr);
Error in nnet.train.trainNetwork (line 16)
    [archNet,tr] = trainNetworkInMainThread(archNet,rawData,calcLib,calcNet,tr,feedback,localFcns);
Error in trainscg>train_network (line 147)
[archNet,tr] = nnet.train.trainNetwork(archNet,rawData,calcLib,calcNet,tr,localfunctions);
Error in trainscg (line 59)
            [out1,out2] = train_network(varargin{2:end});
Error in network/train (line 369)
    [net,tr] = feval(trainFcn,'apply',net,data,calcLib,calcNet,tr);

应该注意的是,目前我的训练输入是11x52266,并且由于复发层,网络具有~3k重量元素。但是,我希望提供15倍的培训数据。

我该如何应对?是否有任何技术可以映射它试图在我的SSD而不是内存上初始化的局部变量?

培训有“减少”选项,但在这个问题上似乎没有任何区别。无论如何都会发生同样的错误。

1 个答案:

答案 0 :(得分:2)

通常,如果您的数据集太大而无法放入内存,则必须以块的形式处理它。对于训练大型网络,通常使用随机梯度下降(一次只需要访问一个数据点)或小批量训练(只需要访问小批量中的数据点)。除了需要更少的内存之外,这些方法还倾向于比批量梯度下降(其为每个权重更新使用整个数据集)快得多。磁盘访问速度很慢,即使每次更新只需要几个数据点,你仍然应该加载尽可能多的点,然后将它们分成小批量等等。你可以使用其他技巧来减少磁盘数量读取,就像在加载下一组数据之前执行多次更新一样。

另一点是特定于递归神经网络(RNN)。当您使用反向传播时间(BPTT)训练RNN时,网络必须被展开'在时间上,并被视为一个非常深的前馈网络,在每个时间步骤都有一个复发层的副本。这意味着在更多时间步长执行BPTT需要更多内存(以及更多计算时间)。一种解决方案是使用截断的BPTT,其中梯度仅在固定的时间步长上传播回来。