Tutorial de redes neuronales artificiales (RNA) con TensorFlow

⚡ Resumen inteligente

Las redes neuronales artificiales aprenden procesando la información de entrada a través de capas conectadas, evaluando el resultado con una función de pérdida y ajustando los pesos con un optimizador. Este tutorial muestra cómo construir una red neuronal artificial en TensorFlow y clasificar dígitos del conjunto de datos MNIST.

  • 🔘 Cuatro objetos: Toda red neuronal artificial se compone de capas, características y etiquetas, una función de pérdida y un optimizador.
  • ☑️ Roles de capa: La entrada alimenta las capas ocultas, y el tamaño de la capa de salida coincide con el número de clases para las tareas de clasificación.
  • ✅ Opción de activación: La función ReLU devuelve cero para valores negativos, lo que permite que la red aprenda patrones no lineales que un modelo lineal no detecta.
  • 🧪 Controles sobreajustados: Las redes más pequeñas, las penalizaciones de peso L1 o L2 y las tasas de abandono entre 0.2 y 0.5 restauran la generalización.
  • 🛠️ Seis pasos de construcción: Importa MNIST, escálalo, crea columnas de características, define DNNClassifier, entrena y luego agrega regularización.
  • 📈 Resultado medido: Las capas ocultas de 300 y 100 unidades alcanzan una precisión de 0.9637143; la variante regularizada baja a 0.95057142.

Red neuronal artificial (ANN)

¿Qué es la red neuronal artificial?

An Red neuronal artificial (ANN) Es un sistema informático inspirado en las redes neuronales biológicas para crear cerebros artificiales basados ​​en un conjunto de unidades conectadas llamadas neuronas artificiales. Está diseñado para analizar y procesar información como lo hacen los humanos. Una red neuronal artificial tiene capacidad de autoaprendizaje para producir mejores resultados a medida que dispone de más datos.

El diagrama a continuación traces un recorrido completo a través de dicha red, desde la entrada sin procesar hasta el optimizador que corrige los pesos.

Diagrama de flujo de una red neuronal artificial que muestra la entrada, dos capas ponderadas, predicción, función de pérdida y optimizador.

Una red neuronal artificial (RNA) se compone de cuatro objetos principales:

  • Capas: Todo el aprendizaje se produce en las capas. Hay 3 capas: 1) Entrada, 2) Oculta y 3) Salida.
  • Característica y etiqueta: Datos de entrada a la red (características) y salida de la red (etiquetas)
  • Función de pérdida: Métrica utilizada para estimar el rendimiento de la fase de aprendizaje.
  • Optimizador: Mejora el aprendizaje actualizando el conocimiento en la red.

Una red neuronal toma los datos de entrada y los introduce en un conjunto de capas. A continuación, la red evalúa su rendimiento mediante una función de pérdida. Esta función le indica a la red el camino que debe seguir para dominar el conocimiento. La red perfecciona dicho conocimiento con la ayuda de un optimizador.

Si observa la figura anterior, comprenderá el mecanismo subyacente.

El programa toma algunos valores de entrada y los introduce en dos capas totalmente conectadas. Imagina que tienes un problema de matemáticas. Lo primero que haces es leer el capítulo correspondiente para resolverlo. Luego aplicas tus nuevos conocimientos al problema. Hay muchas probabilidades de que no obtengas una buena puntuación. Lo mismo ocurre con una red neuronal: la primera vez que ve los datos y hace una predicción, el resultado no coincidirá perfectamente con los datos reales.

Para mejorar su conocimiento, la red neuronal utiliza un optimizador. En esta analogía, el optimizador se asemeja a releer un capítulo: al releerlo, se obtienen nuevas perspectivas. De manera similar, la red utiliza el optimizador, actualiza su conocimiento y lo pone a prueba para comprobar cuánto necesita aprender aún. El programa repite este paso hasta minimizar el error.

En la analogía de los problemas matemáticos, esto significa que lees el capítulo del libro de texto muchas veces hasta comprender completamente el contenido del curso. Incluso después de leerlo varias veces, si sigues cometiendo errores, significa que has alcanzado el límite de conocimiento del material actual. Necesitas usar otro libro de texto o probar un método diferente para mejorar tu puntuación. Para una red neuronal, el proceso es el mismo. Si el error deja de disminuir y la curva de pérdida se aplana, la arquitectura actual no puede aprender nada más. La red debe optimizarse para mejorar el conocimiento.

Esos cuatro objetos se corresponden directamente con los componentes que se configuran al diseñar una red.

Red neuronal Architectura

La arquitectura de la red neuronal artificial consta de los siguientes componentes:

  • Capas
  • Función de activación
  • Función de pérdida
  • Optimizador

