ai.onnx.preview.training - 梯度

梯度 - 1 (ai.onnx.preview.training)

版本

  • 名称: 梯度 (GitHub)

  • : ai.onnx.preview.training

  • 起始版本: 1

  • 函数: False

  • 支持级别: SupportType.COMMON

  • 形状推断: False

此版本的运算符已在ai.onnx.preview.training 域的版本 1 开始可用

摘要

梯度算子计算特定张量关于其他一些张量的偏导数。此算子广泛用于基于梯度的训练算法中。为了说明其用法,我们考虑一个计算图,

X -----.
       |
       v
W --> Conv --> H --> Gemm --> Y
                      ^
                      |
                      Z

,其中 W 和 Z 是可训练张量。请注意,为了简化起见,省略了算子的属性。设 dY/dW (dY/dZ) 是 Y 对 W (Z) 的梯度。用户可以通过插入梯度算子来形成另一个如下图所示的图来计算梯度。

W --> Conv --> H --> Gemm --> Y
|      ^              ^
|      |              |
|      X              Z
|      |              |
|      |   .----------'
|      |   |  (W/Z/X is the 1st/2nd/3rd input of Gradient as shown in
|      |   |   "xs" followed by "zs")
|      v   v
'---> Gradient(xs=["W", "Z"], zs=["X"], y="Y")
       |   |
       |   '-----------------------------------> dY/dW (1st output of Gradient)
       |
       '---------------------------------------> dY/dZ (2nd output of Gradient)

根据定义,张量“y”是“xs”和“zs”中自变量的函数。由于我们只计算“y”对“xs”中可微分变量的梯度,因此此梯度只输出 dY/dW 和 dY/dZ。请注意,“H”不能出现在“xs”和“zs”中。原因是“H”可以由张量“W”和“X”确定,因此“H”不是自变量。

所有输出都是可选的。例如,如果需要,用户可以将空字符串分配给该梯度的第一个输出名称,以跳过 dY/dW 的生成。请注意,可选输出的概念也可以在 ONNX 的 RNN、GRU 和 LSTM 中找到。

梯度算子可以计算对中间张量的导数。例如,Y 对 H 的梯度可以通过以下方式完成

W --> Conv --> H --> Gemm --> Y
       ^       |      ^
       |       |      |
       X       |      Z
       .-------'      |
       |   .----------'
       |   | (H/Z is the 1st/2nd input of Gradient as shown in "xs")
       v   v
      Gradient(xs=["H", "Z"], y="Y")
       |   |
       |   '-----------------------------------> dY/dH (1st output of Gradient)
       |
       '---------------------------------------> dY/dZ (2nd output of Gradient)

可以使用梯度算子表示高阶微分。例如,给定以下线性模型

W --> Gemm --> Y --> Loss --> O
       ^              ^
       |              |
       X              L

为了计算 O 对 W 的二阶导数(表示为 d^2O/dW^2),可以这样做

W --> Gemm --> Y --> Loss --> O
|      ^              ^
|      |              |
|      X .------------L
|      | |            |
|      | |            v
+------+-+> Gradient(xs=["X", "W"], zs=["L"], y="O") ---> dO/dX (1st output of Gradient)
|      | |    |
|      | |    '---> dO/dW (2nd output of Gradient)
|      v v
'---> Gradient(xs=["X", "W"], zs=["L"], y="dO/dW") ---> d(dO/dW)dX (1st output of
       |                                                  Gradient)
       |
       |
       '---> d^2O/dW^2 (2nd output of Gradient)

属性“xs”、“zs”和“y”中命名的张量定义了微分计算图,梯度节点的输入定义了计算梯度的值。我们可以将不同的张量馈送到已识别的图中。例如,可以通过将特定值 H_1 作为输入提供给梯度节点,来计算 Y 对 H 在 H_1 处的梯度。

W --> Conv --> H --> Gemm --> Y
       ^              ^
       |              |
       X              Z

          Z_1 (2nd input of Gradient)
           |
           v
H_1 --> Gradient(xs=["H", "Z"], y="Y") ---> dY/dH when H = H_1 and Y = Y_1.
           |
           '------------------------------> dY/dZ (2nd output of Gradient)

当梯度的输入是“xs”和“zs”中命名的张量时,可以优化计算。更具体地说,如果通过反向模式自动微分计算梯度,则可以重用前向传播中的中间变量。

属性

  • xs - 字符串(必填)

    微分子图的输入张量名称。它只包含子图的必要微分输入。可以由输入生成的变量(通常称为中间变量)不能包含在此属性中。

  • y - 字符串(必填)

    目标张量。它可以被视为微分函数的输出。属性“xs”和属性“zs”是确定“y”值的最小自变量集。

  • zs - 字符串 :

    微分子图的输入张量名称。它只包含子图的必要非微分输入。可以由输入生成的变量(通常称为中间变量)不能包含在此属性中。

输入

输入数量介于 1 到 2147483647 之间。

  • 输入(可变参数) - T1

    馈送到由属性标识的图中的值。第 i 个输入是属性“xs”和属性“zs”的连接列表中指定的第 i 个张量的值。例如,如果 xs=[“A”, “B”] 且 zs=[“C”],则第一个输入用作符号“A”的值,第三个输入替换“C”的所有出现。

输出

1 到 2147483647 个输出之间。

  • 输出(可变参数) - T2

    由属性“y”指定的张量相对于属性“xs”中指定的每个张量的梯度。第 i 个输出是“y”相对于属性“xs”中指定的第 i 个张量的梯度。

类型约束

  • T1 在 ( 张量(布尔), 张量(复数128), 张量(复数64), 张量(双精度), 张量(浮点), 张量(浮点16), 张量(整型16), 张量(整型32), 张量(整型64), 张量(整型8), 张量(字符串), 张量(无符号整型16), 张量(无符号整型32), 张量(无符号整型64), 张量(无符号整型8) )

    允许输出为任何类型的张量。

  • T2 属于 ( tensor(double), tensor(float), tensor(float16) )

    允许输入为任何类型的浮点张量。