Evolución de las arquitecturas neuronales
La historia de las redes neuronales no es un ascenso fluido. Es una serie de avances separados por inviernos, donde cada nueva arquitectura resolvió una limitación específica de la anterior y fue eventualmente retirada cuando sus propios límites se convirtieron en el cuello de botella. Vale la pena entender el linaje si quieres saber por qué las arquitecturas modernas tienen el aspecto que tienen y hacia dónde se dirigirá probablemente el campo a continuación.
El Perceptrón (1958)
El Perceptrón de Frank Rosenblatt fue la primera red neuronal entrenable. Una unidad lineal simple: suma ponderada de entradas, un umbral y una salida de 0 o 1.
output = 1 if (w1*x1 + w2*x2 + ... + wn*xn + bias) > 0 else 0
El Perceptrón puede aprender funciones linealmente separables como AND y OR. Minsky y Papert demostraron en 1969 que no puede aprender XOR, la cual requiere un límite de decisión no lineal. Ese resultado, sumado a las promesas excesivas de los primeros investigadores de IA, dio inicio al primer invierno de la IA.
Qué resolvió: las máquinas podían aprender de los datos. Por qué fue retirado: no puede representar funciones no lineales. Una sola capa es un techo infranqueable.
Perceptrones Multicapa (1986)
La solución para XOR era obvia en retrospectiva: apilar más capas. Un perceptrón multicapa (MLP) con al menos una capa oculta y funciones de activación no lineales es un aproximador universal de funciones. El resultado de Cybenko en 1989 afirma que un MLP con suficientes neuronas ocultas puede aproximar cualquier función continua con una precisión arbitraria.
El avance práctico fue el backpropagation, popularizado por Rumelhart, Hinton y Williams en 1986. Al aplicar la regla de la cadena capa por capa, los gradientes fluyen hacia atrás a través de la red, haciendo que las arquitecturas profundas sean entrenables.
Decir "entrenable" es fácil y es fácil de subestimar, así que así es como se ve en realidad. Este es un MLP de dos capas (24 unidades ocultas, tanh) aprendiendo una curva no lineal desde cero — backprop en numpy puro, sin librerías:
Los guiones grises son la función real, los puntos tenues son muestras de entrenamiento con ruido y la línea cian es la predicción de la red en todo el rango de entrada. La época 0 es casi plana: una red aleatoria produce resultados sin sentido. En cada época, el backprop empuja cada peso hacia abajo en el gradiente de pérdida, y la predicción se dobla para ajustarse. Para la época 500, el error cuadrático medio ha caído de 0.6 a menos de 0.02. Esa es la idea principal: la regla de la cadena convierte el "ajustar esta función arbitraria" en una optimización resoluble.
# Un MLP simple en términos modernos
import torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 128),
nn.ReLU(),
nn.Linear(128, 10)
)Qué resolvió: límites de decisión no lineales, aproximación de funciones arbitrarias. Por qué fue retirado: los MLPs tratan cada entrada como un vector plano. No tienen noción de estructura espacial para imágenes, ni noción de estructura secuencial para el lenguaje. Un MLP que procesa una imagen de 256x256 necesita 196,608 pesos de entrada por cada neurona de la primera capa. Es ineficiente y propenso al overfitting.
Redes Neuronales Convolucionales (1989-2012)
El trabajo en CNN de Yann LeCun, comenzando con LeNet para el reconocimiento de dígitos manuscritos, introdujo dos ideas clave: conectividad local y peso compartido (weight sharing). Un filtro convolucional se desliza por la entrada, aplicando los mismos pesos en cada posición. Eso codifica la premisa de que los patrones espaciales —bordes, texturas, formas— son invariantes a la traslación.
La arquitectura apila capas convolucionales (extracción de características) con capas de pooling (reducción de resolución o downsampling) y capas totalmente conectadas (clasificación). Cada capa aprende características más abstractas a medida que se profundiza: bordes en las primeras capas, texturas en las capas intermedias y partes de objetos en las capas profundas.
La revolución de las CNN comenzó realmente en 2012 cuando AlexNet (Krizhevsky, Sutskever, Hinton) ganó ImageNet por un margen enorme. AlexNet no era arquitectónicamente novedosa —tres factores convergieron: datos etiquetados a gran escala (ImageNet), entrenamiento en GPU y activaciones ReLU (que mitigan el desvanecimiento del gradiente mejor que la sigmoide).
Las arquitecturas que siguieron:
- VGGNet (2014): demostró que la profundidad importa. Usó solo convoluciones de 3x3 apiladas profundamente.
- GoogLeNet/Inception (2014): rutas paralelas con diferentes tamaños de filtro.
- ResNet (2015): resolvió el problema de degradación en redes muy profundas mediante conexiones de salto (skip connections).
ResNet merece un análisis más detallado. Intuitivamente, una red de 56 capas debería funcionar al menos tan bien como una de 20 capas, ya que podría simplemente aprender mapeos de identidad para las capas adicionales. En la práctica, las redes simples más profundas funcionaban peor debido a problemas de optimización. Las conexiones residuales permiten que la red aprenda F(x) + x en lugar de F(x), lo cual es mucho más fácil de optimizar porque la ruta de identidad mantiene el flujo de los gradientes.
class ResidualBlock(nn.Module):
def __init__(self, channels):
super().__init__()
self.conv1 = nn.Conv2d(channels, channels, 3, padding=1)
self.bn1 = nn.BatchNorm2d(channels)
self.conv2 = nn.Conv2d(channels, channels, 3, padding=1)
self.bn2 = nn.BatchNorm2d(channels)
def forward(self, x):
residual = x
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
return F.relu(out + residual) # La conexión de salto (skip connection)Qué resolvieron las CNN: procesamiento eficiente de datos espaciales con invarianza a la traslación. Por qué no fueron suficientes: las CNN son excelentes para datos en cuadrículas de tamaño fijo, pero resultan incómodas para secuencias de longitud variable. Tienen campos receptivos limitados y, aunque se pueden apilar capas para ampliarlos, capturar dependencias de largo alcance en texto requiere redes impracticablemente profundas.
RNNs y LSTMs (años 90-2017)
Las Redes Neuronales Recurrentes (RNN) procesan secuencias manteniendo un estado oculto (hidden state) que se actualiza en cada paso de tiempo (timestep):
h_t = tanh(W_hh * h_{{t-1}} + W_xh * x_t + b)
Eso otorga a las RNN un mecanismo natural para secuencias de longitud variable. Impulsaron los primeros éxitos en traducción automática, reconocimiento de voz y modelado de lenguaje.
El problema es el desvanecimiento del gradiente (vanishing gradient). Al hacer backpropagation a través de muchos timesteps, los gradientes se reducen exponencialmente, haciendo que las dependencias de largo alcance sean imposibles de aprender. La frase "El gato, que se sentó en la alfombra junto al perro que le ladró al cartero, estaba durmiendo" requiere conectar "gato" con "estaba" a través de muchos tokens intermedios.
La red de Memoria a Largo Corto Plazo (LSTM), de Hochreiter y Schmidhuber en 1997, solucionó esto con una celda con compuertas (gates). Tres compuertas (entrada, olvido y salida) controlan el flujo de información, y un estado de celda actúa como una autopista para los gradientes a través de muchos timesteps sin degradación.
La GRU (Gated Recurrent Unit) de Cho et al. en 2014 simplificó la LSTM a dos compuertas (reset y update) con un rendimiento comparable y menos parámetros.
Durante años, las LSTMs encoder-decoder con atención (Bahdanau et al., 2014) fueron el estado del arte en traducción automática. El mecanismo de atención allí fue el precursor directo del Transformer: en lugar de forzar toda la información de la fuente a través de un estado oculto de tamaño fijo, el decodificador podía prestar atención a diferentes partes de la entrada en cada paso de generación.
Qué resolvieron las RNNs/LSTMs: procesamiento de secuencias de longitud variable con memoria. Por qué fueron retiradas: el procesamiento secuencial impide la paralelización. Incluso con compuertas, las dependencias de muy largo alcance siguen siendo difíciles. El entrenamiento es lento en comparación con lo que las arquitecturas paralelizables pueden hacer en el hardware moderno.
El Transformer (2017)
El artículo "Attention Is All You Need" de Vaswani et al. eliminó la recurrencia por completo. El self-attention permite que cada token atienda a cualquier otro token directamente, en una sola operación totalmente paralelizable en GPUs.
La idea clave fue que la atención, que antes se añadía a las RNN, era suficiente por sí sola. Con codificación posicional (para el orden de la secuencia), capas feed-forward, conexiones residuales y normalización de capas (layer normalization), el Transformer igualó o superó el rendimiento de las LSTM en traducción, entrenándose mucho más rápido.
El artículo original reportó 3.5 días en 8 GPUs para su modelo base. Un modelo LSTM equivalente habría tardado semanas.
Qué resolvió el Transformer: modelado de secuencias paralelizable con dependencias directas de largo alcance. Su límite: complejidad cuadrática en la longitud de la secuencia para el self-attention.
La era moderna: escalando Transformers
Después de 2017, el progreso provino menos de la novedad arquitectónica y más de la escala.
BERT (2018) demostró que el preentrenamiento de un codificador Transformer en texto masivo no etiquetado (masked language modeling) producía representaciones que se transferían poderosamente a tareas posteriores. El ajuste fino (fine-tuning) de BERT superó a las arquitecturas específicas de cada tarea en todos los ámbitos.
GPT-2 (2019) y GPT-3 (2020) mostraron que los Transformers de solo decodificador, entrenados autoregresivamente con suficientes datos, desarrollan capacidades emergentes. Los 175 mil millones de parámetros de GPT-3 podían realizar tareas para las que nunca fue entrenado explícitamente, solo a partir de ejemplos en el contexto (in-context) dentro del prompt.
Las leyes de escalado (scaling laws) (Kaplan et al., 2020; Hoffmann et al., 2022) formalizaron la relación: el rendimiento del modelo mejora como una función de ley de potencia del cómputo, los datos y los parámetros. El artículo de Chinchilla mostró que la mayoría de los modelos estaban subentrenados en relación con su tamaño, recomendando aproximadamente 20 tokens por parámetro.
Refinamientos recientes al Transformer:
- RoPE (Rotary Position Embedding): mejor codificación de posición que se generaliza a longitudes de secuencia no vistas.
- Activación SwiGLU: supera a ReLU en las capas feed-forward.
- Grouped-query attention (GQA): reduce la memoria del KV cache durante la inferencia.
- FlashAttention: algoritmo optimizado para hardware que reduce la memoria y el cómputo para la atención.
- Mixture of Experts (MoE): parámetros activados escasamente que escalan la capacidad sin escalar proporcionalmente el cómputo.
El patrón
Al observar la línea de tiempo, el patrón es claro.
Cada generación de arquitectura codificó un sesgo inductivo (inductive bias) más fuerte: los MLPs no asumían nada sobre la estructura de entrada, las CNN asumían localidad espacial, las RNN asumían orden secuencial. El Transformer ganó asumiendo menos: el self-attention hace suposiciones estructurales mínimas y permite que el modelo aprenda a qué atender a partir de los datos.
La tendencia es hacia arquitecturas más simples, generales y escalables. El costo computacional de la generalidad se paga con escala: se necesitan más datos y más cómputo para aprender la estructura que las arquitecturas anteriores incorporaban como suposiciones. Con suficiente escala, la estructura aprendida es más flexible y potente que cualquier diseño manual previo.
Está por verse si la tendencia continúa y si los Transformers eventualmente cederán el paso a modelos de espacio de estados (Mamba), arquitecturas híbridas o algo que aún no hemos construido. Pero la historia sugiere que la próxima arquitectura dominante será más simple que el Transformer, no más compleja.