Capas

Una capa es donde se lleva a cabo todo el aprendizaje. Dentro de una capa se encuentra un número arbitrario de neuronas, cada una con sus propios pesos. Una red neuronal típica suele procesarse mediante capas densamente conectadas (también llamadas capas totalmente conectadas). Esto significa que todas las entradas están conectadas a la salida.

Una red neuronal típica recibe un vector de entrada y un escalar que contiene las etiquetas. La configuración más sencilla es una clasificación binaria con solo dos clases: 0 y 1.

La red recibe una entrada, la envía a todos los nodos conectados y calcula la señal mediante una función de activación. El diagrama numerado que aparece a continuación muestra un nodo individual ampliado para que se puedan observar por separado la suma ponderada y el paso de activación.

Diagrama de red de dos capas con pesos w11 a w22 y una anotación que muestra la suma ponderada y la función de activación dentro de un nodo.

La figura anterior ilustra esta idea. La primera capa almacena los valores de entrada. La segunda capa, denominada capa oculta, recibe la entrada ponderada de la capa anterior.

  1. El primer nodo son los valores de entrada.
  2. La neurona se descompone en una parte de entrada y una función de activación. La parte izquierda recibe toda la entrada de la capa anterior. La parte derecha es la suma de la entrada que pasa a la función de activación.
  3. Valor de salida calculado a partir de las capas ocultas y utilizado para realizar una predicción. En el caso de la clasificación, es igual al número de clases. En el caso de la regresión, se predice un único valor.

Función de activación

La función de activación de un nodo define la salida a partir de un conjunto de entradas. Se necesita una función de activación para que la red aprenda patrones no lineales. Una función de activación común es ReLU (Unidad Lineal Rectificada). Esta función devuelve cero para todos los valores negativos.

Las otras funciones de activación son:

  • Lineal por partes
  • Sigmoideo
  • tanh
  • ReLU con fugas

El gráfico que aparece a continuación muestra por qué se describe la función ReLU de esa manera: la curva es plana en cero para cada entrada negativa y luego aumenta linealmente.

Gráfico de la función de activación ReLU R(z) = max(0, z), plana en cero para entradas negativas y lineal para entradas positivas.

La decisión crítica que se debe tomar al construir una red neuronal es:

  • ¿Cuántas capas en la red neuronal?
  • ¿Cuántas unidades ocultas para cada capa?

Las redes neuronales con muchas capas y unidades ocultas pueden aprender una representación compleja de los datos, pero hacen que el cálculo de la red sea muy costoso.

Función de pérdida

Una vez que haya definido las capas ocultas y la función de activación, debe especificar la función de pérdida y el optimizador.

Para la clasificación binaria, es práctica común utilizar una función de pérdida de entropía cruzada binaria. regresión lineal, se utiliza el error cuadrático medio.

La función de pérdida es una métrica importante para estimar el rendimiento del optimizador. Durante el entrenamiento, esta métrica se minimizará. Debe seleccionar esta cantidad con cuidado según el tipo de problema que esté enfrentando.

Optimizador

La función de pérdida mide el rendimiento del modelo. El optimizador ayuda a mejorar los pesos de la red para reducir la pérdida. Existen diferentes optimizadores, pero el más común es el descenso de gradiente estocástico.

Los optimizadores convencionales son:

  • Momentum optimización
  • Gradiente acelerado de Nesterov
  • adagrad
  • optimización de adán

ArchiLa arquitectura por sí sola no garantiza un modelo utilizable.

Limitaciones de la red neuronal

A continuación se detallan las limitaciones de una red neuronal:

Sobreajuste

Un problema común en las redes neuronales complejas es la dificultad para generalizar a datos desconocidos. Una red neuronal con muchos pesos puede identificar detalles específicos en el conjunto de entrenamiento con gran precisión, pero esto suele provocar sobreajuste. Si los datos están desequilibrados dentro de los grupos (es decir, si no hay suficientes datos disponibles en algunos grupos), la red aprenderá muy bien durante el entrenamiento, pero no tendrá la capacidad de generalizar dichos patrones a datos nunca antes vistos.

Hay una compensación en aprendizaje automático entre optimización y generalización.

  • Optimizar un modelo requiere encontrar los mejores parámetros que minimicen la pérdida del conjunto de entrenamiento.
  • La generalización, sin embargo, indica cómo se comporta el modelo ante datos invisibles.

