层归一化¶
LayerNormalization - 17¶
版本¶
域名:
mainsince_version:
17function:
Truesupport_level:
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, ..., rank of 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,axis允许的范围是[-r, r)。负值表示从后向前计算维度。
epsilon - FLOAT (默认值为
'1e-05'):用于避免除以零的epsilon值。
stash_type - INT (默认为
'1'):均值和逆标准差类型。这也指定了第一阶段的计算精度。
输入¶
在2到3个输入之间。
X (异构) - T:
要归一化的张量。
Scale (异构) - T:
缩放张量。
B(可选,异构)- T:
偏置张量。
输出¶
在1到3个输出之间。
Y (异构) - T:
归一化张量。
平均值(可选,异质) - U:
在训练期间保存的均值用于加速梯度计算
InvStdDev(可选,异构) - U:
保存的反向标准差用于训练期间以加速梯度计算。
类型约束¶
T 在 (
tensor(bfloat16),tensor(double),tensor(float),tensor(float16)):将输入类型和输出Y类型限制为浮点张量。
U 在 (
tensor(bfloat16),tensor(float)) 中:均值和逆标准差张量的类型。