TensorFlow custom_gradient中dy计算逻辑及梯度乘clip_norm原因求解
问题1:backward函数接收dy=1.0的计算逻辑
反向传播遵循链式求导规则,你调用t.gradient(output, v)时,output是整个计算图的最终标量输出:
- 标量对自身求导的结果固定为1,即
d(output)/d(output) = 1.0,这个值就是传递给clip_gradients反向函数的上游梯度dy - 由于
clip_gradients是计算图的最后一层,直接输出最终的output,因此反向传播时顶层梯度1.0会直接传入backward函数
问题2:最终梯度乘以0.6的原因
tf.custom_gradient装饰器会完全覆盖被装饰函数的默认梯度计算逻辑,改为使用你定义的backward函数返回值作为梯度,整体计算逻辑如下:
- 完整的链式求导路径为:
最终梯度 = d(output)/d(clip输入) * d(clip输入)/d(v) - 其中
clip输入是v*v,自动微分得到d(clip输入)/d(v) = 2*v = 6 - 你自定义的
d(output)/d(clip输入)是backward函数的返回值:tf.clip_by_norm(dy, 0.6),传入的dy=1.0裁剪后结果为0.6 - 两者相乘得到最终梯度:
6 * 0.6 = 3.6,和代码运行输出一致
内容的提问来源于stack exchange,提问作者Mins
相关产品推荐
相关产品推荐

