ML Atlas

Machine learning desde cero · Lección 7.1 · 32 de 33 lecciones listas · 12 min

Redes neuronales: muchas unidades simples juntas

En pocas palabras

Una red neuronal apila unidades simples que trazan una recta y la doblan. Con más unidades ocultas, las regiones de decisión se curvan alrededor de los iris.

Calentamiento Dos preguntas de lecciones anteriores. Un minuto, y no bloquea la lección.
De la lección 5.6: ¿Qué modelo y cuándo? Verdadero o falso: «un modelo con una media 0,3 puntos más alta es mejor».

Ver la respuesta

Respuesta correcta: Falso: con esa diferencia las particiones se reparten casi a partes iguales

En los tumores la SVM logra un 94,2% y el gradient boosting un 93,9%. La SVM acierta más en 10 particiones, el boosting en 7, y en 3 hay empate.

De la lección 5.5: Máquinas de vectores de soporte y núcleos ¿Qué flores fijan la frontera de una SVM lineal?

Ver la respuesta

Respuesta correcta: Los vectores de soporte: flores en el borde, dentro o más allá

Las demás flores podrían quitarse y la frontera no cambiaría. Con C = 100 la sostienen 4 flores de 70.

La regresión logística de la lección 5 solo puede trazar una frontera recta. Los árboles solo pueden trazar cajas. Pero ¿y si las clases se enroscan unas alrededor de otras? Podrías intentar inventar a mano la curva adecuada para cada problema, o podrías construir un modelo con piezas tan simples que cada una solo sabe trazar una recta, y dejar que la combinación trace cualquier cosa. Esa es la apuesta de las redes neuronales. Pruébalo tú mismo antes de leer la explicación.

Predice y comprueba Subes el número de neuronas ocultas de 2 a 32. ¿Qué pasa con la exactitud en el conjunto de prueba?
¿Qué tan seguro estás?

Experimento interactivo

Este experimento interactivo funciona en un navegador con JavaScript activado. El texto que lo rodea describe lo que muestra.

Ver la respuesta

Respuesta correcta: No sube, e incluso puede bajar, aunque en entrenamiento mejora

Dos neuronas dan un 81,3 % en prueba y 32 neuronas un 70,7 %, aunque la exactitud de entrenamiento sube del 81,3 % al 94,7 %. La red mayor se ajusta a detalles casuales de las 75 flores de entrenamiento. Dos de las tres especies se solapan en estas dos medidas, así que una separación perfecta no existe de todos modos.

Prueba esto

  • Pon el control de unidades ocultas en su valor más pequeño y pulsa Entrenar. Mira las regiones de decisión: ¿cuántos bordes rectos ves?
  • Aumenta el número de unidades ocultas y vuelve a pulsar Entrenar. Observa cómo se curvan las fronteras y compara la exactitud.
  • Pon el control de unidades ocultas en su valor más grande y entrena. ¿Las regiones empiezan a curvarse alrededor de flores concretas? Pregúntate si una flor nueva que cayera en uno de esos bolsillos pertenecería de verdad a esa especie.
  • Mira las flores donde dos especies se solapan. ¿Puede alguna frontera separarlas usando solo estas dos medidas?

La idea en pocas palabras

Una red neuronal está hecha de pequeñas unidades llamadas neuronas. Cada neurona hace algo que ya conocemos: toma una suma ponderada de sus entradas, añade una ordenada en el origen y pasa el resultado por una función sencilla que lo dobla, llamada función de activación. Una sola neurona es casi una regresión logística: puede separar el plano con una recta.

Las neuronas se organizan en capas. Las entradas (aquí, dos medidas de la flor) alimentan una capa oculta de neuronas, cada una de las cuales traza su propia recta e informa de a qué distancia, y de qué lado, está un punto. La capa de salida combina esos informes en la decisión final. Como cada neurona oculta dobla su señal, al combinarlas se obtienen fronteras con esquinas y curvas.

