ai.onnx.preview.training - 動量¶
動量 - 1 (ai.onnx.preview.training)¶
版本¶
名稱:動量 (GitHub)
網域:
ai.onnx.preview.training
since_version:
1
函式:
False
支援層級:
SupportType.COMMON
形狀推斷:
True
此版本的運算子自網域 ai.onnx.preview.training 的版本 1以來可用。
摘要¶
計算使用動量的隨機梯度更新的一次迭代。此運算子可以執行多個張量變數的優化。
讓我們定義此運算子的行為。正如您可以想像的,具有動量的 SG 需要多個參數
學習率「R」。
更新計數「T」。也就是說,已進行的訓練迭代次數。在第一次訓練迭代中,它應該為零。
L2 範數正規化係數「norm_coefficient」。
先前累積梯度(即動量)的衰減係數「alpha」。
目前梯度「beta」的縮放係數。
選擇使用標準動量還是 Nesterov 動量的屬性「mode」。
為了簡單起見,假設只有一個張量(稱為「X」)需要優化。其他必要的輸入是「X」的梯度(稱為「G」)和「X」的動量(稱為「V」)。此動量運算子將所有這些輸入映射到「X」的新值(稱為「X_new」)及其新的動量(稱為「V_new」)。
此運算子支援兩種不同的動量演算法。如果需要 Nesterov 動量,請將屬性「mode」設定為「nesterov」。否則,將屬性「model」設定為「standard」以使用標準動量。運算細節隨後說明。
讓「+」、「-」、「*」和「/」全部是具有 numpy 樣式廣播的逐元素運算。
使用標準動量的 SG 虛擬碼
// 新增 0.5 * norm_coefficient * ||X||^2 的梯度,其中 ||X|| 是 X 中所有元素的平方和 // 值。G_regularized = norm_coefficient * X + G
// 在第一次訓練迭代中,beta 應該始終為 1。beta_adjusted = T > 0 ? beta : 1
// 根據先前的動量和目前的梯度計算目前的動量。V_new = alpha * V + beta_adjusted * G_regularized
// 更新 X。X_new = X - R * V_new
使用 Nesterov 動量的 SG 虛擬碼
// 新增 0.5 * norm_coefficient * ||X||^2 的梯度,其中 ||X|| 是 X 中所有元素的平方和 // 值。G_regularized = norm_coefficient * X + G;
// 在第一次訓練迭代中,beta 應該始終為 1。beta_adjusted = T > 0 ? beta : 1
// 根據先前的動量和目前的梯度計算目前的動量。V_new = alpha * V + beta_adjusted * G_regularized;
// 計算最終更新方向,然後更新 X。X_new = X - R * (G_regularized + alpha * V_new)
如果分配此運算子來優化多個輸入,例如「X_1」和「X_2」。相同的虛擬碼會擴展為聯合處理所有張量。更具體地說,我們可以將「X」視為「X_1」和「X_2」的串聯(當然,它們的梯度和累積梯度也應該串聯),然後我們的虛擬碼就適用了。
屬性¶
alpha - FLOAT (必要)
動量的衰減因子。它應該是一個純量。
beta - FLOAT (必要)
計算新動量時梯度的係數。它應該是一個純量。
mode - STRING (必要)
其值應為「nesterov」或「standard」。值「nesterov」會導致使用 Nesterov 動量,而「standard」則會呼叫使用標準動量的隨機梯度方法
norm_coefficient - FLOAT (必要)
0.5 * norm_coefficient * ||X||^2 的係數。
輸入¶
介於 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」的動量]。
輸出¶
介於 1 到 2147483647 個輸出之間。
outputs (可變) - T3
它依序包含已優化張量的新值,然後是它們的動量張量的新值。例如,如果優化兩個張量「X_1」和「X_2」,則輸出清單將是 [「X_1」的新值、「X_2」的新值、「X_1」的新動量、「X_2」的新動量]。
類型約束¶
T1 in (
tensor(double)
,tensor(float)
)將輸入類型限制為浮點純量。
T2 in (
tensor(int64)
)將輸入類型限制為 64 位元整數純量。
T3 in (
tensor(double)
,tensor(float)
)將輸入類型限制為浮點張量。