【问题标题】:Creating and train only specified weights in TensorFlow or PyTorch在 TensorFlow 或 PyTorch 中仅创建和训练指定的权重
【发布时间】:2019-03-22 19:00:58
【问题描述】:

我想知道 TensorFlow、PyTorch 或其他库中是否有办法选择性地连接神经元。我想制作一个每层都有大量神经元的网络,但层之间的连接很少。

请注意,我不认为这是此答案的重复:Selectively zero weights in TensorFlow?。我使用与该问题中出现的基本相同的方法实现了一个自定义 keras 层——主要是通过创建一个密集层,在训练和评估中除了指定的权重之外的所有权重都被忽略。通过不训练指定的权重并且不使用它们进行预测,这实现了我想要做的部分事情。但是,问题是我仍然浪费内存来保存未经训练的权重,并且我浪费时间计算归零权重的梯度。我想要的是梯度矩阵的计算只涉及稀疏矩阵,这样我就不会浪费时间和内存。

有没有办法在不浪费内存的情况下选择性地创建和训练权重?如果我的问题不清楚或有更多信息对我有帮助,请告诉我。作为提问者,我想提供帮助。

【问题讨论】:

  • 通常的技巧是使用任意数量的零初始化权重矩阵,并在每次权重更新后重写零。除此之外的一切(即“不浪费记忆”)都是一种痛苦,通常记忆并不是什么大问题。
  • 我不太确定我是否理解。首先,在这种情况下,您似乎仍在计算归零权重的梯度。此外,似乎您将它们包括在训练中,然后将它们归零。在我的实现中 - 以及我想要的 - 零权重的梯度应该是 0。我误解了这个解决方法吗?
  • 对于“不存在的”权重使用非零梯度是没有问题的。 “您将它们包括在训练中,然后将它们归零” - 不,您在每次梯度应用后将它们归零。不存在权重的梯度导致权重!= 0,因此您只需再次用零覆盖它们。
  • 请问您为什么要这样限制您的网络?只是纯粹的好奇......

标签: python tensorflow neural-network keras pytorch


【解决方案1】:

通常的简单解决方案是将权重矩阵初始化为在不应该有连接的地方为零。您存储这些零位置的掩码,并在每次权重更新后将这些位置的权重设置为零。您需要这样做,因为零权重的梯度可能不为零,这会在您不想要的地方引入非零权重(即 connectios)。

伪代码:

# setup network
weights = sparse_init()  # only nonzero for existing connections
zero_mask = where(weights == 0)

# train
for e in range(num_epochs):
    train_operation()  # may lead to introduction of new connections
    weights[zero_mask] = 0  # so we set them to zero again

【讨论】:

    【解决方案2】:

    tensorflow 和 pytorch 都支持稀疏张量(torch.sparsetf.sparse)。

    我的直观理解是,如果您愿意使用相应的低级 API 编写网络(例如,自己实际实现前向传递),您可以将权重矩阵转换为稀疏张量。这反过来会导致稀疏连接,因为层 [L] 的权重矩阵定义了前一层 [L-1] 的神经元与层 [L] 的神经元之间的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2018-01-10
      • 2021-05-28
      • 1970-01-01
      相关资源
      最近更新 更多