Класс LayerNorm
Класс LayerNorm применяет нормализацию признаков к последней размерности тензора. В отличие от пакетной нормализации, которая нормализует по батчу, слой нормализует каждый отдельный пример независимо от других, используя среднее и дисперсию по признаковому измерению. Первым параметром передаётся размерность признаков или список размерностей, по которым производится нормализация. Вторым параметром можно задать параметр eps для численной стабильности. Третьим параметром передаются параметры elementwise_affine (по умолчанию True), который отвечает за наличие обучаемых коэффициентов сдвига и масштаба.
Синтаксис
torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True, dtype=None)
Параметры
Обязательные параметры:
-
normalized_shape(int или tuple/list) - размерность признаков для нормализации. Может быть как числом для одномерных данных, так и списком размерностей.
Необязательные параметры:
-
eps(float) - константа для численной стабильности (по умолчанию 1e-5). -
elementwise_affine(bool) - флаг, включающий обучаемые параметры смещения и масштаба (по умолчаниюTrue). -
dtype(torch.dtype) - тип данных для тензоров весов и смещений.
Пример
Создадим слой нормализации для одномерных признаков и применим его к тензору:
import torch
layer_norm = torch.nn.LayerNorm(normalized_shape=5)
t = torch.tensor([1., 2., 3., 4., 5.])
res = layer_norm(t)
print(res)
Результат выполнения кода:
tensor([-1.4142, -0.7071, 0.0000, 0.7071, 1.4142], grad_fn=<NativeLayerNormBackward0>)
Пример
Применим слой к двумерному тензору, нормализуя признаковое пространство:
import torch
layer_norm = torch.nn.LayerNorm(normalized_shape=3)
t = torch.tensor([
[1., 2., 3.],
[4., 5., 6.],
])
res = layer_norm(t)
print(res)
Результат выполнения кода:
tensor([
[-1.2247, 0.0000, 1.2247],
[-1.2247, 0.0000, 1.2247],
], grad_fn=<NativeLayerNormBackward0>)
Пример
Создадим слой без обучаемых параметров и сравним результат:
import torch
layer_norm = torch.nn.LayerNorm(
normalized_shape=5,
elementwise_affine=False
)
t = torch.tensor([1., 2., 3., 4., 5.])
res = layer_norm(t)
print(res)
Результат выполнения кода:
tensor([-1.4142, -0.7071, 0.0000, 0.7071, 1.4142])
Пример
Используем слой в нейронной сети на примере обработки последовательности:
import torch
t = torch.randn(2, 3, 4)
layer_norm = torch.nn.LayerNorm(normalized_shape=4)
res = layer_norm(t)
print(res.shape)
Результат выполнения кода:
torch.Size([2, 3, 4])
Смотрите также
-
класс
BatchNorm1d,
который применяет пакетную нормализацию к одномерным данным -
класс
GroupNorm,
который разделяет каналы на группы для нормализации -
класс
InstanceNorm1d,
который нормализует каждый канал независимо для одномерных данных -
класс
RMSNorm,
который использует среднеквадратичную нормализацию без центрирования