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。
如果启用 scale
或 center
,该层将通过与可训练变量 gamma
进行广播来缩放归一化输出,并通过与可训练变量 beta
进行广播来中心化输出。gamma
默认是一个全一张量,beta
默认是一个全零张量,因此在训练开始之前,中心化和缩放不起作用。
因此,启用缩放和中心化后,归一化公式如下:
假设小批量的中间激活是 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
通过 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
。center
和 scale
,并通过 gamma
和所有输入的平方的逆平方根对输入进行缩放。这是一种近似且更快的方法,避免了计算输入的均值。请注意,这与 keras.layers.RMSNormalization
层执行的计算不等价。name
和 dtype
)。参考文献