Saltar al contenido principal

Normalización por lotes: Teoría e implementación de TensorFlow

La normalización de lotes normaliza las entradas de minilotes para estabilizar y acelerar el entrenamiento de la red neuronal.
Actualizado 30 jul 2024  · 15 min de lectura

Entrenar redes neuronales profundas puede ser un reto debido a los gradientes que desaparecen o explotan y al desplazamiento interno de las covariables. Estos factores pueden ralentizar considerablemente el proceso de entrenamiento y obstaculizar la capacidad de la red para aprender eficazmente. Afortunadamente, podemos resolver estos problemas con técnicas de normalización.

Aunque hay muchas técnicas de normalización, la normalización por lotes es una de las más populares y se ha convertido en un componente estándar en muchas arquitecturas de aprendizaje profundo. Contribuye a una convergencia más rápida, una mayor estabilidad del entrenamiento y un mejor rendimiento de la generalización.

En este tutorial, explicaremos la normalización por lotes, cómo funciona matemáticamente y cómo implementarla utilizando TensorFlow y Keras.

Si quieres aprender los fundamentos de las redes neuronales utilizando Keras, consulta este curso de Introducción al Aprendizaje Profundo en Python.

¿Qué es la normalización en el aprendizaje automático?

La normalización es un paso crucial del preprocesamiento en el aprendizaje automático, cuyo objetivo es normalizar los datos de entrada.

Se suelen utilizar varias técnicas de normalización, como el escalado mín-máx, la normalización de la puntuación z y la transformación logarítmica, para reescalar las características a un rango o distribución coherentes. Estas técnicas ayudan a mitigar el impacto de los valores atípicos, mejoran la convergencia y garantizan una comparación justa entre las características.

Normalizar los datos de entrada es esencial para un entrenamiento eficaz del modelo, porque garantiza que todas las características contribuyan por igual al proceso de aprendizaje. Sin normalización, los rasgos con escalas o varianzas mayores pueden dominar el proceso de optimización, lo que conduce a un rendimiento subóptimo del modelo.

La normalización permite que el modelo aprenda patrones y relaciones significativas de los datos, llevando todas las características a una escala similar.

Si quieres aprender sobre la normalización en general, consulta este tutorial sobre Qué es la normalización en el aprendizaje automático.

Retos del entrenamiento del aprendizaje profundo

Entrenar redes neuronales profundas presenta varios retos que pueden dificultar la convergencia y la generalización:

  1. Desplazamiento interno de covariables: A medida que los datos de entrada pasan por varias capas, la distribución de las activaciones puede cambiar, lo que dificulta que el modelo se adapte y aprenda eficazmente.
  2. Desvanecimiento y explosión de gradientes: Las redes profundas pueden sufrir gradientes desvanecientes o explosivos, en los que los gradientes se vuelven demasiado pequeños o demasiado grandes durante la retropropagación, impidiendo actualizaciones eficaces de los pesos.
  3. Sensibilidad a la inicialización: Los pesos iniciales de la red pueden influir significativamente en el proceso de entrenamiento, y una mala inicialización puede provocar una convergencia lenta o incluso el fracaso del entrenamiento.

La normalización por lotes aborda estos retos normalizando las activaciones dentro de cada minilote, lo que ayuda a estabilizar el proceso de entrenamiento y a mejorar el rendimiento del modelo.

¿Qué es la Normalización por Lotes?

La normalización por lotes es una técnica que normaliza las activaciones de una capa dentro de un minilote durante el entrenamiento de redes neuronales profundas.

Funciona calculando la media y la varianza de las activaciones de cada rasgo del minilote y normalizando después las activaciones mediante estos estadísticos.

A continuación, las activaciones normalizadas se escalan y desplazan mediante parámetros aprendibles, lo que permite al modelo adaptarse a la distribución óptima de activación.

normalización de lotes
AI

Fuente: Yintai Ma and Diego Klabjan.

La normalización por lotes suele aplicarse después de la transformación lineal de una capa (por ejemplo, después de la multiplicación de matrices en una capa totalmente conectada o después de la operación de convolución en una capa convolucional) y antes de la función de activación no lineal (por ejemplo, ReLU).

Los componentes clave de la normalización por lotes son

  1. Estadísticas de minilotes: La media y la varianza de las activaciones se calculan para cada característica dentro del minilote.
  2. Normalización: Las activaciones se normalizan restando la media del minilote y dividiendo por la desviación típica del minilote.
  3. Escalar y desplazar: Se introducen parámetros aprendibles (γ y β) para escalar y desplazar las activaciones normalizadas, permitiendo que el modelo aprenda la distribución óptima de activación.

