当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.stop_gradient用法及代码示例


停止梯度计算。

用法

tf.stop_gradient(
    input, name=None
)

参数

  • input 一个Tensor
  • name 操作的名称(可选)。

返回

  • 一个Tensor。具有与 input 相同的类型。

当在图中执行时,此操作输出其输入张量 as-is。

在构建计算梯度的操作时,此操作会阻止考虑其输入的贡献。通常,梯度生成器通过递归查找有助于其计算的输入,将操作添加到图以计算指定'loss' 的导数。如果你在图中插入这个操作,它的输入就会被梯度生成器屏蔽掉。在计算梯度时不考虑它们。

当您想使用 TensorFlow 计算一个值但需要假装该值是一个常数时,这很有用。例如,向量 x 的 softmax 函数可以写成

def softmax(x):
    numerator = tf.exp(x)
    denominator = tf.reduce_sum(numerator)
    return numerator / denominator

但是,如果 x 中的值很大,这很容易溢出。另一种更稳定的方法是从每个值中减去 x 的最大值。

def stable_softmax(x):
    z = x - tf.reduce_max(x)
    numerator = tf.exp(z)
    denominator = tf.reduce_sum(numerator)
    return numerator / denominator

但是,当我们通过 softmax 反向传播到 x 时,我们不想通过 tf.reduce_max(x)(如果最大值不是唯一的,那么梯度可能会流向错误的输入)计算反向传播并将其视为常数。因此,我们应该把它写成

def stable_softmax(x):
    z = x - tf.stop_gradient(tf.reduce_max(x))
    numerator = tf.exp(z)
    denominator = tf.reduce_sum(numerator)
    return numerator / denominator

其他一些例子包括:

  • M-step 的 EM 算法不应涉及通过 E-step 的输出进行反向传播。
  • 玻尔兹曼机器的对比发散训练,其中,在区分能量函数时,训练不得通过从模型生成样本的图进行反向传播。
  • 对抗性训练,不应该通过对抗性示例生成过程发生反向传播。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.stop_gradient。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。