层归一化

层归一化 - 17

版本

  • 名称: 层归一化 (GitHub)

  • : 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, ..., 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中的广播

属性

  • 轴 - 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 in ( tensor(bfloat16), tensor(double), tensor(float), tensor(float16) )

    将输入类型和输出 Y 类型约束为浮点张量。

  • U in ( tensor(bfloat16), tensor(float) )

    Mean 和 InvStdDev 张量的类型。