Imagina un equipo de vigías muy simples que custodian un campo. Cada vigía solo puede decir «el intruso está a mi izquierda» o «a mi derecha» de una única valla recta. Un vigía solo no sirve de mucho. Pero una supervisora que escucha a muchos vigías, cada uno con su valla en un lugar distinto, puede delimitar regiones de casi cualquier forma.

Por qué funciona

Una neurona calcula

salida = f(w · x + b)

donde x es la lista de entradas, w los pesos, b la ordenada en el origen y f la activación. Sin f, apilar capas no serviría de nada: una suma ponderada de sumas ponderadas sigue siendo una sola suma ponderada, así que toda la red trazaría una única recta. La activación es el pliegue que permanece. Con ella, cada neurona oculta añade un doblez, y suficientes dobleces pueden aproximar cualquier frontera razonable. Más unidades ocultas significan más dobleces posibles: más flexibilidad, que, como enseñó la lección 7, tiene dos filos.

Los pesos se aprenden con las herramientas de las lecciones 4 y 5. La red hace predicciones, la pérdida logarítmica mide cuánto se equivocan y el descenso de gradiente empuja cada peso cuesta abajo. El único truco nuevo es cómo encontrar el gradiente de los pesos que están en lo profundo de la red: un algoritmo llamado retropropagación (backpropagation) aplica la regla de la cadena del cálculo hacia atrás desde la salida, capa por capa, y le dice a cada peso cuánto contribuyó al error.

El ejemplo de esta lección es el conjunto de datos Iris: 150 flores de tres especies, 50 de cada una, que se hizo famoso con un artículo de Ronald Fisher de 1936. Tomamos dos de las cuatro medidas, así que cada flor es un punto en un plano, y la red entrenada asigna una especie predicha a cada lugar de ese plano.

La idea es antigua —Frank Rosenblatt construyó el perceptrón, una sola neurona entrenable, en 1958—, pero las redes solo se impusieron cuando los datos, la potencia de cálculo y los trucos de entrenamiento crecieron lo suficiente para entrenar muchas capas.

Error frecuente

«Neuronal» sugiere un cerebro, y esa sugerencia confunde. Una neurona artificial es una suma ponderada con un doblez, no un modelo de una célula biológica, y una red no entiende de flores; ajusta una función a unos ejemplos. El error práctico es suponer que más grande siempre es mejor. Una red con muchas unidades ocultas y un conjunto de datos pequeño puede memorizar exactamente igual que un árbol profundo o un polinomio de grado alto. Su tamaño hay que elegirlo con datos de validación, y su entrenamiento hay que vigilarlo en busca de la misma diferencia entre entrenamiento y prueba que vimos en la lección 7.

Apila suficientes capas, aliméntalas con suficiente texto, y una tarea de predicción se convierte en algo que escribe. En la última lección vemos cómo una red aprende el lenguaje adivinando la siguiente palabra.

¿Quieres profundizar? El curso de redes neuronales empieza por una sola neurona (PL).

Test

Tres preguntas para comprobar lo aprendido. Elige una respuesta o despliega la solución bajo cada pregunta. Con el teclado: las flechas eligen, Enter o Espacio confirma.

1. ¿Por qué una red neuronal necesita una función de activación?
Ver la respuesta

Respuesta correcta: Sin ella, toda pila de capas equivale a una sola suma ponderada: una recta

La activación dobla la señal; sin dobleces, las capas no añaden poder expresivo más allá de un único modelo lineal.

2. ¿Qué consigues al añadir unidades ocultas?
Ver la respuesta

Respuesta correcta: Más flexibilidad y fronteras más complejas, pero también más riesgo de memorizar

Más unidades significan más dobleces posibles, que pueden captar estructura real o sobreajustar, según los datos.

3. ¿Qué calcula la retropropagación?
Ver la respuesta

Respuesta correcta: Cuánto aportó cada peso al error para que el gradiente lo ajuste

