Функция PyTorch torch.nn.LayerNorm
Справочное руководство PyTorch torch.nn
torch.nn.LayerNorm— это модуль послойной нормализации в PyTorch.
В отличие от пакетной нормализации, послойная нормализация нормализует по размерности признаков одного образца и не зависит от размера пакета.
Определение функции
torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)
Описание параметров:
normalized_shape(int or list): Размерности для нормализации.eps(float): Эпсилон для численной устойчивости. По умолчанию 1e-5.elementwise_affine(bool): Использовать ли обучаемые масштаб и сдвиг. По умолчанию True.
Математический принцип
Формула нормализации слоя:
y = (x - E[x]) / sqrt(Var[x] + eps) * gamma + beta
Отличие от пакетной нормализации: нормализация слоя вычисляет среднее и дисперсию по последней размерности признаков.
Примеры использования
Пример 1: Базовое использование
Выполните нормализацию слоя для признаков:
Пример
import torch.nn as nn
# Нормализация слоя: нормализовать последнюю размерность
ln = nn.LayerNorm(normalized_shape=10)
# Вход: batch=4, размерность признаков=10
x = torch.randn(4, 10)
# Прямое распространение
output = ln(x)
print("Форма входа:", x.shape)
print("Форма выхода:", output.shape)
print("Первая строка исходного ввода:", x[0].tolist())
print("Первая строка после нормализации:", output[0].tolist())
Пример 2: Многомерный вход
Обработка 3D- или 4D-входа:
Пример
import torch.nn as nn
# Нормализовать по измерению последовательности: (batch, seq, features)
ln_seq = nn.LayerNorm(normalized_shape=64)
# 3D-вход
x_3d = torch.randn(2, 10, 64)
output_3d = ln_seq(x_3d)
print("3D-вход:", x_3d.shape, "-> выход:", output_3d.shape)
# 4D-вход (например, изображения): (batch, height, width, channels)
# LayerNorm нормализует последнее измерение канала
ln_channel = nn.LayerNorm(normalized_shape=128)
x_4d = torch.randn(2, 8, 8, 128)
output_4d = ln_channel(x_4d)
print("4D-вход:", x_4d.shape, "-> выход:", output_4d.shape)
Пример 3: Использование в Transformer
Типичное использование LayerNorm:
Пример
import torch.nn as nn
class TransformerBlock(nn.Module):
def __init__(self, d_model, nhead):
super(TransformerBlock, self).__init__()
self.self_attn = nn.MultiheadAttention(d_model, nhead, batch_first=True)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
self.ffn = nn.Sequential(
nn.Linear(d_model, d_model * 4),
nn.GELU(),
nn.Linear(d_model * 4, d_model)
)
def forward(self, x):
# Самовнимание с остаточной связью
attn_out, _ = self.self_attn(x, x, x)
x = self.norm1(x + attn_out)
# FFN с остаточной связью
ffn_out = self.ffn(x)
x = self.norm2(x + ffn_out)
return x
#
block = TransformerBlock(d_model=512, nhead=8)
x = torch.randn(4, 100, 512) # (batch, seq, d_model)
выходной = блок(x)
print("Форма входа:", x.shape)
print("Форма выхода:", output.shape)
Пример 4: Без обучаемых параметров
Чистая нормализация без масштаба и сдвига:
Пример
import torch.nn as nn
# Без обучаемых параметров
ln = nn.LayerNorm(16, elementwise_affine=False)
x = torch.randn(4, 16)
output = ln(x)
# Без веса и смещения
print("Есть weight:", hasattr(ln, 'weight'))
print("Есть bias:", hasattr(ln, 'bias'))
print("Форма выхода:", output.shape)
Сравнение методов нормализации
| Метод | Размерность нормализации | Зависимость от батча | Применимые сценарии |
|---|---|---|---|
BatchNorm |
Размерность батча | Да | CNN, стабильный батч |
LayerNorm |
Размерность признаков | нет | Transformer、RNN |
InstanceNorm |
Каналы + пространство | нет | Перенос стиля |
GroupNorm |
Группировка каналов | нет | Сценарии с малым размером батча |
Часто задаваемые вопросы
Вопрос 1: В чём разница между LayerNorm и BatchNorm?
LayerNorm не зависит от размера батча, что делает его подходящим для моделей последовательностей и сценариев, где размер батча сильно варьируется.
Вопрос 2: Как выбрать normalized_shape?
Обычно выбирают размерность признаков, например 768 или 1024 в BERT.
Вопрос 3: Почему Transformer использует LayerNorm?
Длина входной последовательности Transformer переменна, и LayerNorm более стабилен.
Сценарии использования
nn.LayerNormОсновные сценарии применения включают:
- Архитектура Transformer: BERT, GPT и т. д.
- Рекуррентные нейронные сети: LSTM, GRU
- Обработка последовательностей переменной длины: Размер батча не фиксирован
Совет: LayerNorm — стандартный компонент Transformer, размещаемый после остаточной связи (Post-LN) или перед ней (Pre-LN).
Другие расширения