¿Por qué utilizar la normalización por lotes?

Uno de los retos a los que nos enfrentamos al entrenar redes neuronales profundas es el desplazamiento interno de las covariables. Esto ocurre cuando la distribución de las activaciones (salidas) de una capa cambia a lo largo del proceso de entrenamiento a medida que se actualizan los pesos de las capas anteriores. Este cambio puede hacer que el entrenamiento sea difícil y lento.

La normalización por lotes reduce este desplazamiento normalizando las activaciones dentro de cada minilote, haciendo que las entradas a las capas posteriores sean más estables y coherentes.

Normalizar las activaciones permite una convergencia más rápida con mayores tasas de aprendizaje y hace que el modelo sea menos sensible a las elecciones de inicialización.

Además, introduce un efecto regularizador que ayuda a evitar el sobreajuste al reducir la dependencia del modelo de patrones de activación específicos.

Esta combinación de ventajas hace de la normalización por lotes una potente herramienta para entrenar modelos de aprendizaje profundo más robustos. Para saber más sobre cómo construir modelos robustos, consulta este curso sobre Conceptos de Monitorización del Aprendizaje Automático.

Matemáticas de la normalización por lotes

Ahora que entendemos el "por qué" de la normalización por lotes, profundicemos en el "cómo".

La normalización por lotes funciona de forma diferente durante las etapas de entrenamiento e inferencia, así que vamos a explicar las matemáticas que hay detrás de cada etapa.

Normalización por lotes durante el entrenamiento

Empecemos por el paso de normalización. Primero calculamos la media y la varianza de cada característica en un minilote. Estas son las fórmulas que podemos utilizar para la media y la varianza.

A continuación, utilizamos la media y la varianza para normalizar las activaciones. Ésta es la fórmula que podemos utilizar, donde la ε (épsilon minúscula) es una pequeña constante añadida para la estabilidad numérica:

Cuando hayamos terminado con el paso de normalización, pasaremos al paso de escalado y desplazamiento. Utilizando los parámetros aprendibles γ y β, desplazamos las activaciones normalizadas mediante esta fórmula:

Estos parámetros permiten al modelo aprender la distribución óptima de la activación.

Normalización por lotes durante la inferencia

Durante la inferencia, sustituimos los estadísticos de lote (media y varianza) por los estadísticos de ejecución calculados durante el entrenamiento. Las estadísticas de funcionamiento suelen actualizarse mediante una media móvil con un factor de impulso.

Para calcular la media y la varianza en funcionamiento, podemos utilizar estas dos fórmulas, donde α es el factor de impulso que controla la frecuencia de actualización de las estadísticas en funcionamiento:

La media y la varianza corrientes se almacenan como parámetros del modelo y se utilizan para la normalización durante la inferencia. Los parámetros de escala y desplazamiento (γ y β) aprendidos durante el entrenamiento también se utilizan durante la inferencia.

A continuación, vamos a aprender a aplicar la normalización por lotes utilizando TensorFlow.

Normalización por lotes en TensorFlow

Empecemos por importar las bibliotecas necesarias:

import tensorflow as tf 
from tensorflow import keras

A continuación, vamos a cargar el conjunto de datos MNIST, que consta de 60.000 imágenes de entrenamiento y 10.000 imágenes de prueba de dígitos manuscritos. Cargamos el conjunto de datos utilizando la función keras.datasets.mnist.load_data() y lo dividimos en datos de entrenamiento (x_train, y_train) y datos de prueba (x_test, y_test):

# Load the MNIST dataset
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

Para preprocesar los datos, seguimos los siguientes pasos:

  • Remodelamos las imágenes de entrenamiento y de prueba para que tengan una forma de (num_samples, 28, 28, 1), donde num_samples es el número de imágenes, y cada imagen es una imagen en escala de grises de 28x28 con un solo canal.
  • Normalizamos los valores de los píxeles de las imágenes dividiéndolos por 255,0 para escalarlos entre 0 y 1.
  • Convertimos las etiquetas de entrenamiento y de prueba a un formato categórico utilizando keras.utils.to_categorical(), que convierte las etiquetas enteras en vectores codificados de un solo golpe.
# Preprocess the data
x_train = x_train.reshape((60000, 28, 28, 1)) / 255.0  # Reshape and normalize training images
x_test = x_test.reshape((10000, 28, 28, 1)) / 255.0    # Reshape and normalize test images
y_train = keras.utils.to_categorical(y_train)         # Convert training labels to categorical format
y_test = keras.utils.to_categorical(y_test)           # Convert test labels to categorical format

Ahora, pasamos al siguiente paso: definir la arquitectura del modelo. Para ello, seguimos los siguientes pasos:

  • Definimos la arquitectura del modelo utilizando la API keras.Sequential, que permite apilar capas secuencialmente.
  • El modelo consta de capas convolucionales (Conv2D) para la extracción de características, seguidas de capas de normalización por lotes (BatchNormalization) para normalizar las activaciones.
  • Utilizamos la agrupación máxima (MaxPooling2D) para reducir el muestreo de los mapas de características.
  • Aplanamos los mapas de características (Flatten) antes de pasarlos a las capas densas.
  • La capa densa final tiene 10 unidades con activación softmax, correspondientes a las 10 clases de dígitos.
# Define the model architecture
model = keras.Sequential([
    keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(10, activation='softmax')
])

A continuación, compilamos el modelo mediante el método .compile(), especificando el optimizador, la función de pérdida y la métrica de evaluación. Utilizamos:

  • El optimizador Adam ('adam') para la optimización.
  • La pérdida de entropía cruzada categórica ('categorical_crossentropy') como función de pérdida, ya que el problema es una tarea de clasificación multiclase.
  • Precisión ('accuracy') como métrica de evaluación para medir el rendimiento del modelo.
# Compile the model
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

A continuación, vamos a entrenar el modo utilizando el método .fit():

  • Especificamos los datos de entrenamiento (x_train, y_train), el tamaño del lote, el número de épocas y los datos de validación (x_test, y_test).
  • En batch_size se determina el número de muestras por actualización del gradiente.
  • El parámetro epochs especifica el número de veces que el modelo iterará sobre la totalidad de los datos de entrenamiento.
  • Los datos de validación se utilizan para evaluar el rendimiento del modelo en datos no vistos durante el entrenamiento.
# Train the model
model.fit(x_train, y_train, batch_size=128, epochs=5, validation_data=(x_test, y_test))

Siguiendo estos pasos e incorporando capas de normalización por lotes en la arquitectura del modelo, podemos entrenar el modelo eficazmente en el conjunto de datos MNIST, beneficiándonos de la normalización de las activaciones y de una mayor estabilidad del entrenamiento.

Ahora que ya sabemos qué es la normalización por lotes y cómo aplicarla, examinemos sus ventajas.

Consideraciones sobre la aplicación

Profundicemos ahora en la aplicación de la normalización por lotes en las arquitecturas de aprendizaje profundo.

Colocación en arquitecturas de redes neuronales

Las capas de normalización por lotes son más eficaces cuando se colocan estratégicamente dentro de nuestra red. Normalmente, se colocan después de la transformación lineal (por ejemplo, capas convolucionales o totalmente conectadas) y antes de la función de activación no lineal.

En las redes convolucionales, esto se traduce en colocar la normalización por lotes después de cada capa convolucional y antes de la función de activación.

Del mismo modo, en las redes totalmente conectadas, es habitual añadir la normalización por lotes después de la transformación lineal y antes de la función de activación de cada capa oculta.

La colocación de las capas de Normalización de lotes puede influir en el rendimiento y la dinámica de entrenamiento de nuestro modelo. Puede que sea necesario experimentar para encontrar la configuración óptima para cada arquitectura de red específica.

Impacto del tamaño del lote

El tamaño del lote utilizado durante el entrenamiento puede afectar a la eficacia de la normalización por lotes. Los lotes de mayor tamaño proporcionan estimaciones más precisas de las estadísticas del lote (media y varianza), lo que conduce a una mejor normalización y a un entrenamiento más estable.

Sin embargo, aumentar el tamaño del lote también incrementa el consumo de memoria y los requisitos computacionales, lo que puede suponer una limitación en función de los recursos de hardware disponibles.

Es importante equilibrar el tamaño del lote y la viabilidad computacional, garantizando al mismo tiempo que las estadísticas del lote sigan siendo fiables para la normalización.

Efectos de regularización e implicaciones

La normalización por lotes introduce intrínsecamente un efecto de regularización debido al ruido inducido por las estadísticas de los minilotes. La estocasticidad introducida por la estadística de lotes actúa como una forma de regularización, reduciendo el sobreajuste y mejorando la generalización.

Sin embargo, este efecto de regularización puede interactuar con otras técnicas de regularización, como el abandono o la regularización L2.

Al utilizar la normalización por lotes, es esencial tener en cuenta la interacción entre los distintos métodos de regularización y ajustarlos en consecuencia para evitar un exceso de regularización o una disminución del rendimiento.

