首页 > 解决方案 > TensorFlow - 如何在忽略零权重的情况下计算梯度?

问题描述

我想通过将一些权重设置为 0.0(每层中的特定权重,以此处不重要讨论的方式选择)来实现修剪,以(1)在推理期间忽略它们,(2)在训练期间忽略它们。

我知道我可以在推理过程中通过对每一层应用掩码来忽略它们,在我想要保留的权重索引处使用掩码,否则为零。

然而,在训练期间,我希望忽略的权重仍然被忽略。也就是说,我希望它们(1)不被更新,(2)不影响其余梯度的计算。

我可以通过在应用渐变之前屏蔽渐变来做到(1)。但我做不到(2)。

我试过这样的事情:

# Create an optimizer.
opt = GradientDescentOptimizer(learning_rate=0.1)

# Compute the gradients for a list of variables.
# This returns a list of tuples, each tuple containing gradients and
# the corresponding variable
[(var, grad)] = opt.compute_gradients(loss)

# Ask the optimizer to apply the capped gradients.
train_op = optimizer.apply_gradients([(grad * mask, var)])

但这并不能满足我的要求,因为optimizer.compute_gradients(loss)它将根据所有权重计算损失,包括那些为零的权重。换句话说,grad将有一些梯度对应于权重为零的索引。应用掩码会“浪费”这些本应用于更新非零权重的梯度。

我希望它根据非零权重计算损失。

有任何想法吗?

标签: pythontensorflowoptimizationdeep-learning

解决方案


推荐阅读