tf.keras.layers.LayerNormalization
| Просмотреть исходный код на GitHub |
Слой нормализации по слоям (Ba и др., 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, trainable=True, name=None, **kwargs
)
Нормализует активации предыдущего слоя для каждого примера в пакет независимо, а не по всему пакету, как Батч Нормализация. То есть применяет преобразование, которое поддерживает среднюю активацию каждого примера близкой к 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)
Обратите внимание, что с нормализацией по слоям нормализация происходит по осям внутри каждого примера, а не по разным примерам в пакете.
Если 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 по разным осям, нежели оси, по которым осуществляется нормализация. Например, групповая нормализация (Wu и др., 2018) с размером группы 1 соответствует нормализации по слоям, которая нормализует по высоте, ширине и каналу и имеет gamma и beta, охватывающие только размер канала. Таким образом, эта реализация нормализации по слоям не будет соответствовать слою групповой нормализации с размером группы, установленным в 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. |
trainable | Булево значение, если True переменные будут помечены как обучаемые. По умолчанию True. |
Форма входных данных: Произвольная. Используйте ключевой аргумент input_shape (кортеж целых чисел, не включая ось образцов) при использовании этого слоя в качестве первого слоя в модели. Форма выходных данных: Такая же, как форма входных данных. Ссылка:
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/keras/layers/LayerNormalization