моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Встретились давным-давно BatchNorm
иLayerNorm
, на тот момент было лишь приблизительно известно, что они выполнили данныестандартизация: x = x − μ σ bm{x} = frac{bm{x} - bm{mu}}{bm{sigma}}Икс=σИкс−μ Это конечно просто, но реальные данные сложнее.Задачи резюмеС точки зрения изображения данных данные пакета обычно выглядят следующим образом: [B, C, H, W]
; для Задачи НЛПС точки зрения предложения данных данные пакета обычно выглядят следующим образом: [B, T, D]
. Что XXNorm
Как он рассчитывается? Определенно не все числа во всей партии рассчитываются сразу? μ бм{мю}μ и σ bm{сигма}σ, и они разные.
Итак, я проверил много информации и действительно согласился со словами преподавателя: не читайте эти грязные блоги, они не так хороши, как вы! область комментариев: 《Почему трансформаторы используют норму слоя вместо нормы партии?》
В этом разделе подробно объясняется как с теоретической точки зрения, так и с точки зрения кода. BatchNorm
иLayerNorm
метод расчета.
>>>>> Тонги Цяньвэнь >>>>>
просить: Чем отличается норма слоя от нормы партии. Дайте пояснение формулы.
отвечать: Нормализация слоя (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
Расчеты по каждой выборке независимы и больше подходят для обработки данных последовательности различной длины.Оба метода имеют свои преимущества и недостатки, и какой метод выбрать обычно зависит от конкретного сценария приложения и характеристик данных.
<<<<< Тонги Цяньвэнь<<<<
Вы в замешательстве? Что такое «среднее значение и дисперсия текущей мини-партии»? Что такое «среднее значение и дисперсия каждого признака выборки»?? Ответ иностранца лучше:
Давайте сначала разберемся с основными понятиями:
Это отражено в данных:
[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
среднее и дисперсия, тогдаКаждый экземпляр стандартизируется независимоЕсли быть точным, то это выглядит как на картинке ниже:
BatchNorm
иLayerNorm
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)")
Примеры:
>>> 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)
γ , β 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)
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)")
Примеры:
>>> m = nn.BatchNorm2d(100)
>>> input = torch.randn(20, 100, 35, 45)
>>> output = m(input)
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)")
Примеры:
>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
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
Пример изображения
>>> 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)
Другими словами, оно включает не только «различные элемент Стандартизируйте независимо» и «Каждыйпример независимо нормализуется» и может вычислить любыенормализовать по последним x измерениям.
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))
Вы обнаружите, что расчет и 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.
"""
Я просто хочу проверить процесс расчета здесь, а не сосредотачиваться на unbiased
. Упомяну вкратце: