Memory Bank
Un banco de memoria almacena embeddings de lotes, fotogramas o imágenes de referencia anteriores para que un modelo compare nuevas entradas con muchos más ejemplos que los de un solo lote.
Un banco de memoria es un almacén de vectores de características o embeddings que un modelo calculó anteriormente y conserva para poder comparar nuevas entradas con muchos más ejemplos de los que caben en un lote o en una pasada hacia delante. Según el método, los vectores almacenados proceden de lotes de entrenamiento anteriores, fotogramas de vídeo anteriores o un conjunto de referencia de imágenes normales; el banco se consulta mediante búsquedas de similitud o atención y se actualiza a medida que llegan nuevos vectores. Los bancos de memoria son fundamentales en tres áreas de la visión artificial: el aprendizaje contrastivo, donde proporcionan miles de ejemplos negativos por paso; la segmentación de vídeo y el seguimiento, donde recuerdan el aspecto de un objeto en fotogramas anteriores; y la detección de anomalías, donde almacenan cómo son los datos normales.
Bancos de memoria en el aprendizaje contrastivo#
El aprendizaje autosupervisado contrastivo entrena un codificador para acercar dos versiones de una misma imagen y alejar las demás imágenes; por lo general, cuantos más ejemplos negativos haya, mejor será la señal de entrenamiento. Comparar más imágenes suele requerir un tamaño de lote mayor, que está limitado por la memoria de la GPU. Zhirong Wu y sus colaboradores introdujeron el banco de memoria con este fin en Unsupervised Feature Learning via Non-Parametric Instance Discrimination, en CVPR 2018: almacenaba una característica de 128 dimensiones para cada una de las 1,28 millones de imágenes de entrenamiento de ImageNet, actualizaba cada entrada cuando volvía a aparecer su imagen y extraía miles de ejemplos negativos por paso. Como las entradas las escribían versiones anteriores del codificador, las características almacenadas quedaban desactualizadas y dejaban de ser coherentes con el modelo actual.
Momentum Contrast (MoCo), de Kaiming He y sus colaboradores de Facebook AI Research, resolvió este problema con una cola y un segundo codificador. El banco almacena las claves de los lotes más recientes —65.536 por defecto—, añade cada lote nuevo y elimina el más antiguo. Las claves proceden de un codificador de momento cuyos pesos siguen lentamente al codificador principal: se actualizan como el 0,999 de su valor anterior más el 0,001 de los pesos del codificador principal, de modo que las claves escritas en pasos distintos siguen siendo coherentes entre sí.
Bancos de memoria en la segmentación y el seguimiento de vídeo#
En vídeo, un banco de memoria permite que un modelo gestione la oclusión y los cambios de aspecto consultando fotogramas anteriores. Las redes de memoria espacio-temporal (STM) almacenaban características clave y de valor de fotogramas anteriores junto con sus máscaras, y segmentaban cada fotograma nuevo atendiendo a ellas; XMem amplió este enfoque a vídeos largos con memorias independientes a corto y largo plazo. SAM 2 de Meta conserva en un banco de memoria los fotogramas indicados por el usuario y los más recientes, y su atención de memoria condiciona las características de cada fotograma nuevo en función de ellos, lo que permite que una máscara siga a un objeto cuando sale y vuelve a entrar en el campo de visión. En el paquete Ultralytics, SAM 2 atiende por defecto a los fotogramas indicados y a los 6 más recientes; SAM2DynamicInteractivePredictor añade el estado de un objeto de una imagen indicada a su banco de memoria cuando se llama con update_memory=True, y después segmenta las imágenes posteriores comparándolas con lo almacenado.
Los seguidores de varios objetos utilizan la misma idea para la reidentificación: DeepSORT conserva una galería de los 100 últimos descriptores de aspecto de cada trayectoria y asocia las nuevas detecciones con la trayectoria cuyos descriptores almacenados son más parecidos.
Bancos de memoria para la detección de anomalías#
PatchCore, presentado por Karsten Roth y sus colaboradores en CVPR 2022, crea un banco de memoria de características de parches que una CNN preentrenada con ImageNet extrae de imágenes de productos sin defectos. La puntuación de un parche de prueba se calcula según su distancia a la característica almacenada más cercana, y la puntuación de la imagen es la del peor parche, de modo que cualquier elemento distinto de todos los parches normales destaca. El submuestreo voraz del coreset conserva solo una pequeña fracción de las características y, aun así, cubre su dispersión; el método alcanzó un AUROC a nivel de imagen de hasta el 99,6 % en la prueba industrial de referencia MVTec AD de detección de defectos.
Este ejemplo de PyTorch aplica el mismo método a dígitos manuscritos de 8 × 8, utilizando los píxeles sin procesar como características: 100 imágenes del dígito 3 forman el banco de memoria y todos los demás dígitos se consideran anomalías:
import torch
from sklearn.datasets import load_digits
from sklearn.metrics import roc_auc_score
X, y = load_digits(return_X_y=True)
X, y = torch.tensor(X / 16, dtype=torch.float32), torch.tensor(y)
normal = X[y == 3] # images of the digit 3 play the role of defect-free parts
memory_bank = normal[:100] # memory bank: stored features of 100 normal images
test = torch.cat([normal[100:], X[y != 3]]) # unseen 3s plus every other digit as anomalies
is_anomaly = torch.cat([torch.zeros(len(normal) - 100), torch.ones(len(X) - len(normal))])
# Greedy coreset: repeatedly keep the stored feature farthest from everything kept so far
coreset = [0]
distance = torch.cdist(memory_bank, memory_bank[:1])[:, 0]
for _ in range(9):
coreset.append(int(distance.argmax()))
distance = torch.minimum(distance, torch.cdist(memory_bank, memory_bank[coreset[-1:]])[:, 0])
for name, bank in [("Full memory bank, 100 entries", memory_bank), ("Coreset, 10 entries", memory_bank[coreset])]:
scores = torch.cdist(test, bank).min(dim=1).values # anomaly score: distance to the nearest stored feature
print(f"{name}: AUROC {roc_auc_score(is_anomaly, scores):.3f}")En las 1.697 imágenes de prueba, el banco completo distingue los 83 tres no vistos de los demás dígitos con un área bajo la curva ROC (AUC) de 0.984, y el coreset de 10 entradas obtiene 0.982, con lo que conserva casi toda la calidad de detección y reduce a una décima parte la memoria y las consultas.
Banco de memoria frente a conceptos relacionados#
- Base de datos vectorial: Almacena embeddings de forma persistente y ofrece búsquedas por similitud a muchas aplicaciones. Un banco de memoria reside dentro del ciclo de entrenamiento o inferencia de un modelo, normalmente en la memoria de la GPU, y se sobrescribe mientras se ejecuta el modelo.
- Ventana de contexto: Los tokens a los que atiende un transformador en una pasada. Un banco de memoria conserva vectores fuera de esa ventana, procedentes de otros lotes, fotogramas o imágenes.
- Transformer-XL: Almacena los estados ocultos del segmento de texto anterior en una memoria a la que atiende el siguiente segmento: un banco de memoria de activaciones que amplía el alcance de un modelo de lenguaje más allá de una ventana.
- Minería de ejemplos negativos difíciles: Selecciona los ejemplos negativos más confusos para el entrenamiento. Un banco de memoria proporciona un amplio conjunto de ejemplos negativos del que se pueden extraer esos ejemplos.
- Memoria episódica: En los agentes de IA y el aprendizaje por refuerzo, almacén de experiencias pasadas que se recuperan para guiar las decisiones. Los bancos de memoria almacenan vectores para los propios cálculos de un modelo, como ejemplos negativos, fotogramas anteriores o parches normales.










