LayerNormalization 类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)。
独立地对批次中的每个给定示例的上一层的激活进行归一化,而不是像批量归一化那样跨批次进行。即,它应用一个变换,将每个示例内的平均激活保持在接近 0,激活标准差保持在接近 1。
如果启用了 scale 或 center,则该层将通过与可训练变量 gamma 进行广播来缩放归一化输出,并通过与可训练变量 beta 进行广播来中心化输出。gamma 默认是一个全为 1 的张量,beta 默认是一个全为 0 的张量,因此在训练开始之前,中心化和缩放操作都不会生效。
因此,当启用缩放和中心化时,归一化方程如下:
令中间激活(一个小型批次)为 inputs。
对于 inputs 中的每个样本 x_i,具有 k 个特征,我们计算样本的均值和方差:
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 会通过 gamma 和 beta 进行线性变换,它们是可学习的参数:
output_i = x_i_normalized * gamma + beta
gamma 和 beta 将跨越 inputs 中在 axis 指定的轴,并且这部分输入的形状必须是完全确定的。
例如
>>> 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)
请注意,层归一化的其他实现可能选择让 gamma 和 beta 跨越一组与归一化轴不同的轴。例如,分组归一化 (Wu et al. 2018) 的组大小为 1 时,对应于一个层归一化,它跨越高度、宽度和通道进行归一化,并且 gamma 和 beta 只跨越通道维度。因此,此层归一化实现将不匹配组大小设置为 1 的分组归一化层。
参数
-1 是输入的最后一个维度。默认为 -1。beta 的偏移量添加到归一化张量。如果为 False,则忽略 beta。默认为 True。gamma。如果为 False,则不使用 gamma。当下一层是线性的(例如 nn.relu)时,可以禁用此选项,因为缩放将由下一层完成。默认为 True。gamma 权重的可选约束。默认为 None。name 和 dtype)。参考