ai.onnx.preview.training - Gradient

Gradient - 1 (ai.onnx.preview.training)

版本

  • 名稱: Gradient (GitHub)

  • 網域: 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) )

    允許輸入為任何類型的浮點張量。