Para evitar que el modelo capture detalles específicos o patrones no deseados de los datos de entrenamiento, se pueden utilizar diferentes técnicas. El mejor método consiste en contar con un conjunto de datos equilibrado y con una cantidad suficiente de datos. El arte de reducir el sobreajuste se denomina regularización. Las tres técnicas que se describen a continuación son los puntos de partida convencionales.

Tecnologia Lo que limita Configuración típica en este tutorial
Tamaño de la red El número de capas y unidades ocultas Dos capas ocultas, de 300 y 100 unidades.
Regularización de peso L1/L2 La magnitud de los coeficientes de ponderación l1_regularization_strength y l2_regularization_strength de 0.01
Punteras Porcentaje de unidades desactivadas por etapa de entrenamiento abandono de 0.3

Tamaño de la red

Se sabe que una red neuronal con demasiadas capas y unidades ocultas es muy sofisticada. Una forma sencilla de reducir la complejidad del modelo es disminuir su tamaño. No existe una única práctica óptima para definir el número de capas. Es necesario comenzar con un número reducido de capas e ir aumentando el tamaño hasta que el modelo se sobreajuste.

Regularización de peso

Una técnica estándar para prevenir el sobreajuste consiste en añadir restricciones a los pesos de la red. La restricción obliga a que los pesos de la red tomen solo valores pequeños. La restricción se añade a la función de pérdida del error. Existen dos tipos de regularización:

  • L1 (Lazo): El coste es proporcional al valor absoluto de los coeficientes de ponderación.
  • L2 (Cresta): El coste es proporcional al cuadrado del valor de los coeficientes de ponderación.

Punteras

Dropout es una técnica peculiar pero útil. Una red neuronal con dropout implica que algunas unidades se desactivan aleatoriamente durante el entrenamiento, de modo que su señal de salida se anula. Imaginemos un array de pesos [0.1, 1.7, 0.7, -0.9]. Si la red neuronal incorpora dropout, se convertirá en [0.1, 0, 0, -0.9] con ceros distribuidos aleatoriamente. El parámetro que controla el dropout es la tasa de dropout. Esta tasa define cuántas unidades se desactivan. Es común encontrar una tasa entre 0.2 y 0.5.

Un pequeño ejemplo interactivo facilita la visualización del ciclo de entrenamiento.

Ejemplo de red neuronal en TensorFlow

Aquí se muestra un ejemplo de red neuronal artificial en acción, que ilustra cómo funciona una red neuronal en un problema de clasificación típico. Hay dos entradas, x1 y x2, cada una con un valor aleatorio. La salida es una clase binaria. El objetivo es clasificar la etiqueta en función de estas dos características. Para llevar a cabo esta tarea, la arquitectura de la red neuronal se define de la siguiente manera:

  • Dos capas ocultas
  • La primera capa tiene cuatro neuronas completamente conectadas.
  • La segunda capa tiene dos neuronas completamente conectadas.
  • La función de activación es ReLU.
  • Agregue una regularización L2 con una tasa de aprendizaje de 0.003

La red optimizará los pesos durante 180 épocas con un tamaño de lote de 10. En la animación de ejemplo de la red neuronal artificial que se muestra a continuación, puede ver cómo evolucionan los pesos con el tiempo y cómo la red mejora el mapa de clasificación.ping.

Animación de una red neuronal basada en navegador a medida que sus pesos cambian a lo largo de las épocas de entrenamiento.

En primer lugar, la red asigna valores aleatorios a todos los pesos.

  • Con los pesos aleatorios, es decir, sin optimización, la pérdida de salida es de 0.453. La imagen a continuación representa la red con diferentes colores.
  • En general, el color naranja representa los valores negativos mientras que los colores azules muestran los valores positivos.
  • Los puntos de datos tienen la misma representación: los azules son las etiquetas positivas y los naranjas las etiquetas negativas.

Entorno de pruebas del navegador en la primera iteración con pesos aleatorios, un peso de -0.43 y una pérdida de prueba de 0.453.

Dentro de la segunda capa oculta, las líneas están coloreadas según el signo de los pesos. Las líneas naranjas representan pesos negativos y las azules, pesos positivos.

Como puede ver, en el mapa de salidapingLa red está cometiendo bastantes errores. Ahora veamos cómo se comporta la red después de la optimización.

La imagen del ejemplo de red neuronal artificial (RNA) que se muestra a continuación ilustra los resultados de la red optimizada. En primer lugar, se observa que la red ha aprendido correctamente a clasificar los puntos de datos. Comparándola con la imagen anterior, el peso inicial era de -0.43, mientras que tras la optimización se obtiene un peso de -0.95.

Cuatro paneles del área de juegos que muestran los pesos finales, con líneas azules para los pesos positivos y los puntos de datos correctamente clasificados.

