【问题标题】:How to train neural network on large training set and small memory如何在大训练集和小内存上训练神经网络
【发布时间】:2014-02-06 15:53:48
【问题描述】:

我使用 gpu 计算编写了自己的带有反向传播的神经网络库。 想让它通用,我不必检查训练集是否适合 gpu 内存。

当训练集太大而无法放入 gpu 内存时,如何训练神经网络? 我假设它适合主机的 RAM。

我必须在第一个片段上进行训练迭代,然后在设备上释放它并将第二个片段发送到设备并对其进行训练,依此类推... 然后对梯度结果进行总结。

当我必须通过 PCIe 总线推送所有数据时,它不会太慢吗? 你有更好的主意吗?

【问题讨论】:

  • 也许你可以通过查看这个关于神经网络的code 获得一个想法。
  • 这是一个很好的库。我在网上搜索GPU机器学习时没有找到这个。我已经对代码进行了一些研究,但是没有一种机制可以解决内存问题。在反向传播中,他们将训练输入的HostMatrix 传递给训练算法,并且只需调整DeviceMatrix 的大小并直接复制到设备。如果它没有返回cudaSuccess,那么它会创建一个空矩阵。不过谢谢

标签: machine-learning gpu neural-network gpgpu training-data


【解决方案1】:

在循环中使用minibatch gradient descent:

  • 向 GPU 发送一批样本
  • 计算错误,反向传播梯度
  • 调整参数。

多次重复此循环,直到网络收敛。

这并不完全等同于简单的批量学习算法(批量梯度下降):实际上它通常比批量学习收敛更快。如果您在每个训练循环之前随机打乱样本,这会有所帮助。所以你仍然有内存传输,但你不需要那么多的迭代,算法会运行得更快。

【讨论】:

  • 这很好,但我想尽量减少通过 PCIe 传输的数据,而不是在每次迭代后推送数据(即使是小批量)。
  • 如果您的数据都适合 GPU,您应该一次性将所有数据放在那里,然后使用 minibatches(比在整个数据集上计算梯度更快的收敛速度)。如果不是,那么无论如何您都会被转移,并且您应该仍然使用小批量(不要一次计算一点梯度并求和以获得整体:计算梯度小批量,然后根据该部分梯度采取步骤)
猜你喜欢
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2010-11-20
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多