ai.onnx.preview.training - Gradient¶
Gradient - 1 (ai.onnx.preview.training)¶
版本¶
網域:
ai.onnx.preview.training
since_version:
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 節點的輸入定義了計算梯度的值。我們可以將不同的張量饋送到已識別的圖中。例如,可以透過提供該值作為 Gradient 節點的輸入,來計算 Y 相對於 H 在 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)
)允許輸入為任何類型的浮點張量。