Keras 2 API 文档 / 层 API / 归一化层 / LayerNormalization 层

LayerNormalization 层

[来源]

LayerNormalization

tf_keras.layers.LayerNormalization(
    axis=-1,
    epsilon=0.001,
    center=True,
    scale=True,
    beta_initializer="zeros",
    gamma_initializer="ones",
    beta_regularizer=None,
    gamma_regularizer=None,
    beta_constraint=None,
    gamma_constraint=None,
    **kwargs
)

层归一化层(Ba et al., 2016)。

独立地对批次中每个给定样本的上一层激活进行归一化,而不是像 Batch Normalization 那样跨批次进行。换句话说,它应用一个转换,使每个样本内的平均激活值接近 0,激活标准差接近 1。

给定一个张量 inputs,将在 axis 中指定的轴上计算矩并执行归一化。

示例

>>> data = tf.constant(np.arange(10).reshape(5, 2) * 10, dtype=tf.float32)
>>> print(data)
tf.Tensor(
[[ 0. 10.]
 [20. 30.]
 [40. 50.]
 [60. 70.]
 [80. 90.]], shape=(5, 2), dtype=float32)
>>> layer = tf.keras.layers.LayerNormalization(axis=1)
>>> output = layer(data)
>>> print(output)
tf.Tensor(
[[-1. 1.]
 [-1. 1.]
 [-1. 1.]
 [-1. 1.]
 [-1. 1.]], shape=(5, 2), dtype=float32)

请注意,使用 Layer Normalization 时,归一化发生在每个样本内部的轴上,而不是跨批次中不同的样本。

如果启用 scalecenter,则该层将通过与可训练变量 gamma 进行广播来缩放归一化后的输出,并通过与可训练变量 beta 进行广播来中心化输出。gamma 默认设置为全一张量,beta 默认设置为全零张量,因此在训练开始前,中心化和缩放操作无效。

因此,启用缩放和中心化后的归一化方程如下:

设 mini-batch 的中间激活是 inputs

对于 inputs 中具有 k 个特征的每个样本 x_i,我们计算该样本的均值和方差

mean_i = sum(x_i[j] for j in range(k)) / k
var_i = sum((x_i[j] - mean_i) ** 2 for j in range(k)) / k

然后计算归一化后的 x_i_normalized,包括用于数值稳定性的一个小的因子 epsilon

x_i_normalized = (x_i - mean_i) / sqrt(var_i + epsilon)

最后,x_i_normalized 通过学习参数 gammabeta 进行线性转换

output_i = x_i_normalized * gamma + beta

gammabeta 将跨越在 axis 中指定的 inputs 的轴,并且 inputs 的这一部分的形状必须完全确定。

例如

>>> layer = tf.keras.layers.LayerNormalization(axis=[1, 2, 3])
>>> layer.build([5, 20, 30, 40])
>>> print(layer.beta.shape)
(20, 30, 40)
>>> print(layer.gamma.shape)
(20, 30, 40)

请注意,其他层归一化实现可能会选择在与进行归一化操作的轴不同的轴上定义 gammabeta。例如,组归一化(Wu et al. 2018)当组大小为 1 时,对应于跨越高度、宽度和通道进行归一化,并且 gammabeta 仅跨越通道维度的层归一化。因此,此 Layer Normalization 实现与组大小设置为 1 的 Group Normalization 层不匹配。

参数

  • axis: 整数或列表/元组。要进行归一化的轴或多个轴。通常这是特征轴。排除的轴通常是批次轴。-1 是输入中的最后一个维度。默认为 -1
  • epsilon: 加入到方差中的一个小的浮点值,以避免除以零。默认为 1e-3。
  • center: 如果为 True,则将 beta 的偏移量添加到归一化后的张量。如果为 False,则忽略 beta。默认为 True
  • scale: 如果为 True,则乘以 gamma。如果为 False,则不使用 gamma。当下一层是线性层(例如 nn.relu)时,可以禁用此选项,因为缩放将由下一层完成。默认为 True
  • beta_initializer: beta 权重的初始化器。默认为全零。
  • gamma_initializer: gamma 权重的初始化器。默认为全一。
  • beta_regularizer: beta 权重的可选正则化器。默认为 None。
  • gamma_regularizer: gamma 权重的可选正则化器。默认为 None。
  • beta_constraint: beta 权重的可选约束。默认为 None。
  • gamma_constraint: gamma 权重的可选约束。默认为 None。

输入 shape

任意。当此层作为模型中的第一层时,请使用关键字参数 input_shape (整数元组,不包含样本轴)。

输出 shape

与输入 shape 相同。

参考