La idea se puede generalizar para redes con más capas ocultas y neuronas. Puedes experimentar tú mismo con la configuración en el Zona de juegos TensorFlow.

El siguiente tutorial desarrolla la misma idea mediante código, utilizando un conjunto de datos reales.

Cómo entrenar una red neuronal con TensorFlow

Aquí está el proceso paso a paso sobre cómo entrenar una red neuronal con TensorFlow Red neuronal artificial (RNA) que utiliza el estimador DNNClassifier de la API.

Usaremos el conjunto de datos MNIST para entrenar su primera red neuronal. Entrenando una red neuronal con TensorFlow No es muy complicado. El paso de preprocesamiento es exactamente igual que en los tutoriales anteriores. Procederás de la siguiente manera:

  1. Importar los datos
  2. Transforma los datos
  3. Construir el tensor
  4. Construye el modelo
  5. Entrenar y evaluar el modelo.
  6. Mejorar el modelo

Nota de versión: El código de este tutorial está dirigido a la API Estimator de TensorFlow 1.x. La versión final del paquete tf-estimator se incluyó con TensorFlow 2.15, y tf.estimator se eliminó en TensorFlow 2.16. Para ejecutar estos pasos en una versión actual, utilice TensorFlow 2.15 o reconstruya la misma red de dos capas con tf.keras.layers.Dense y model.fit().

Paso 1) Importar los datos

En primer lugar, necesitas importar la biblioteca necesaria. Puedes importar el conjunto de datos MNIST usando scikit-aprender como se muestra en el ejemplo de red neuronal de TensorFlow a continuación.

El conjunto de datos MNIST es el más utilizado para probar nuevas técnicas o algoritmos. Se trata de una colección de imágenes de 28 × 28 píxeles, cada una con un dígito manuscrito del 0 al 9. Un grupo de redes neuronales convolucionales profundas entrenadas con distorsiones elásticas logró reducir el error de la prueba al 0.27 %.

import numpy as np
import tensorflow as tf
np.random.seed(1337)

El tutorial original descargó manualmente los archivos MNIST e indicó a fetch_mldata que apuntara a esa carpeta.

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)

Nota sobre la API: mldata.org ya no está en línea y fetch_mldata se eliminó en scikit-learn 0.22. En una instalación actual, reemplace la llamada anterior con fetch_openml('mnist_784', version=1), que descarga los mismos 70 000 dígitos y expone los mismos datos y atributos de destino.

Después, se dividen los datos y se obtiene la forma de ambos conjuntos de datos.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )

Paso 2) Transformar los datos

En el tutorial anterior, aprendiste que necesitas transformar los datos para limitar el efecto de los valores atípicos. En este tutorial de Redes Neuronales, transformarás los datos usando el escalador min-max. La fórmula es:

(X-min_x)/(max_x - min_x)

scikit-learn ya tiene una función para eso: MinMaxScaler()

## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))

Paso 3) Construye el tensor

Ahora ya estás familiarizado con la forma de crear tensores En TensorFlow, puedes convertir el conjunto de entrenamiento en una columna numérica.

feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]

Paso 4) Construye el modelo

La arquitectura de la red neuronal consta de dos capas ocultas: la primera con 300 unidades y la segunda con 100. Estos valores se basan en la experiencia, no en una fórmula. Puedes ajustarlos y observar cómo influyen en la precisión de la red.

Para construir el modelo, se utiliza el estimador DNNClassifier. Es necesario establecer el número de clases en 10, ya que el conjunto de entrenamiento contiene diez clases. La sintaxis del objeto estimador ya está familiarizada. Los argumentos feature_columns, n_classes y model_dir son exactamente los mismos que en el tutorial anterior. El argumento hidden_units es nuevo: controla tanto el número de capas como la cantidad de nodos que cada capa conecta a la red neuronal. En el código siguiente, hay dos capas ocultas: la primera conecta 300 nodos y la segunda 100.

Para construir el estimador, utilice tf.estimator.DNNClassifier con los siguientes parámetros:

  • columnas de características: Defina las columnas que se utilizarán en la red.
  • unidades ocultas: Defina el número de neuronas ocultas
  • n_clases: Defina el número de clases a predecir
  • directorio_modelo: Defina la ruta de TensorTablero
estimator = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100], 
    n_classes=10, 
    model_dir = '/train/DNN')

Paso 5) Entrenar y evaluar el modelo.

Puedes utilizar la función de entrada de NumPy para entrenar el modelo y evaluarlo.

# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=50,
    shuffle=False,
    num_epochs=None)
estimator.train(input_fn = train_input,steps=1000) 
eval_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test, 
    shuffle=False,
    batch_size=X_test_scaled.shape[0],
    num_epochs=1)
