TensorFlow是如何实现导数计算的?
TensorFlow 梯度计算实现逻辑
我们日常调用tf.GradientTape计算导数的功能,核心是通过反向自动微分机制实现的,具体执行分为两个阶段:
- 前向记录阶段
进入GradientTape上下文后,框架会自动追踪所有作用在可训练张量上的运算操作,每一步运算的输入值、运算类型、对应的内置偏导数规则都会被记录到内部的磁带存储结构中。如果需要追踪非训练张量的梯度,也可以手动调用watch方法指定。 - 反向梯度计算阶段
前向计算得到目标值后,调用gradient()方法时,框架会从目标值开始,逆着前向阶段记录的运算顺序逐层反推,每一步都用对应运算的偏导公式,把上游传递来的梯度和当前运算对输入的偏导相乘,最终累加所有传播路径的梯度值,就得到了目标值对指定变量的导数结果。
举个简单的例子:对函数y = 2 * x + 3求x点的导数,前向阶段磁带会记录乘法(2和x相乘)、加法(乘积和3相加)两个操作;反向阶段从y开始反推,首先得到y对加法输入的偏导为1,再反推乘法操作得到y对x的偏导为1 * 2 = 2,和手动求导的结果一致。
对应的梯度计算逻辑可以参考下图:
这种实现方式的优势是计算效率远高于数值微分,也不需要手动推导求导公式,能适配任意自定义的前向运算逻辑。
内容的提问来源于stack exchange,提问作者Mahdi Amrollahi
相关产品推荐
相关产品推荐

