tf.keras.layers.LayerNormalization
| Просмотреть исходный код на GitHub |
Слой нормализации по слоям (Ba et al., 2016).
Наследуется от: Layer
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
)
Нормализует активации предыдущего слоя для каждого примера в пакете независимо, а не по всему пакету, как 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 по отдельным наборам осей, отличным от осей, по которым происходит нормализация. Например, групповая нормализация (Wu et al. 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.3/api_docs/python/tf/keras/layers/LayerNormalization