estimator.evaluate(eval_input,steps=None) 

Salida:

{'accuracy': 0.9637143,
 'average_loss': 0.12014342,
 'loss': 1682.0079,
 'global_step': 1000}

La arquitectura actual da como resultado una precisión en el conjunto de evaluación de aproximadamente el 96 por ciento.

Paso 6) Mejorar el modelo

Puede intentar mejorar el modelo agregando parámetros de regularización.

Aquí, el estimador utiliza un optimizador Proximal AdaGrad con una tasa de abandono de 0.3 y una intensidad L1 y L2 de 0.01. En una red neuronal de TensorFlow, se accede al optimizador mediante el objeto `train` seguido del nombre del optimizador. TensorFlow incluye una API integrada para el optimizador Proximal AdaGrad.

Para agregar regularización a la red neuronal profunda, puede usar tf.train.ProximalAdagradOptimizer con los siguientes parámetros:

  • Tasa de aprendizaje: tasa de aprendizaje
  • Regularización L1: l1_regularization_strength
  • Regularización L2: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100],
    dropout=0.3, 
    n_classes = 10,
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.01,
      l1_regularization_strength=0.01, 
      l2_regularization_strength=0.01
    ),
    model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000) 
estimator_imp.evaluate(eval_input,steps=None) 

Salida:

{'accuracy': 0.95057142,
 'average_loss': 0.17318928,
 'loss': 2424.6499,
 'global_step': 2000}

Los valores elegidos para reducir el sobreajuste no mejoraron la precisión del modelo. Tu primer modelo tenía una precisión del 96%, mientras que el modelo con el regularizador L2 tiene una precisión del 95%. Puedes probar con diferentes valores y ver cómo afectan a la precisión.

Preguntas Frecuentes

No existe una fórmula fija. Como regla general, las neuronas ocultas deben tener un tamaño intermedio entre la entrada y la salida, o cerca de dos tercios de la capa de entrada más la de salida. La mayoría de los problemas tabulares requieren una o dos capas ocultas; comience con un número pequeño y aumente gradualmente hasta que el modelo se sobreajuste.

No es como está escrito. tf.estimator se eliminó en TensorFlow 2.16 y tf.estimator.inputs.numpy_input_fn ya no existe. Debes fijar TensorFlow 2.15 o reconstruir la red con capas tf.keras.layers.Dense de 300 y 100 unidades y entrenarla usando model.fit().

Las bibliotecas de búsqueda y ajuste automatizado de arquitecturas neuronales analizan en paralelo el número de capas, sus anchos, las tasas de aprendizaje y el abandono (dropout), para luego clasificar a los candidatos según su puntuación de validación. Sustituyen el método manual de prueba y error por comparaciones métricas, si bien un ingeniero sigue definiendo el presupuesto computacional y la métrica objetivo.

Sí. Copiloto de GitHub Completa automáticamente el código repetitivo, como las canalizaciones de entrada, las pilas de capas y los bucles de evaluación, a partir de un comentario breve. Considere su resultado como un borrador: puede sugerir API eliminadas, como fetch_mldata, por lo que verifique cada llamada con la documentación actual antes de ejecutarla.

mldata.org cerró y scikit-aprender Se eliminó fetch_mldata en la versión 0.22. En su lugar, utilice fetch_openml('mnist_784', version=1). Descarga los mismos 70 000 dígitos escritos a mano y devuelve los datos y los atributos de destino, por lo que el resto de este tutorial permanece sin cambios.

Una ANN conecta cada unidad de una capa con cada unidad de la siguiente, lo cual es adecuado para datos tabulares. red convolucional comparte pequeños filtros en una imagen, mientras que un red recurrente transmite el estado a lo largo de una secuencia.

El modelo base no presentaba un sobreajuste significativo, por lo que la eliminación de datos (dropout) de 0.3, junto con las penalizaciones L1 y L2 de 0.01, redujo considerablemente la capacidad útil. La precisión disminuyó de 0.9637143 a 0.95057142. La regularización solo resulta útil cuando la diferencia entre las puntuaciones de entrenamiento y prueba es amplia.

Entre sus aplicaciones más comunes en la producción se incluyen el reconocimiento de imágenes y voz, la comprensión del lenguaje natural, la previsión de la demanda, la calificación crediticia, la detección de fraudes y la clasificación de recomendaciones. Su principal ventaja reside en aprender relaciones no lineales directamente a partir de datos brutos; su desventaja radica en su limitada capacidad de interpretación en comparación con los modelos lineales o basados ​​en árboles.

Resumir este post con: