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.
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.
Elige una respuesta y tu grado de seguridad.
Responde para desbloquear el experimento.
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.
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.
Descargar el notebook (.ipynb). Ábrelo en Jupyter o súbelo a Google Colab; descarga por sí solo los datos que falten.
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.
¿Te ha sido útil?
¡Gracias! Nos ayuda a mejorar.
Profundiza en el Atlas
Entradas de la enciclopedia sobre las ideas de esta lección: