grad

    ( outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False, only_inputs=True, allow_unused=False, no_grad_vars=None )

    对于每个 inputs ,计算所有 outputs 相对于其的梯度和。

    参数:

    • outputs (Tensor|list(Tensor)|tuple(Tensor)) – 用于计算梯度的图的输出变量,或多个输出变量构成的list/tuple。

    • grad_outputs (Tensor|list(Tensor|None)|tuple(Tensor|None), 可选) - outputs 变量梯度的初始值。若 grad_outputs 为None,则 outputs 梯度的初始值均为全1的Tensor。若 grad_outputs 不为None,它必须与 outputs 的长度相等,此时,若 grad_outputs 的第i个元素为None,则第i个 outputs 的梯度初始值为全1的Tensor;若 grad_outputs 的第i个元素为Tensor,则第i个 outputs 的梯度初始值为 grad_outputs 的第i个元素。默认值为None。

    • retain_graph (bool, 可选) - 是否保留计算梯度的前向图。若值为True,则前向图会保留,用户可对同一张图求两次反向。若值为False,则前向图会释放。默认值为None,表示值与 create_graph 相等。

    • create_graph (bool, 可选) - 是否创建计算过程中的反向图。若值为True,则可支持计算高阶导数。若值为False,则计算过程中的反向图会释放。默认值为False。

    • only_inputs (bool, 可选) - 是否只计算 inputs 的梯度。若值为False,则图中所有叶节点变量的梯度均会计算,并进行累加。若值为True,则只会计算 inputs 的梯度。默认值为True。only_inputs=False功能正在开发中,目前尚不支持。

    • no_grad_vars (Tensor|list(Tensor)|tuple(Tensor)|set(Tensor), 可选) - 指明不需要计算梯度的变量。默认值为None。

    返回: tuple(Tensor),其长度等于 inputs 中的变量个数,且第i个返回的变量是所有 outputs 相对于第i个 inputs 的梯度之和。

    示例代码 1

    示例代码 2

    1. import paddle
    2. def test_dygraph_grad(grad_outputs=None):
    3. x = paddle.to_tensor(2.0)
    4. x.stop_gradient = False
    5. y1 = x * x
    6. # If grad_outputs=None, dy1 = [1], dy2 = [1].
    7. # If grad_outputs=[g1, g2], then:
    8. # - dy1 = [1] if g1 is None else g1
    9. # Since y1 = x * x, dx = 2 * x * dy1.
    10. # Since y2 = x * 3, dx = 3 * dy2.
    11. # Therefore, the final result would be:
    12. # dx = 2 * x * dy1 + 3 * dy2 = 4 * dy1 + 3 * dy2.
    13. dx = paddle.grad(
    14. outputs=[y1, y2],
    15. inputs=[x],
    16. grad_outputs=grad_outputs)[0]
    17. return dx.numpy()
    18. grad_value = paddle.to_tensor(4.0)
    19. # dy1 = [1], dy2 = [1]
    20. print(test_dygraph_grad(None)) # [7.]
    21. # dy1 = [1], dy2 = [4]
    22. print(test_dygraph_grad([None, grad_value])) # [16.]
    23. # dy1 = [4], dy2 = [1]
    24. print(test_dygraph_grad([grad_value, None])) # [19.]
    25. # dy1 = [3], dy2 = [4]