层归一化

层归一化 - 17

版本

此版本的算子自版本 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')

    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 张量的类型。