我想通过训练超过十亿个特征维度的数据来训练DNN模型。因此第一层权重矩阵的形状将是(1,000,000,000,512)。这个重量矩阵太大,无法存放在一个盒子里。
到目前为止,是否有任何解决方案可以处理如此大的变量,例如将大权重矩阵划分为多个框。
感谢Olivier和Keveman。让我添加有关我的问题的更多细节。 该示例非常稀疏,所有要素都是二进制值:0或1.参数权重看起来像tf.Variable(tf.truncated_normal([1 000 000 000,512],stddev = 0.1))
kaveman给出的解决方案看似合理,我会在尝试后更新结果。
答案 0 :(得分:5)
这个问题的答案很大程度上取决于你想在权重矩阵上执行什么操作。
处理如此众多功能的典型方法是将每个功能的512
向量视为嵌入。如果数据集中的每个示例都只有10亿个功能中的一个,那么您可以使用tf.nn.embedding_lookup
函数查找小批量示例中存在的功能的嵌入。如果每个示例都有多个功能,但可能只有少数功能,那么您可以使用tf.nn.embedding_lookup_sparse
查找嵌入。
在这两种情况下,您的权重矩阵可以分布在许多机器上。也就是说,这两个函数的params
参数是张量列表。您可以对大的权重矩阵进行分片,并在不同的机器中找到分片。请查看分布式执行的tf.device
和primer,了解如何在多台计算机上分发数据和计算。
如果你真的想在权重矩阵上做一些密集操作,比如说,将矩阵与另一个矩阵相乘,这仍然是可以想象的,尽管在TensorFlow中没有现成的配方来处理它。你仍然会在机器上对你的重量矩阵进行分类。但是,你必须在权重矩阵的分布式块上手动构造一系列矩阵乘法,并将结果组合起来。