Nat*_*tjo 5 python automatic-differentiation backpropagation tensorflow
我了解自动微分的概念,但找不到任何解释,例如,tf.where在我的损失函数或tf.cond图形中,tensorflow如何计算不可微函数的误差梯度。它工作得很好,但是我想了解张量流如何通过这样的节点反向传播错误,因为没有公式可以根据它们计算梯度。
在 的情况下tf.where,您有一个函数,它具有三个输入、条件C、真T值和假值F,以及一个输出Out。梯度接收一个值并且必须返回三个值。目前,没有为条件计算梯度(这几乎没有意义),因此您只需要为T和计算梯度F。假设输入和输出是向量,想象C[0]是True。然后Out[0]来自T[0],它的梯度应该传播回来。另一方面,F[0]会被丢弃,所以它的梯度应该为零。如果Out[1]是False,则 for 的梯度F[1]应该传播,但不传播 for T[1]。所以,简而言之,对于T您应该传播给定的梯度 where CisTrue并在它所在的位置使其为零False,而对于F. 如果您查看( operation)梯度的实现tf.whereSelect,它就是这样做的:
@ops.RegisterGradient("Select")
def _SelectGrad(op, grad):
c = op.inputs[0]
x = op.inputs[1]
zeros = array_ops.zeros_like(x)
return (None, array_ops.where(c, grad, zeros), array_ops.where(
c, zeros, grad))
Run Code Online (Sandbox Code Playgroud)
请注意,计算中不使用输入值本身,这将由产生这些输入的操作的梯度来完成。对于tf.cond,代码稍微复杂一些,因为Merge在不同的上下文中使用了相同的操作(),并且在内部tf.cond也使用了Switch操作。然而想法是一样的。本质上,Switch操作用于每个输入,因此被激活的输入(如果条件为True第一个,否则为第二个)获得接收到的梯度,而另一个输入获得“关闭”的梯度(如None),并且不会传播更进一步。