【发布时间】:2019-03-22 19:00:58
【问题描述】:
我想知道 TensorFlow、PyTorch 或其他库中是否有办法选择性地连接神经元。我想制作一个每层都有大量神经元的网络,但层之间的连接很少。
请注意,我不认为这是此答案的重复:Selectively zero weights in TensorFlow?。我使用与该问题中出现的基本相同的方法实现了一个自定义 keras 层——主要是通过创建一个密集层,在训练和评估中除了指定的权重之外的所有权重都被忽略。通过不训练指定的权重并且不使用它们进行预测,这实现了我想要做的部分事情。但是,问题是我仍然浪费内存来保存未经训练的权重,并且我浪费时间计算归零权重的梯度。我想要的是梯度矩阵的计算只涉及稀疏矩阵,这样我就不会浪费时间和内存。
有没有办法在不浪费内存的情况下选择性地创建和训练权重?如果我的问题不清楚或有更多信息对我有帮助,请告诉我。作为提问者,我想提供帮助。
【问题讨论】:
-
通常的技巧是使用任意数量的零初始化权重矩阵,并在每次权重更新后重写零。除此之外的一切(即“不浪费记忆”)都是一种痛苦,通常记忆并不是什么大问题。
-
我不太确定我是否理解。首先,在这种情况下,您似乎仍在计算归零权重的梯度。此外,似乎您将它们包括在训练中,然后将它们归零。在我的实现中 - 以及我想要的 - 零权重的梯度应该是 0。我误解了这个解决方法吗?
-
对于“不存在的”权重使用非零梯度是没有问题的。 “您将它们包括在训练中,然后将它们归零” - 不,您在每次梯度应用后将它们归零。不存在权重的梯度导致权重!= 0,因此您只需再次用零覆盖它们。
-
请问您为什么要这样限制您的网络?只是纯粹的好奇......
标签: python tensorflow neural-network keras pytorch