层归一化

LayerNormalization - 17

版本

  • 名称: LayerNormalization (GitHub)

  • 域名: main

  • since_version: 17

  • function: True

  • support_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]。 变量 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,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) ) 中:

    均值和逆标准差张量的类型。