LayerNormalization¶
LayerNormalization - 17¶
版本¶
網域:
main
since_version:
17
函式:
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]
。變數 Var
和 StdDev
分別代表變異數和標準差。第二個輸出為 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]]
,則 Mean
和 InvStdDev
的形狀為 [d[0], ..., d[axis-1], 1, ..., 1]
。Y
和 X
具有相同的形狀。此運算子支援單向廣播(張量 Scale
和 B
應為單向可廣播到張量 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)
)均值和逆標準差張量的類型。