tf.keras.layers.LayerNormalization
| Просмотреть исходный код на GitHub |
Слой нормализации по слоям (Ba et al., 2016).
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
)
Нормализует активации предыдущего слоя для каждого примера в батче независимо, а не по всему батчу, как 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 нормализация происходит по осям внутри каждого примера, а не по различным примерам в батче.
Если scale или center включены, слой будет масштабировать нормализованные выходные данные, транслируя их с помощью обучаемого параметра gamma, и смещать выходные данные с помощью обучаемого параметра beta. gamma по умолчанию будет тензором единиц, а beta — тензором нулей, так что смещение и масштабирование будут бездействовать до начала обучения.
Итак, при включенных масштабировании и смещении уравнения нормализации следующие:
Пусть промежуточные активации для мини-батча будут inputs.
Для каждого образца x_i в inputs с 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 = 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)
Обратите внимание, что другие реализации нормализации по слоям могут определить gamma и beta по отдельному набору осей, отличных от осей, по которым происходит нормализация. Например, Group Normalization (Wu et al. 2018) с размером группы 1 соответствует Layer Normalization, которая нормализует по высоте, ширине и каналу и имеет gamma и beta, охватывающие только размерность канала. Таким образом, эта реализация Layer Normalization не будет соответствовать слою Group Normalization с размером группы, установленным в 1.
| Аргументы | |
|---|---|
axis | Целое число или список/кортеж. Ось или оси для нормализации. Обычно это ось/оси признаков. Выключенные оси обычно это оси батча. Этот аргумент по умолчанию -1, последняя размерность на входе. |
epsilon | Малое число, добавляемое к дисперсии, чтобы избежать деления на ноль. По умолчанию 1e-3 |
center | Если True, добавляет смещение beta к нормализованному тензору. Если False, beta игнорируется. По умолчанию True. |
scale | Если True, умножает на gamma. Если False, gamma не используется. По умолчанию True. Когда следующий слой является линейным (например, nn.relu), это можно отключить, поскольку масштабирование выполнится следующим слоем. |
beta_initializer | Инициализатор для веса beta. По умолчанию нули. |
gamma_initializer | Инициализатор для веса gamma. По умолчанию единицы. |
beta_regularizer | Необязательный регуляризатор для веса beta. По умолчанию None. |
gamma_regularizer | Необязательный регуляризатор для веса gamma. По умолчанию None. |
beta_constraint | Необязательное ограничение для веса beta. По умолчанию None. |
gamma_constraint | Необязательное ограничение для веса gamma. По умолчанию None. |
Форма входных данных:
Произвольная. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включающий ось образцов), когда этот слой используется как первый слой в модели.
Форма выходных данных:
Такая же, как у входных данных.
Ссылка:
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/keras/layers/LayerNormalization