ai.onnx.preview.training - Adam

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

版本

  • 名稱: Adam (GitHub)

  • 網域: ai.onnx.preview.training

  • since_version: 1

  • 函數: False

  • 支援層級: SupportType.COMMON

  • 形狀推斷: True

此運算子版本自 ai.onnx.preview.training 網域第 1 版起開始提供。

摘要

計算 Adam 的一個迭代,這是一種基於隨機梯度最佳化的演算法。此運算子可以執行多個張量變數的最佳化。

讓我們定義此運算子的行為。首先,Adam 需要一些參數

  • 學習率「R」。

  • 更新計數「T」。也就是說,已執行的訓練迭代次數。

  • L2 範數正規化係數「norm_coefficient」。

  • 一個小的常數「epsilon」,以避免除以零。

  • 兩個係數「alpha」和「beta」。

在每個 Adam 迭代中,最佳化的張量會沿著一個方向移動,該方向是根據其指數平均歷史梯度和指數平均歷史平方梯度計算的。假設只有一個張量「X」正在被最佳化。其餘所需資訊為

  • 「X」的值,

  • 「X」的梯度(以「G」表示),

  • 「X」的指數平均歷史梯度(以「V」表示),以及

  • 「X」的指數平均歷史平方梯度(以「H」表示)。

其中一些參數會以輸入張量的形式傳遞到此運算子,而其他參數則會儲存為此運算子的屬性。具體而言,此運算子的輸入張量清單為 [「R」、「T」、「X」、「G」、「V」、「H」]。也就是說,「R」是第一個輸入,「T」是第二個輸入,依此類推。其他參數則以屬性的形式給定,因為它們是常數。此外,對應的輸出張量為

  • 「X」的新值(稱為「X_new」),

  • 新的指數平均歷史梯度(以「V_new」表示),以及

  • 新的指數平均歷史平方梯度(以「H_new」表示)。

這些輸出是按照以下偽程式碼計算的。

假設「+」、「-」、「*」和「/」都是支援 numpy 風格廣播的元素級算術運算。計算這些輸出的偽程式碼如下

// 加入 0.5 * norm_coefficient * ||X||_2^2 的梯度,其中 ||X||_2 為 2 範數。G_regularized = norm_coefficient * X + G

// 更新指數平均歷史梯度。V_new = alpha * V + (1 - alpha) * G_regularized

// 更新指數平均歷史平方梯度。H_new = beta * H + (1 - beta) * G_regularized * G_regularized

// 計算 H_new 的元素級平方根。V_new 將以元素級方式 // 除以 H_sqrt,以獲得更好的更新方向。H_sqrt = Sqrt(H_new) + epsilon

// 計算學習率。請注意,「alphaT」/「betaT」是 alpha/beta 的第 T 次方。R_adjusted = T > 0 ? R * Sqrt(1 - betaT) / (1 - alphaT) : R

// 計算「X」的新值。X_new = X - R_adjusted * V_new / H_sqrt

// 更新後的正規化。X_final = (1 - norm_coefficient_post) * X_new

如果有多个输入要优化,则伪代码将独立应用于每个输入。

屬性

  • alpha - FLOAT (預設值為 '0.9')

    在運行平均值中先前累積的梯度係數。預設值為 0.9。

  • beta - FLOAT (預設值為 '0.999')

    在運行平均值中先前累積的平方梯度係數。預設值為 0.999。

  • epsilon - FLOAT (預設值為 '0.0')

    避免除以零的小純量值。

  • norm_coefficient - FLOAT (預設值為 '0.0')

    0.5 * norm_coefficient * ||X||_2^2 的正規化係數。預設值為 0,這表示不進行正規化。

  • norm_coefficient_post - FLOAT (預設值為 '0.0')

    0.5 * norm_coefficient * ||X||_2^2 的正規化係數。預設值為 0,這表示不進行正規化。

輸入

介於 3 和 2147483647 個輸入之間。

  • R (異質) - T1

    初始學習率。

  • T (異質) - T2

    「X」的更新計數。應該是純量值。

  • inputs (可變) - T3

    要最佳化的張量,後接其各自的梯度,後接其各自的累積梯度(又名動量),後接其各自的累積平方梯度。例如,若要最佳化張量「X_1」和「X_2」,輸入清單會是 [「X_1」、「X_2」、「X_1」的梯度、「X_2」的梯度、「X_1」的累積梯度、「X_2」的累積梯度、「X_1」的累積平方梯度、「X_2」的累積平方梯度]。

輸出

介於 1 和 2147483647 個輸出之間。

  • outputs (可變) - T3

    最佳化張量的新值,接著是它們各自新的累積梯度,然後是它們各自新的累積平方梯度。例如,如果優化兩個張量「X_1」和「X_2」,則輸出列表將會是 [「X_1」的新值,「X_2」的新值,「X_1」的新累積梯度,「X_2」的新累積梯度,「X_1」的新累積平方梯度,「X_2」的新累積平方梯度]。

類型約束

  • T1 屬於 ( tensor(double), tensor(float) )

    將輸入類型限制為浮點純量。

  • T2 屬於 ( tensor(int64) )

    將輸入類型限制為 64 位元整數純量。

  • T3 屬於 ( tensor(double), tensor(float) )

    將輸入和輸出類型限制為浮點張量。