Обмен технологиями

BatchNorm

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

0. Аннотация

Встретились давным-давно BatchNorm иLayerNorm, на тот момент было лишь приблизительно известно, что они выполнили данныестандартизация: x = x − μ σ bm{x} = frac{bm{x} - bm{mu}}{bm{sigma}}Икс=σИксμ Это конечно просто, но реальные данные сложнее.Задачи резюмеС точки зрения изображения данных данные пакета обычно выглядят следующим образом: [B, C, H, W]; для Задачи НЛПС точки зрения предложения данных данные пакета обычно выглядят следующим образом: [B, T, D]. Что XXNorm Как он рассчитывается? Определенно не все числа во всей партии рассчитываются сразу? μ бм{мю}μ и σ bm{сигма}σ, и они разные.

Итак, я проверил много информации и действительно согласился со словами преподавателя: не читайте эти грязные блоги, они не так хороши, как вы! область комментариев: 《Почему трансформаторы используют норму слоя вместо нормы партии?》

1. Как рассчитать?

В этом разделе подробно объясняется как с теоретической точки зрения, так и с точки зрения кода. BatchNorm иLayerNorm метод расчета.

1.1 Давайте сначала поговорим об этом теоретически, спросив об общем значении слова Цяньвэнь.

>>>>> Тонги Цяньвэнь >>>>>
просить: Чем отличается норма слоя от нормы партии. Дайте пояснение формулы.

отвечать: Нормализация слоя (LayerNorm) иНормализация партии (BatchNorm) это методы, используемые для ускорения обучения нейронной сети через уровень нормализацииВведите или активируйте значение, что делает сетевое обучение более стабильным и эффективным.ВыполнениеиПрименимая сценаотличаются.

Нормализация партии (BatchNorm)
BatchNorm В основном во время тренировокДля мини-пакета данныхего нормализовать.Главная цельдаУменьшить внутренние ковариатные сдвиги(внутренний ковариатный сдвиг), то есть в процессе прямого распространения сети входное распределение промежуточного слоя изменяется с помощью обучающих итераций. BatchNorm через расчетСреднее значение и дисперсия текущей мини-партииДля нормализации входных данных формула выглядит следующим образом:
настраивать х бм{х}Икс — входной вектор в мини-пакете, μ B bm{mu}_BμБ и σ B 2 bm{сигма}^2_BσБ2 среднее значение и дисперсия мини-партии соответственно, тогдаBatchNorm Выход у бм{у}у Это может быть выражено как: x ^ = x − μ B μ B 2 + ϵ y ^ = γ x ^ + β^бмИкс=бмИксбмμБбмμ2Б+ϵ^бму=γ^бмИкс+β Икс^у^=μБ2+ϵ ИксμБ=γИкс^+β в, γ гаммаγ и β бетаβ это обучаемый параметр, ϵ эпсилонϵ — небольшая константа, используемая для численной стабильности.

Нормализация слоя (LayerNorm)
LayerNorm Цель состоит в том, чтобына каждом уровне выборкиВыполните нормализацию, не полагаясь на статистику мини-пакетов. LayerNorm Больше подходит для моделей последовательностей (таких какLSTM илиTransformer) и т. д., среди которыхМежду образцами могут быть зависимостиили Размер мини-пакета не может быть фиксированным. LayerNorm вычислитьСреднее значение и дисперсия каждого признака выборки, формула выглядит следующим образом:
настраивать х бм{х}Икс - вектор признаков одного образца, мк Л бм{мю}_ЛμЛ и σ L 2 bm{сигма}^2_LσЛ2 — среднее значение и дисперсия выборочных характеристик соответственно, тогдаLayerNorm Выход у бм{у}у Это может быть выражено как: x ^ = x − μ L μ L 2 + ϵ y ^ = γ x ^ + β^бмИкс=бмИксбмμЛбмμ2Л+ϵ^бму=γ^бмИкс+β Икс^у^=μЛ2+ϵ ИксμЛ=γИкс^+β То же самое, γ гаммаγ и β бетаβ это обучаемый параметр, ϵ эпсилонϵ является небольшой константой.