La retropropagación aplica la regla de la cadena desde la salida hacia atrás para obtener el gradiente de cada peso.

Ideas clave

  • Una neurona es una suma ponderada más una función de activación que dobla la señal.
  • Una capa oculta combina muchas rectas simples en fronteras curvas.
  • Los pesos se aprenden con descenso de gradiente; la retropropagación da el gradiente para cada capa.
  • Más unidades ocultas significan más flexibilidad, que hay que controlar con datos de validación.

Más a fondo: fórmula, código, práctica

Las matemáticas

Una neurona calcula a = f(w·x + b), donde x contiene las entradas, w los pesos, b la ordenada y f la activación. Una capa oculta con h neuronas es lo mismo en forma matricial: a = f(W₁x + b₁). La capa de salida calcula entonces ŷ = softmax(W₂a + b₂).

  • Sin f, las capas colapsan: W₂(W₁x + b₁) + b₂ = (W₂W₁)x + (W₂b₁ + b₂), que es una sola aplicación lineal. La activación es lo que hace útil la profundidad.
  • El entrenamiento minimiza la pérdida logarítmica L = −(1/n) Σ log ŷᵢ,yᵢ, donde ŷᵢ,yᵢ es la probabilidad que el modelo dio a la especie verdadera de la flor i.
  • La retropropagación es la regla de la cadena aplicada desde la salida hacia atrás: ∂L/∂W₁ = ∂L/∂ŷ · ∂ŷ/∂a · ∂a/∂W₁.
  • El descenso de gradiente actualiza entonces cada peso: w ← w − η · ∂L/∂w, donde η es la tasa de aprendizaje.
En código (Python)

Una red pequeña con los datos del lab: dos medidas del sépalo, la mitad de las flores para entrenamiento (75), entradas estandarizadas, neuronas tanh, 2 y 32 neuronas ocultas. Es el entrenador de scikit-learn, no el del lab:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_iris(return_X_y=True)
X = X[:, :2]  # largo y ancho del sépalo, como en el lab
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.5, stratify=y, random_state=1)
for h in (2, 32):
    net = make_pipeline(StandardScaler(), MLPClassifier(hidden_layer_sizes=(h,), activation="tanh", solver="lbfgs", max_iter=5000, random_state=0))
    net.fit(X_tr, y_tr)
    print(f"{h:2d} hidden units: train {net.score(X_tr, y_tr):.1%}, test {net.score(X_te, y_te):.1%}")

Resultado

 2 hidden units: train 84.0%, test 74.7%
32 hidden units: train 96.0%, test 66.7%

El patrón es el de la lección: la red más grande ajusta mejor las flores de entrenamiento y rinde peor con las de prueba. El entrenador propio del lab (descenso de gradiente con momento) da 81,3 % y 70,7 % en el conjunto de prueba para 2 y 32 neuronas, así que los números difieren pero el patrón no.

Para profesionales
  • Estandariza las entradas antes de entrenar (resta la media del entrenamiento, divide por la desviación estándar del entrenamiento). Las variables sin escalar hacen que el descenso de gradiente sea lento o inestable.
  • Elige el número de neuronas ocultas con datos de validación, no con la exactitud de entrenamiento. Una red más grande casi siempre ajusta mejor el conjunto de entrenamiento (96,0 % frente a 84,0 % arriba).
  • Los conjuntos de datos pequeños, como 75 flores de entrenamiento, son fáciles de memorizar. Prueba una red más pequeña, decaimiento de pesos o parada temprana antes de añadir neuronas.
  • Pesos iniciales aleatorios distintos dan redes distintas. Para una comparación justa, fija las semillas que uses y compara con varias de ellas.
  • Con datos en forma de tabla, los árboles con boosting de gradiente suelen ser una línea base más fuerte. Pruébalos antes de recurrir a una red.

Profundiza en el Atlas

Entradas de la enciclopedia sobre las ideas de esta lección: