Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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?》
Esta sección explica en detalle desde la perspectiva teórica y del código. BatchNorm
yLayerNorm
método de cálculo.
>>>>> 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 principalSíReducir 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=bmX−bmμB√bmμ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=bmX−bmμyo√bmμ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
BatchNorm
depende deestadísticas de mini lotes, y LayerNorm
depende deEstadísticas características de una sola muestra.;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;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:
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:
BatchNorm
yLayerNorm
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)")
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)
γ, β, 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)
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)")
Ejemplos:
>>> 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)")
Ejemplos:
>>> m = nn.BatchNorm3d(100)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)
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
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)
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.
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))
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.
"""
Sólo quiero verificar el proceso de cálculo aquí, no centrarme en unbiased
. Sólo para mencionar brevemente: