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

LayerNormalization 层

[源代码]

LayerNormalization

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

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

独立地对批次中每个给定示例的前一层激活进行归一化,而不是像批量归一化那样跨批次进行归一化。即,应用一种转换,使每个示例内的平均激活接近 0,激活标准差接近 1。

如果启用 scalecenter,则该层将通过可训练变量 gamma 广播来缩放归一化输出,并通过可训练变量 beta 广播来居中输出。gamma 默认设置为全 1 张量,beta 默认设置为全 0 张量,以便在训练开始之前居中和缩放不起作用。

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

设小批量的中间激活为 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 轴,并且输入的这部分形状必须完全定义。

例如:

>>> layer = 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 仅跨通道维度。 因此,此层归一化实现与组大小设置为 1 的组归一化层不匹配。

参数

  • axis: 整数或列表/元组。要进行归一化的轴。通常,这是特征轴。剩下的轴通常是批次轴。-1 是输入中的最后一个维度。默认为 -1
  • epsilon: 添加到方差的小浮点数,以避免除以零。默认为 1e-3。
  • center: 如果为 True,则向归一化张量添加 beta 偏移量。如果为 False,则忽略 beta。默认为 True
  • scale: 如果为 True,则乘以 gamma。如果为 False,则不使用 gamma。当下一层是线性层(例如 nn.relu)时,可以禁用此项,因为缩放将由下一层完成。默认为 True
  • rms_scaling: 如果为 True,则忽略 centerscale,并且输入按 gamma 和所有输入的平方的平方根的倒数进行缩放。这是一种近似且更快的方法,避免了计算输入的均值。请注意,这与 keras.layers.RMSNormalization 层执行的计算等效。
  • beta_initializer: beta 权重的初始化器。默认为零。
  • gamma_initializer: gamma 权重的初始化器。默认为一。
  • beta_regularizer: beta 权重的可选正则化器。默认为 None。
  • gamma_regularizer: gamma 权重的可选正则化器。默认为 None。
  • beta_constraint: beta 权重的可选约束。默认为 None。
  • gamma_constraint: gamma 权重的可选约束。默认为 None。
  • **kwargs: 基础层关键字参数(例如 namedtype)。

参考