EMBER
Memoria episódica para robots
Paper aceptado · IEEE BIP 2026
Año
2026
Tipo
Ciencia y neuro
Estado
Stack
Python, Computational Neuroscience, Spiking Networks
Memoria episódica de largo plazo bioinspirada para robots cognitivos: qué guardar, cuánto tiempo mantenerlo y cómo recuperarlo desde una pista degradada. Una búsqueda exhaustiva sobre 576 diseños de memoria que termina en una ley.
Un robot que aprende toda su vida tiene que decidir qué vale la pena recordar. El buffer episódico de la arquitectura e-MDB es una cola FIFO de tamaño fijo: guarda lo último que vio, trate de lo que trate.
EMBER convierte cada mecanismo de memoria bioinspirada — lectura, escritura, fuerza modulada por error de predicción, decaimiento, olvido, refuerzo — en un eje de un espacio de diseño discreto, y lo recorre entero. El FIFO desplegado no es un baseline externo sino un punto más de ese espacio, lo que vuelve la comparación falsable: ¿dónde cae el incumbente y qué combinación define la frontera?
El resultado central es la ley del umbral: qué mecanismo importa depende del cociente r = K_proto / C entre prototipos de experiencia recurrentes y capacidad. Por debajo de 1 domina la consolidación por fusión; por encima, el olvido selectivo modulado por saliencia. Para un robot, el régimen cambia a lo largo de su vida — y la arquitectura de la frontera funciona en ambos.
Qué construí
- 01Espacio de 576 genotipos de memoria y un motor de búsqueda paralelo con estadística.
- 02Memorias SDM, ENN, spiking (LIF + STDP) y Spiking-SDM bajo un mismo protocolo.
- 03Núcleo que depende solo de numpy, pensado para correr en un Robotino.
- 04Cinco experimentos reproducibles con manifiesto de SHA, semillas y versiones.
En números
from ember.core import Genotype, PolicyMemory
from ember.core.policies import Append, MinStrength, NearestNeighbour, NoDecay, PredErrorGated
frontier = Genotype(
read=NearestNeighbour(),
write=Append(),
strength=PredErrorGated(), # surprise decides how hard it is encoded
decay=NoDecay(),
evict=MinStrength(),
reinforce=0.0,
)
mem = PolicyMemory(dim=32, capacity=20, genotype=frontier, seed=0)