Capsule Networks (CapsNet)
Las redes de cápsulas (CapsNets) codifican cada parte como un vector cuya longitud representa su probabilidad y cuya dirección representa su pose, conectados mediante enrutamiento dinámico.
Las redes de cápsulas (CapsNets) son redes neuronales formadas por cápsulas, pequeños grupos de neuronas cuya salida es un vector en lugar de un único número. La longitud del vector de una cápsula representa la probabilidad de que esté presente una entidad, como un dígito, un ojo o una rueda; su dirección codifica los parámetros de instancia de esa entidad: posición, tamaño, orientación, grosor del trazo y otras propiedades de pose y deformación. Geoffrey Hinton, Alex Krizhevsky y Sida Wang introdujeron las cápsulas en un artículo de 2011 sobre autocodificadores transformadores; Sara Sabour, Nicholas Frosst y Hinton las convirtieron en un clasificador funcional en Enrutamiento dinámico entre cápsulas, presentado en NIPS 2017, que conecta cápsulas de capas sucesivas mediante un algoritmo iterativo llamado enrutamiento por acuerdo.
Por qué las cápsulas sustituyen al max pooling#
Una red neuronal convolucional (CNN) detecta características mediante activaciones escalares y suele reducir sus mapas de características con max pooling, que conserva la respuesta más intensa de cada ventana y descarta el lugar de la ventana donde se produjo. Así, la detección tolera pequeños desplazamientos, pero una red que solo comprueba si hay partes presentes puede aceptar una cara con la boca por encima de los ojos: el llamado problema de Picasso. Hinton defendía la equivariancia frente a la invariancia: cuando un objeto se desplaza o gira, el vector de una cápsula debería girar con él, mientras que su longitud —la probabilidad de que el objeto exista— debería mantenerse igual. Las cápsulas que aprenden el punto de vista de este modo necesitan menos ampliación de datos que una CNN para reconocer objetos desde ángulos nuevos.
Ultralytics YOLO26 conserva las posiciones de los objetos sin cápsulas: cinco convoluciones de stride 2 reducen la entrada a una resolución de 1/32; su único bloque de max pooling, SPPF, aplica pooling con stride 1 y una ventana de 5 x 5 tres veces seguidas, lo que amplía el campo receptivo sin reducir la cuadrícula desde la que predice su cabezal de detección.
Cómo funciona el enrutamiento dinámico#
Cada cápsula de una capa inferior multiplica su salida por una matriz de pesos aprendida para predecir la salida de cada cápsula de la capa superior. El enrutamiento decide cuánto de la salida de cada hija llega a cada progenitora. Un softmax sobre los logits de enrutamiento, que empiezan en cero, genera coeficientes de acoplamiento que distribuyen la salida de cada hija entre las progenitoras. Cada progenitora suma las predicciones ponderadas por esos coeficientes y aplica la función squash, que conserva la dirección del vector y transforma su longitud al intervalo de 0 a 1. El producto escalar entre cada predicción y la nueva salida de la progenitora se añade al logit, de modo que las hijas envían más salida a las progenitoras cuyo estado habían predicho:
import torch
torch.manual_seed(0)
# 6 cápsulas hijas predicen cada una una pose 8D para 2 cápsulas progenitoras
predictions = 0.2 * torch.randn(6, 2, 8)
pose = 0.5 * torch.randn(8)
predictions[:4, 0] = pose + 0.05 * torch.randn(4, 8) # las hijas 0-3 coinciden con la progenitora 0
logits = torch.zeros(6, 2)
for _ in range(3): # enrutamiento por acuerdo, 3 iteraciones como en el artículo
coupling = logits.softmax(dim=1) # cada hija reparte su voto entre las progenitoras
s = (coupling.unsqueeze(-1) * predictions).sum(dim=0)
squared = s.square().sum(dim=-1, keepdim=True)
parents = squared / (1 + squared) * s / squared.sqrt() # squash: longitud en [0, 1)
logits = logits + (predictions * parents).sum(dim=-1) # el acuerdo aumenta el logit
print(coupling[:, 0].round(decimals=2))
print(parents.norm(dim=-1).round(decimals=2))Imprime tensor([0.9700, 0.9700, 0.9700, 0.9700, 0.5700, 0.4700]) y tensor([0.9800, 0.1500]). Tras tres iteraciones, las cuatro cápsulas hijas que coinciden envían el 97 % de su salida a la progenitora 0; las otras dos mantienen un reparto casi equitativo, y la longitud del vector de la progenitora 0 alcanza 0,98, mientras que la progenitora 1, que solo recibió votos dispersos, se queda en 0,15. El enrutamiento se parece al mecanismo de atención de un Transformer ejecutado en sentido inverso: el softmax se aplica sobre las progenitoras a las que podría llegar una hija, por lo que las progenitoras compiten por la salida de cada hija.
CapsNet de 2017 y sus resultados#
La red original es poco profunda: una convolución con 256 kernels de tamaño 9 x 9 alimenta PrimaryCaps, una capa convolucional de cápsulas que convierte un dígito de 28 x 28 en 32 x 6 x 6 = 1.152 cápsulas de ocho dimensiones; el enrutamiento las conecta con DigitCaps, una cápsula de 16 dimensiones por clase. El entrenamiento combina una función de pérdida de margen sobre las longitudes de las cápsulas —que las eleva por encima de 0,9 para los dígitos presentes y las reduce por debajo de 0,1 para los demás— con un decodificador que reconstruye la imagen a partir de la cápsula del dígito correcto y un término de regularización al estilo de un autocodificador, reducido por un factor de 0,0005. Perturbar una de las 16 dimensiones y decodificar el resultado modifica una propiedad concreta, como la escala, el grosor del trazo, la inclinación o la anchura; esto facilita inspeccionar las salidas de las cápsulas frente a las activaciones de una CNN, un objetivo compartido con la IA explicable.
Con 8,2 millones de parámetros frente a los 35,4 millones de una CNN de referencia, CapsNet alcanzó un error de prueba del 0,25 % en MNIST, frente al 0,39 % de la referencia; en MultiMNIST logró un 5,2 % frente al 8,1 %, con pares de dígitos cuyas cajas delimitadoras se solapan un 80 % de media. Entrenado solo con dígitos de MNIST desplazados hasta 2 píxeles, obtuvo un 79 % en affNIST, que contiene los mismos dígitos con transformaciones afines aleatorias, mientras que una CNN con un número de parámetros similar obtuvo un 66 %. En CIFAR-10, un conjunto de siete CapsNets alcanzó un error del 10,6 %, aproximadamente el que obtenían las CNN cuando empezaron a aplicarse a ese conjunto de datos; los autores atribuyeron la diferencia a que las cápsulas intentaban tener en cuenta fondos desordenados.
Limitaciones y modelos de cápsulas posteriores#
El enrutamiento ejecuta varias iteraciones para cada par de cápsulas hijas y progenitoras, por lo que el cálculo y la memoria crecen rápidamente con el tamaño de la imagen y el número de clases; las redes de cápsulas nunca igualaron a las CNN ni a los Transformers de visión en grandes pruebas de referencia de clasificación de imágenes, como ImageNet. Los investigadores las han aplicado al análisis de imágenes médicas, por ejemplo, para clasificar tipos de tumores cerebrales a partir de resonancias magnéticas, un ámbito donde los conjuntos de entrenamiento son pequeños.
Las cápsulas matriciales con enrutamiento EM, propuestas por Hinton, Sabour y Frosst en ICLR 2018, sustituyeron los vectores de pose por matrices de pose de 4 x 4 y aplicaron enrutamiento mediante maximización de expectativas; en la pequeña prueba de referencia smallNORB, con objetos de juguete fotografiados desde muchos puntos de vista, redujeron los errores de prueba un 45 % respecto al anterior estado del arte y resistieron los ataques adversarios de caja blanca mejor que una CNN de referencia. En 2019 aparecieron autocodificadores de cápsulas apilados que aprendían cápsulas sin etiquetas; en 2021, la propuesta GLOM de Hinton representó las mismas jerarquías de partes y conjuntos como islas de vectores de incrustación coincidentes, sin ningún enrutamiento dinámico.










