ai.onnx.preview.training - 動量

動量 - 1 (ai.onnx.preview.training)

版本

  • 名稱動量 (GitHub)

  • 網域ai.onnx.preview.training

  • since_version1

  • 函式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) )

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