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)
)將輸入和輸出類型限制為浮點張量。