La experimentación y el control del rendimiento del modelo en los datos de validación pueden ayudar a encontrar el equilibrio adecuado de las técnicas de regularización cuando se utiliza la normalización por lotes.

Limitaciones y retos de la normalización por lotes

Aunque la normalización por lotes es una técnica útil, existen algunas limitaciones y retos que debemos conocer.

Normalización por lotes en arquitecturas no convolucionales

La Normalización por Lotes se diseñó originalmente para redes neuronales convolucionales (CNN) y ha tenido especial éxito en este ámbito.

Sin embargo, su eficacia en arquitecturas no convolucionales, como las redes neuronales recurrentes (RNN) o los transformadores, puede ser limitada.

La naturaleza secuencial de las RNN y los mecanismos de atención de los transformadores pueden hacer que aplicar la normalización por lotes sea más difícil.

Las técnicas de normalización alternativas, como la normalización de capas o la normalización de instancias, pueden ser más adecuadas para estas arquitecturas.

Pequeños tamaños de lote y rendimiento en tiempo de inferencia

La normalización por lotes se basa en las estadísticas por lotes calculadas durante el entrenamiento para normalizar las activaciones. Cuando el tamaño del lote es pequeño, las estadísticas del lote pueden ser menos fiables e introducir ruido o inestabilidad en el proceso de normalización.

Esto puede dar lugar a un rendimiento subóptimo o incluso a dificultades de entrenamiento, especialmente cuando el tamaño del lote se reduce para adaptarse a las limitaciones de memoria.

Durante la inferencia, la normalización por lotes utiliza los estadísticos en ejecución calculados durante el entrenamiento, que pueden no representar con exactitud los estadísticos de muestras individuales o lotes pequeños. Esto puede provocar un desajuste entre las distribuciones de entrenamiento y de inferencia, lo que puede afectar al rendimiento del modelo.

Inconvenientes y compensaciones de la normalización por lotes

La normalización por lotes introduce una sobrecarga computacional adicional durante el entrenamiento, debido al cálculo de las estadísticas por lotes y a la operación de normalización. Esta sobrecarga puede aumentar los requisitos de memoria y el tiempo de entrenamiento, especialmente para modelos o conjuntos de datos grandes.

La normalización por lotes puede ser inadecuada para ciertos tipos de datos o tareas en los que el proceso de normalización puede distorsionar información importante o eliminar variaciones significativas.

Por ejemplo, la normalización por lotes puede tener efectos indeseables en tareas que impliquen detalles de grano fino o información espacial precisa, como la segmentación o la localización.

El efecto de regularización de la Normalización por Lotes a veces puede interactuar con otras técnicas de regularización, como el abandono, de formas inesperadas, lo que requiere un ajuste y una consideración cuidadosos.

Cómo mitigar las limitaciones de la normalización por lotes

A pesar de las limitaciones y los retos, la normalización por lotes sigue siendo una técnica muy utilizada y eficaz en el aprendizaje profundo. Los investigadores y los profesionales siguen explorando formas de abordar estas cuestiones y mejorar la formulación original.

Consideremos algunos enfoques para mitigar las limitaciones de la normalización por lotes:

  • Normalización por lotes adaptativa: Esta técnica ajusta las estadísticas de los lotes en función de las características específicas de cada muestra, lo que ayuda a paliar los problemas asociados a los lotes pequeños.
  • Normalización de lotes virtuales: Este método calcula las estadísticas de normalización utilizando un lote virtual que incluye muestras de varios lotes, lo que mejora la estabilidad y fiabilidad del proceso de normalización.
  • Técnicas híbridas de normalización: Combinar la normalización por lotes con otros métodos de normalización, como la normalización por capas o la normalización por instancias, puede ayudar a abordar las limitaciones específicas de determinadas arquitecturas o tareas.

Variantes y ampliaciones de la normalización por lotes

Veamos ahora distintas variantes y extensiones de la normalización por lotes que también podemos utilizar para mitigar los posibles retos que plantea la normalización por lotes.

Normalización de capas

La normalización de capas opera sobre las activaciones de todos los canales de una capa, en lugar de sobre la dimensión de lote.

Normaliza las activaciones basándose en la media y la varianza calculadas para cada muestra individual del lote.

La normalización de capas es especialmente útil para redes neuronales recurrentes (RNN) y escenarios en los que el tamaño del lote es pequeño o variable.

Normalización de grupos

La normalización de grupos divide los canales en grupos y calcula las estadísticas de normalización dentro de cada grupo.

Equilibra la normalización por capas y la normalización por lotes normalizando conjuntamente un subconjunto de canales.

