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
預設為全 1 張量,而 beta
預設為全 0 張量,因此在訓練開始之前,中心化和縮放不會有任何作用。
因此,在啟用縮放和中心化的情況下,正規化方程式如下
設小批次的 Intermediate activations 為 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
將跨越 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)
請注意,層正規化的其他實作可能會選擇在與正規化軸不同的軸集上定義 gamma
和 beta
。例如,群組正規化 (Wu et al. 2018) 群組大小為 1 時,對應於跨高度、寬度和通道進行正規化,並且 gamma
和 beta
僅跨越通道維度的層正規化。因此,此 Layer Normalization 實作將與群組大小設定為 1 的群組正規化層不符。
參數
-1
是輸入中的最後一個維度。預設為 -1
。beta
偏移量添加到正規化張量。如果為 False,則忽略 beta
。預設為 True
。gamma
。如果為 False,則不使用 gamma
。當下一層是線性層(例如 nn.relu
)時,可以停用此功能,因為縮放將由下一層完成。預設為 True
。center
和 scale
,並且輸入按 gamma
和所有輸入平方的平方根倒數縮放。這是一種近似且更快的方法,可以避免計算輸入的平均值。請注意,這不等同於 keras.layers.RMSNormalization
層執行的計算。name
和 dtype
)。參考文獻