Функция PyTorch torch.nn.LayerNorm

PyTorch torch.nn 参考手册Справочное руководство 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
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
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
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
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).


PyTorch torch.nn 参考手册Справочное руководство PyTorch torch.nn

Другие расширения