La normalización de grupos es eficaz en situaciones en las que el tamaño del lote es limitado, como en entornos con memoria limitada o al procesar imágenes de alta resolución.

Normalización de instancias

La normalización de instancias aplica la normalización a cada canal individual de cada muestra del lote.

Se suele utilizar en tareas de transferencia de estilo y generación de imágenes, en las que el objetivo es normalizar el contenido conservando la información de estilo.

Se ha demostrado que la normalización de instancias mejora la calidad y la estabilidad de las imágenes generadas en este tipo de aplicaciones.

Renormalización por lotes

La renormalización por lotes amplía la normalización por lotes introduciendo términos de corrección adicionales en el proceso de normalización.

Su objetivo es resolver la discrepancia entre las estadísticas del lote y las estadísticas de la población, sobre todo cuando el tamaño del lote es pequeño.

La renormalización por lotes ayuda a estabilizar el entrenamiento y mejora la capacidad de generalización del modelo, sobre todo en escenarios con tamaños de lote limitados.

Normalización del peso

La normalización de pesos es una técnica que reparametriza los pesos de una red neuronal para desacoplar la magnitud y la dirección de los pesos.

Normaliza los pesos dividiéndolos por su norma euclidiana e introduce un parámetro de escala aprendible.

La normalización por peso puede utilizarse junto con la Normalización por lotes o como método de normalización alternativo.

Se ha demostrado que mejora el condicionamiento del problema de optimización y acelera la convergencia en algunos casos.

Estas variantes y extensiones de la normalización por lotes ofrecen herramientas y técnicas adicionales para abordar retos específicos y mejorar la formación y el rendimiento de los modelos de aprendizaje profundo. Cada variante tiene sus puntos fuertes y sus consideraciones, y la elección de cuál utilizar depende de los requisitos específicos de la tarea, la arquitectura del modelo y los recursos informáticos disponibles.

Conclusión

La normalización por lotes se ha convertido en una técnica crucial en el aprendizaje profundo, que ofrece importantes ventajas para el entrenamiento de redes neuronales profundas.

Al normalizar las activaciones dentro de los minilotes, podemos resolver el desplazamiento interno de las covariables, mejorar la convergencia y aumentar la generalización. Como aspirante o joven profesional de los datos, ten en cuenta estos puntos clave:

  • Incorpora capas de Normalización de lotes a tus modelos de aprendizaje profundo para mejorar la estabilidad y el rendimiento del entrenamiento.
  • Experimenta colocando capas de normalización por lotes y controla el impacto en el rendimiento de tu modelo.
  • Mantente al día de las últimas investigaciones y avances en técnicas de normalización para aprovechar los métodos más eficaces para tus proyectos.

Si quieres convertirte en ingeniero de aprendizaje automático, considera este itinerario profesional de 12 cursos sobre cómo convertirse en ingeniero de aprendizaje automático.

Temas

Más información sobre IA y aprendizaje automático

programa

AI Fundamentals

10hrs hr
Discover the fundamentals of AI, dive into models like ChatGPT, and decode generative AI secrets to navigate the dynamic AI landscape.
Ver detallesRight Arrow
Comienza El Curso
Ver másRight Arrow
Relacionado

tutorial

Cómo formar a un LLM con PyTorch

Domine el proceso de entrenamiento de grandes modelos lingüísticos con PyTorch, desde la configuración inicial hasta la implementación final.

Zoumana Keita

8 min

tutorial

Tutorial de ecuación normal para regresión lineal

Aprende qué es la ecuación normal y cómo puedes utilizarla para construir modelos de machine learning.
Kurtis Pykes 's photo

Kurtis Pykes

8 min

tutorial

Guía completa para el aumento de datos

Aprende sobre técnicas, aplicaciones y herramientas de aumento de datos con un tutorial de TensorFlow y Keras.
Abid Ali Awan's photo

Abid Ali Awan

15 min

tutorial

Stemming y lematización en Python

En este tutorial se abordan de forma práctica las funciones de stemming y lematización mediante el paquete Python Natural Language ToolKit (NLTK).
Kurtis Pykes 's photo

Kurtis Pykes

12 min

tutorial

Comprender la regresión logística en el tutorial de Python

Aprende sobre la regresión logística, sus propiedades básicas, y construye un modelo de machine learning sobre una aplicación del mundo real en Python.
Avinash Navlani's photo

Avinash Navlani

10 min

tutorial

Aprendizaje automático de datos categóricos con el tutorial de Python

Aprenda los trucos más comunes para manejar datos categóricos y preprocesarlos para construir modelos de aprendizaje automático.
Moez Ali's photo

Moez Ali

28 min

See MoreSee More