ai.onnx.preview.training - Gradient¶
Gradient - 1 (ai.onnx.preview.training)¶
版本¶
域:
ai.onnx.preview.training
起始版本:
1
函数:
False
支持级别:
SupportType.COMMON
形状推断:
False
此版本的算子已可用,自域 ai.onnx.preview.training 的版本 1 起。
摘要¶
Gradient 算子计算特定张量相对于其他一些张量的偏导数。该算子广泛应用于基于梯度的训练算法。为了说明其用法,我们考虑一个计算图,
X -----.
|
v
W --> Conv --> H --> Gemm --> Y
^
|
Z
其中 W 和 Z 是可训练张量。注意,为简洁起见,省略了算子的属性。令 dY/dW (dY/dZ) 为 Y 相对于 W (Z) 的梯度。用户可以通过插入 Gradient 算子来计算梯度,形成如下所示的另一个图。
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”中可微分变量的梯度,此 Gradient 仅输出 dY/dW 和 dY/dZ。注意,“H”不能出现在“xs”和“zs”中。原因是“H”可以通过张量“W”和“X”确定,因此“H”不是独立变量。
所有输出都是可选的。如果需要,例如,用户可以将空字符串赋给该 Gradient 的第一个输出名称,以跳过 dY/dW 的生成。注意,可选输出的概念也存在于 ONNX 的 RNN、GRU 和 LSTM 中。
Gradient 算子可以计算相对于中间张量的导数。例如,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)
使用 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”中命名的张量定义了被微分的计算图,而 Gradient 节点的输入定义了计算梯度的值。我们可以向确定的图输入不同的张量。例如,通过将 H 的特定值 H_1 作为 Gradient 节点的输入,可以计算 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)
当 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 在以下类型中 (
tensor(bool)
,tensor(complex128)
,tensor(complex64)
,tensor(double)
,tensor(float)
,tensor(float16)
,tensor(int16)
,tensor(int32)
,tensor(int64)
,tensor(int8)
,tensor(string)
,tensor(uint16)
,tensor(uint32)
,tensor(uint64)
,tensor(uint8)
)允许输出为任意类型的张量。
T2 在以下类型中 (
tensor(double)
,tensor(float)
,tensor(float16)
)允许输入为任意类型的浮点张量。