LayerNormalization¶
LayerNormalization - 17¶
版本¶
域:
main起始版本:
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 中的广播。
属性¶
轴 - INT(默认值为
'-1')第一个归一化维度。如果 rank(X) 为 r,则 axis 的允许范围是 [-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)) 中Mean 和 InvStdDev 张量的类型。