处理大于内存的数组以在 python 中训练神经网络
Processing array larger than memory for training a neural net in python
我正在尝试在 python 中训练一个神经网络(反向传播 + 梯度下降),其特征是我在 google 书 2-grams(英文)的基础上构建的,它将结束大约有 10 亿行数据,每行有 20 个特征。这很容易超出我的记忆力,因此使用内存数组(例如 numpy)不是一种选择,因为它需要加载完整的训练集。
我研究了 numpy 中的内存映射,它可以解决输入层(只读)的问题,但我还需要在需要大量数据的网络中存储和操作我的内部层 read/write考虑到数据的大小,性能在这个过程中非常重要,因为它可以为我节省几天的处理时间。
有没有一种方法可以在每次成本(损失)最小化迭代时不必在内存中加载完整的训练集来训练模型?
您可能正在寻找的是小批量处理。一般来说,许多训练神经网络的方法都是基于梯度的,因为你的损失函数是试验集的函数——梯度也是。正如你所说 - 它可能超出你的记忆。幸运的是,对于加性损失函数(你将永远使用的大多数 - 是加性的),可以证明你可以用随机(或小批量)梯度下降代替全梯度下降,并且仍然收敛到局部最小值。现在经常练习使用 32、64 或 128 行的批次,因此很容易记住。与使用全梯度训练的网络相比,这样的网络实际上可以更快地收敛到解决方案,因为每个数据集进行 N / 128 次移动而不是一次移动。即使它们中的每一个都相当粗糙 - 作为组合它们工作得很好。
我正在尝试在 python 中训练一个神经网络(反向传播 + 梯度下降),其特征是我在 google 书 2-grams(英文)的基础上构建的,它将结束大约有 10 亿行数据,每行有 20 个特征。这很容易超出我的记忆力,因此使用内存数组(例如 numpy)不是一种选择,因为它需要加载完整的训练集。
我研究了 numpy 中的内存映射,它可以解决输入层(只读)的问题,但我还需要在需要大量数据的网络中存储和操作我的内部层 read/write考虑到数据的大小,性能在这个过程中非常重要,因为它可以为我节省几天的处理时间。
有没有一种方法可以在每次成本(损失)最小化迭代时不必在内存中加载完整的训练集来训练模型?
您可能正在寻找的是小批量处理。一般来说,许多训练神经网络的方法都是基于梯度的,因为你的损失函数是试验集的函数——梯度也是。正如你所说 - 它可能超出你的记忆。幸运的是,对于加性损失函数(你将永远使用的大多数 - 是加性的),可以证明你可以用随机(或小批量)梯度下降代替全梯度下降,并且仍然收敛到局部最小值。现在经常练习使用 32、64 或 128 行的批次,因此很容易记住。与使用全梯度训练的网络相比,这样的网络实际上可以更快地收敛到解决方案,因为每个数据集进行 N / 128 次移动而不是一次移动。即使它们中的每一个都相当粗糙 - 作为组合它们工作得很好。