Compartir tecnología

Norma de lote

2024-07-12

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

0. Resumen

Conocido hace mucho tiempo BatchNorm yLayerNorm, en ese momento sólo se sabía aproximadamente que habían realizado datosEstandarización: x = x − μ σ bm{x} = frac{bm{x} - bm{mu}}{bm{sigma}}X=σXμ Por supuesto, esto es simple, pero los datos reales son más complicados.Tareas del CVEn términos de imagen de datos, los datos de un lote suelen tener este aspecto: [B, C, H, W]; para Tareas de PNLEn términos de oraciones de datos, los datos de un lote suelen verse así: [B, T, D]. Eso XXNorm ¿Cómo se calcula? Definitivamente no todos los números del lote completo se calculan a la vez. μbm{mu}μ y σbm{sigma}σ, y son diferentes.

Así que verifiqué mucha información y realmente estuve de acuerdo con las palabras del instructor: no leas esos blogs desordenados, no son tan buenos como tú. Los extranjeros siguen siendo increíbles, ¡pueden explicar los problemas claramente simplemente respondiendo las preguntas en el! área de comentarios: 《¿Por qué los transformadores utilizan la norma de capa en lugar de la norma de lote?》

1. ¿Cómo calcular?

Esta sección explica en detalle desde la perspectiva teórica y del código. BatchNorm yLayerNorm método de cálculo.

1.1 Primero hablemos de ello teóricamente, preguntando sobre el significado general de Qianwen.

>>>>> Tongyi Qianwen >>>>>
preguntar: ¿Cuál es la diferencia entre norma de capa y norma de lote? Dé una explicación de la fórmula.

respuesta: Normalización de capas (LayerNorm) yNormalización de lotes (BatchNorm) son técnicas utilizadas para acelerar el entrenamiento de redes neuronales, a través de la capa de normalizaciónIntroducir o activar valor, haciendo que el aprendizaje en red sea más estable y eficiente.ImplementaciónyEscena aplicableson diferentes en.

Normalización de lotes (BatchNorm)
BatchNorm Principalmente durante el entrenamiento.Para un mini lote de datospara normalizar suobjetivo principalReducir los cambios de covariables internas(desplazamiento de covariable interno), es decir, durante el proceso de propagación hacia adelante de la red, la distribución de entrada de la capa intermedia cambia con las iteraciones de entrenamiento. BatchNorm vía cálculoLa media y la varianza del mini lote actual.Para normalizar la entrada, la fórmula es la siguiente:
configuración xbm{x}X es el vector de entrada dentro de un mini lote, μB bm{mu}_BμB y σB 2bm{sigma}^2_BσB2 son la media y la varianza del mini lote respectivamente, entoncesBatchNorm Producción y bm{y}y Se puede expresar como: x ^ = x − μ B μ B 2 + ϵ y ^ = γ x ^ + β^bmX=bmXbmμBbmμ2B+ϵ^bmy=γ^bmX+β X^y^=μB2+ϵ XμB=γX^+β en, γ gamaγ y β-betaβ es un parámetro que se puede aprender, épsilonϵ es una pequeña constante utilizada para la estabilidad numérica.

Normalización de capas (LayerNorm)
LayerNorm El propósito esen cada nivel de muestraRealice la normalización sin depender de estadísticas de mini lotes. LayerNorm Más adecuado para modelos de secuencia (comoLSTM oTransformer), etc., entre los quePuede haber dependencias entre muestras.o Es posible que el tamaño del mini lote no esté fijo.. LayerNorm calcularLa media y la varianza de cada característica de la muestra., la fórmula es la siguiente:
configuración xbm{x}X es el vector de características de una sola muestra, μL bm{mu}_Lμyo y σL 2bm{sigma}^2_Lσyo2 son la media y la varianza de las características de la muestra respectivamente, entoncesLayerNorm Producción y bm{y}y Se puede expresar como: x ^ = x − μ L μ L 2 + ϵ y ^ = γ x ^ + β^bmX=bmXbmμyobmμ2yo+ϵ^bmy=γ^bmX+β X^y^=μyo2+ϵ Xμyo=γX^+β Aquí igual, γ gamaγ y β-betaβ es un parámetro que se puede aprender, épsilonϵ es una pequeña constante.

la diferencia

  • Depende de los datos: BatchNorm depende deestadísticas de mini lotes, y LayerNorm depende deEstadísticas características de una sola muestra.;
  • Escenarios de aplicación: BatchNorm más adecuado paratareas de visión por computadora, y LayerNorm más adecuado paratareas de procesamiento del lenguaje natural, especialmente cuando se trata de datos de secuencia;
  • Eficiencia computacional: BatchNorm Puede ser más eficiente en computación paralela porque puede aprovechar el paralelismo dentro de mini lotes, mientras queLayerNorm Los cálculos de cada muestra son independientes y más adecuados para procesar datos de secuencia de diferentes longitudes.

Ambos métodos tienen sus propias ventajas y desventajas, y el método a elegir generalmente depende del escenario de aplicación específico y de las características de los datos.
<<<<<Tongyi Qianwen<<<<

¿Estás claro? ¿Cuál es "la media y la varianza del mini lote actual"?? ¿Qué es "la media y la varianza de cada característica de la muestra"?? La respuesta del extranjero es mejor:

Primero comprendamos los conceptos básicos:

  • instancia: una muestra, imagen para CV,oración para PNL;
  • elementoo: componentes de la muestra, píxel para la imagen,palabra para la oración;
  • característica: Características del elemento, valor RGB para pexel,incrustación para la palabra.

Esto se refleja en los datos:

  • [B, C, H, W] es un lote,[C, H, W] es una instancia,[C] Es un píxel, incluyendoC característica.
  • [B, T, L] es un lote,[T, L] es una instancia,[L] Es una palabra, incluyendoL característica.

Como se muestra abajo:

Mirando desde el lado de Batch Dimension, cada pequeño cuadrado extendido hacia atrás representa un elemento, como la larga barra violeta en la imagen de la izquierda, la característica RGB de un píxel o un vector de palabras.LayerNorm Darcada elemento Calcula la media y la varianza, puedes obtenerBxL media y varianza (oBxHxW). EntoncesCada elemento está estandarizado de forma independiente.El parche morado en la imagen de la derecha es una característica, la primera característica de todas las palabras en el lote es una característica. BatchNorm DarCada característica Calcula la media y la varianza, puedes obtenerL media y varianza (oC). EntoncesCada característica está estandarizada de forma independiente..


Cabe señalar que Transformer no sigue lo mencionado anteriormente.LayerNorm calculado, pero dadocada instancia Calcula la media y la varianza, puedes obtenerB media y varianza, entoncesCada instancia está estandarizada de forma independiente.Para ser precisos, se parece a la siguiente imagen:

1.2 En PyTorch BatchNorm yLayerNorm
1.2.1 BatchNorm

En PyTorch, BatchNorm puntonn.BatchNorm1d, nn.BatchNorm2d ynn.BatchNorm3d, respectivamente para datos de diferentes dimensiones:

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

Ver código fuente:

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

Ejemplos:

>>> 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{gamma}, bm{beta}γ,β es un parámetro que se puede aprender, yshape=(C,), el nombre del parámetro es .weight y.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 yBatchNorm3d son iguales la diferencia es que_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

Ejemplos:

>>> 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

Ejemplos:

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

diferente de BatchNorm(num_features), LayerNorm(normalized_shape) Los parámetros soninput.shape despuésx individualdim, como [B, T, L] Las dos últimas dimensiones de[T, L], entonces cada oración se estandarizará de forma independiente si; L o[L], entonces cada vector de palabras se estandariza de forma independiente.

Ejemplo de PNL

>>> 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

Ejemplo de imagen

>>> 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

En otras palabras, no sólo incluye las “diversas elementoo Estandarizar de forma independiente” y “Cadainstancia normalizado independientemente" y puede calcular cualquiernormalizar sobre las últimas x dimensiones.

1.3 Investigación del proceso de cálculo
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

Descubrirá que calcular manualmente y nn.BatchNorm Los cálculos son casi exactamente los mismos, tal vez haya algunos épsilonϵ La influencia de esto.unbiased=False Es importante tener en cuenta que la documentación oficial explica:

"""
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

Sólo quiero verificar el proceso de cálculo aquí, no centrarme en unbiased. Sólo para mencionar brevemente:

  • La etapa de entrenamiento calcula una estimación sesgada de la varianza, mientras que la varianza en el promedio móvil con varianza es una estimación insesgada;
  • Durante el entrenamiento, el promedio móvil de la media y la var se guardará y luego se utilizará en la etapa de prueba.