LayerNormalization

LayerNormalization - 17

版本

  • 名稱LayerNormalization (GitHub)

  • 網域main

  • since_version17

  • 函式True

  • 支援層級SupportType.COMMON

  • 形狀推論True

此版本的運算子自 17 版起可用。

摘要

這是 ONNX 中定義為函式的層歸一化。整體計算可分為兩個階段。第一階段是標準化,使標準化後的元素具有零均值和單位變異數。標準化所需的計算可以用以下方程式描述。

Mean = ReduceMean<axes=normalized_axes>(X)
D = Sub(X, Mean)
DD = Mul(D, D)
Var = ReduceMean<axes=normalized_axes>(DD)
VarEps = Add(Var, epsilon)
StdDev = Sqrt(VarEps)
InvStdDev = Reciprocal(StdDev)
Normalized = Mul(D, InvStdDev)

其中 normalized_axes[axis, ..., X 的秩 - 1]。變數 VarStdDev 分別代表變異數和標準差。第二個輸出為 Mean,最後一個為 InvStdDev。根據 stash_type 屬性,實際計算必須在不同的浮點數精度下進行。例如,如果 stash_type 為 1,此運算子會將所有輸入變數轉換為 32 位元浮點數,執行計算,最後將 Normalized 轉換回 X 的原始類型。第二階段接著使用以下方式縮放和位移第一階段的結果

NormalizedScaled = Mul(Normalized, Scale)
Y = Add(NormalizedScaled, B)

第二階段不依賴 stash_type。所有方程式都在此語法中。相同的變數(即輸入、輸出和屬性)在上述方程式和此運算子的定義中使用相同的名稱。讓 d[i] 表示 X 的第 i 個維度。如果 X 的形狀為 [d[0], ..., d[axis-1], d[axis], ..., d[rank-1]],則 MeanInvStdDev 的形狀為 [d[0], ..., d[axis-1], 1, ..., 1]YX 具有相同的形狀。此運算子支援單向廣播(張量 ScaleB 應為單向可廣播到張量 X);如需更多詳細資訊,請查看ONNX 中的廣播

屬性

  • axis - INT (預設值為 '-1'

    第一個標準化維度。如果 rank(X) 為 r,則軸的允許範圍為 [-r, r)。負值表示從後面計算維度。

  • epsilon - FLOAT (預設值為 '1e-05'

    用於避免除以零的 epsilon 值。

  • stash_type - INT (預設值為 '1'

    Mean 和 InvStdDev 的類型。這也指定了第一階段的計算精度。

輸入

輸入介於 2 到 3 個之間。

  • X (異質) - T

    要正規化的張量。

  • Scale (異質) - T

    縮放張量。

  • B (可選, 異質) - T

    偏差張量。

輸出

輸出介於 1 到 3 個之間。

  • Y (異質) - T

    正規化後的張量。

  • Mean (可選, 異質) - U

    訓練期間儲存的均值,用於加速梯度計算

  • InvStdDev (可選, 異質) - U

    訓練期間儲存的逆標準差,用於加速梯度計算。

類型約束

  • T 屬於 ( tensor(bfloat16), tensor(double), tensor(float), tensor(float16) )

    約束輸入類型和輸出 Y 類型為浮點數張量。

  • U 屬於 ( tensor(bfloat16), tensor(float) )

    均值和逆標準差張量的類型。