разница

  • Зависит от данных: BatchNorm зависит отмини-пакетная статистика, и LayerNorm зависит отХарактеристическая статистика отдельного образца;
  • Сценарии применения: BatchNorm больше подходит длязадачи компьютерного зрения, и LayerNorm больше подходит длязадачи обработки естественного языка, особенно при работе с данными последовательности;
  • Вычислительная эффективность: BatchNorm Может быть более эффективным при параллельных вычислениях, поскольку позволяет использовать преимущества параллелизма внутри мини-пакетов, в то время какLayerNorm Расчеты по каждой выборке независимы и больше подходят для обработки данных последовательности различной длины.

Оба метода имеют свои преимущества и недостатки, и какой метод выбрать обычно зависит от конкретного сценария приложения и характеристик данных.
<<<<< Тонги Цяньвэнь<<<<

Вы в замешательстве? Что такое «среднее значение и дисперсия текущей мини-партии»? Что такое «среднее значение и дисперсия каждого признака выборки»?? Ответ иностранца лучше:

Давайте сначала разберемся с основными понятиями:

  • пример: образец, изображение для резюме,предложение для НЛП;
  • элемент: компоненты образца, пиксель для изображения,слово для вынесения приговора;
  • особенность: Характеристики элемента, Значение RGB для pexel,встраивание за слово.

Это отражено в данных:

  • [B, C, H, W] это партия,[C, H, W] это экземпляр,[C] Это пиксель, включающий в себяC особенность.
  • [B, T, L] это партия,[T, L] это экземпляр,[L] Это слово, включающее в себяL особенность.

Как показано ниже:

Если смотреть со стороны пакетного измерения, каждый небольшой квадрат, вытянутый назад, представляет собой элемент, например, длинную фиолетовую полосу на левом изображении, признак RGB пикселя или вектор слов.LayerNorm Даватькаждый элемент Вычислив среднее значение и дисперсию, вы можете получитьBxL среднее и дисперсия (илиBxHxW). ЗатемКаждый элемент стандартизируется независимоФиолетовый участок на рисунке справа — это признак, первый признак всех слов в пакете. Каждый такой участок — это признак. BatchNorm ДаватьКаждая функция Вычислив среднее значение и дисперсию, вы можете получитьL среднее и дисперсия (илиC). ЗатемКаждая функция стандартизируется независимо.


Следует отметить, что Трансформер не следует вышеуказанному.LayerNorm рассчитано, но данокаждый экземпляр Вычислив среднее значение и дисперсию, вы можете получитьB среднее и дисперсия, тогдаКаждый экземпляр стандартизируется независимоЕсли быть точным, то это выглядит как на картинке ниже:

1.2 В PyTorch BatchNorm иLayerNorm
1.2.1 BatchNorm

В ПайТорч BatchNorm точкаnn.BatchNorm1d, nn.BatchNorm2d иnn.BatchNorm3dсоответственно для данных разных размерностей:

  • nn.BatchNorm1d: (N, C) или(N, C, L)
  • nn.BatchNorm2d: (N, C, H, W)
  • nn.BatchNorm3d: (N, C, D, H, W)

Посмотреть исходный код:

class BatchNorm1d(_BatchNorm):
	r"""
	Args:
		num_features: number of features or channels `C` of the input

	Shape:
		- Input: `(N, C)` or `(N, C, L)`, where `N` is the batch size,
		  `C` is the number of features or channels, and `L` is the sequence length
		- Output: `(N, C)` or `(N, C, L)` (same shape as input)
	"""
	def _check_input_dim(self, input):
		if input.dim() != 2 and input.dim() != 3:
			raise ValueError(f"expected 2D or 3D input (got {input.dim()}D input)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Примеры:

>>> m = nn.BatchNorm1d(100)  # C=100	   # With Learnable Parameters
>>> m = nn.BatchNorm1d(100, affine=False)  # Without Learnable Parameters
>>> input = torch.randn(20, 100)  # (N, C)
>>> output = m(input)
>>> # 或者
>>> input = torch.randn(20, 100, 30)  # (N, C, L)
>>> output = m(input)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

γ , β bm{гамма}, bm{бета}γ,β является обучаемым параметром, иshape=(C,), имя параметра .weight и.bias:

>>> m = nn.BatchNorm1d(100)
>>> m.weight
Parameter containing:
tensor([1., 1., ..., 1.], requires_grad=True) 
>>> m.weight.shape
torch.Size([100])
>>> m.bias
Parameter containing:
tensor([0., 0., ..., 0.], requires_grad=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

BatchNorm2d иBatchNorm3d одинаковы, разница в том, что_check_input_dim(input):

class BatchNorm2d(_BatchNorm):
	r"""
	Args:
		num_features: `C` from an expected input of size `(N, C, H, W)`
	Shape:
		- Input: :math:`(N, C, H, W)`
		- Output: :math:`(N, C, H, W)` (same shape as input)
	"""
	def _check_input_dim(self, input):
		if input.dim() != 4:
			raise ValueError(f"expected 4D input (got {input.dim()}D input)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Примеры:

>>> m = nn.BatchNorm2d(100)
>>> input = torch.randn(20, 100, 35, 45)
>>> output = m(input)
  • 1
  • 2
  • 3
class BatchNorm3d(_BatchNorm):
	r"""
	Args:
		num_features: `C` from an expected input of size `(N, C, D, H, W)`
	Shape:
		- Input: :math:`(N, C, D, H, W)`
		- Output: :math:`(N, C, D, H, W)` (same shape as input)
	"""
	def _check_input_dim(self, input):
		if input.dim() != 5:
			raise ValueError(f"expected 5D input (got {input.dim()}D input)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Примеры:

>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
  • 1
  • 2
  • 3
1.2.2 LayerNorm

отличается от BatchNorm(num_features), LayerNorm(normalized_shape) Параметрыinput.shape послеx индивидуальныйdim, нравиться [B, T, L] Последние два измерения[T, L], то каждое предложение будет стандартизировано независимо, если; L или[L], то каждый вектор слов стандартизируется независимо.

Пример НЛП

>>> batch, sentence_length, embedding_dim = 20, 5, 10
>>> embedding = torch.randn(batch, sentence_length, embedding_dim)
>>> layer_norm = nn.LayerNorm(embedding_dim)
>>> layer_norm(embedding)  # Activate module
  • 1
  • 2
  • 3
  • 4

Пример изображения

>>> N, C, H, W = 20, 5, 10, 10
>>> input = torch.randn(N, C, H, W)
>>> # Normalize over the last three dimensions (i.e. the channel and spatial dimensions)
>>> layer_norm = nn.LayerNorm([C, H, W])
>>> output = layer_norm(input)
  • 1
  • 2
  • 3
  • 4
  • 5

Другими словами, оно включает не только «различные элемент Стандартизируйте независимо» и «Каждыйпример независимо нормализуется» и может вычислить любыенормализовать по последним x измерениям.

1.3 Исследование процесса расчета
import torch
from torch import nn

# >>> 手动计算 BatchNorm2d >>>
weight = torch.ones([1, 3, 1, 1])
bias = torch.zeros([1, 3, 1, 1])

x = 10 * torch.randn(2, 3, 4, 4) + 100
mean = x.mean(dim=[0, 2, 3], keepdim=True)
std = x.std(dim=[0, 2, 3], keepdim=True, unbiased=False)
print(x)
print(mean)
print(std)

y = (x - mean) / std
y = y * weight + bias
print(y)
# <<< 手动计算 BatchNorm2d <<<

# >>> nn.BatchNorm2d >>>
bnm2 = nn.BatchNorm2d(3)
z = bnm2(x)
print(z)
# <<< nn.BatchNorm2d <<<
print(torch.norm(z - y, p=1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

Вы обнаружите, что расчет и nn.BatchNorm Расчеты практически одинаковые, возможно есть какие-то ϵ эпсилонϵ Обратите внимание, что здесь.unbiased=False Важно отметить, что официальная документация объясняет:

"""
At train time in the forward pass, the standard-deviation is calculated via the biased estimator,
equivalent to `torch.var(input, unbiased=False)`.
However, the value stored in the moving average of the standard-deviation is calculated via
the unbiased  estimator, equivalent to `torch.var(input, unbiased=True)`.

Also by default, during training this layer keeps running estimates of its computed mean and
variance, which are then used for normalization during evaluation.
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Я просто хочу проверить процесс расчета здесь, а не сосредотачиваться на unbiased. Упомяну вкратце:

  • На этапе обучения вычисляется смещенная оценка дисперсии, тогда как дисперсия скользящего среднего с дисперсией является несмещенной оценкой;
  • Во время обучения скользящее среднее среднего значения и var будет сохранено и затем использовано на этапе тестирования.