Memory Bank
Une banque de mémoire stocke les plongements de lots, d’images vidéo ou d’images de référence précédents, afin qu’un modèle puisse comparer les nouvelles entrées à bien plus d’exemples que ceux d’un seul lot.
Une banque mémoire est un espace de stockage contenant des vecteurs de caractéristiques, ou des plongements, calculés précédemment par un modèle et conservés pour comparer de nouvelles entrées à bien plus d’exemples que ne peut en contenir un lot ou un passage avant. Selon la méthode, les vecteurs stockés proviennent de lots d’entraînement précédents, d’images vidéo antérieures ou d’un ensemble de référence d’images normales. La banque est consultée par recherche de similarité ou par attention, et mise à jour à mesure que de nouveaux vecteurs arrivent. Les banques mémoire jouent un rôle central dans trois domaines de la vision par ordinateur : l’apprentissage contrastif, où elles fournissent des milliers d’exemples négatifs à chaque étape ; la segmentation vidéo et le suivi, où elles mémorisent l’apparence d’un objet dans les images précédentes ; et la détection d’anomalies, où elles stockent ce à quoi ressemblent les données normales.
Banques mémoire dans l’apprentissage contrastif#
L’apprentissage auto-supervisé contrastif entraîne un encodeur à rapprocher deux vues d’une même image et à éloigner les autres images ; en général, plus il y a d’exemples négatifs, meilleur est le signal d’entraînement. Comparer davantage d’images nécessite normalement une taille de lot supérieure, ce qui est limité par la mémoire du GPU. Zhirong Wu et ses collègues ont introduit la banque mémoire à cette fin dans Unsupervised Feature Learning via Non-Parametric Instance Discrimination, à CVPR 2018 : elle conservait une caractéristique de 128 dimensions pour chacune des 1,28 million d’images d’entraînement ImageNet, actualisait chaque entrée lorsque l’image correspondante était revue et en tirait des milliers d’exemples négatifs à chaque étape. Comme les entrées étaient produites par d’anciennes versions de l’encodeur, les caractéristiques stockées devenaient obsolètes et incohérentes avec le modèle actuel.
Momentum Contrast (MoCo), créé par Kaiming He et ses collègues de Facebook AI Research, a résolu ce problème avec une file d’attente et un second encodeur. La banque contient les clés des lots les plus récents, 65 536 par défaut ; chaque nouveau lot y est ajouté, et le plus ancien est supprimé. Les clés proviennent d’un encodeur à momentum dont les poids suivent lentement ceux de l’encodeur principal : ils sont mis à jour en prenant 0,999 fois leur ancienne valeur et 0,001 fois les poids de l’encodeur principal. Les clés enregistrées à différentes étapes restent ainsi cohérentes entre elles.
Banques mémoire dans la segmentation vidéo et le suivi#
En vidéo, une banque mémoire permet à un modèle de gérer les occultations et les changements d’apparence en consultant les images précédentes. Les réseaux STM (Space-Time Memory) stockaient les caractéristiques clés et valeurs des images précédentes, avec leurs masques, puis segmentaient chaque nouvelle image en s’appuyant sur elles. XMem a étendu cette méthode aux vidéos longues à l’aide de mémoires à court et à long terme distinctes. SAM 2 de Meta conserve dans une banque mémoire les images pour lesquelles l’utilisateur a fourni une invite, ainsi que les images les plus récentes ; son attention mémoire conditionne les caractéristiques de chaque nouvelle image à partir de celles-ci. C’est ainsi qu’un masque suit un objet qui quitte le champ et y revient. Dans le package Ultralytics, SAM 2 s’appuie par défaut sur les images avec invite et sur les 6 images les plus récentes, et SAM2DynamicInteractivePredictor ajoute l’état de l’objet d’une image avec invite à sa banque mémoire lorsqu’il est appelé avec update_memory=True, puis segmente les images ultérieures à partir de ce qu’il a stocké.
Les suiveurs multi-objets utilisent la même idée pour la réidentification : DeepSORT conserve une galerie des 100 derniers descripteurs d’apparence de chaque piste et associe les nouvelles détections à la piste dont les descripteurs stockés sont les plus proches.
Banques mémoire pour la détection d’anomalies#
PatchCore, présenté par Karsten Roth et ses collègues à CVPR 2022, construit une banque mémoire de caractéristiques de patch extraites par un CNN préentraîné sur ImageNet à partir d’images de produits sans défaut. Le score d’un patch de test correspond à sa distance par rapport à la caractéristique stockée la plus proche ; le score de l’image est celui du patch le plus anormal. Tout élément qui ne ressemble à aucun patch normal ressort donc du lot. Le sous-échantillonnage glouton par coreset ne conserve qu’une petite fraction des caractéristiques tout en couvrant leur répartition, et la méthode a atteint une AUROC au niveau de l’image allant jusqu’à 99,6 % sur le benchmark industriel de détection de défauts MVTec AD.
Cet exemple PyTorch applique la même méthode à des chiffres manuscrits de 8 × 8 pixels, en utilisant les pixels bruts comme caractéristiques : 100 images du chiffre 3 forment la banque mémoire, et tous les autres chiffres sont considérés comme des anomalies :
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}")Sur les 1 697 images de test, la banque complète distingue les 83 chiffres 3 jamais vus des autres chiffres avec une aire sous la courbe ROC (AUC) de 0.984, et le coreset de 10 entrées obtient 0.982. Il conserve presque toute la qualité de détection avec dix fois moins de mémoire et de recherches.
Les banques mémoire par rapport aux concepts associés#
- Base de données vectorielle : Stocke les plongements de manière persistante et propose une recherche par similarité à de nombreuses applications. Une banque mémoire se trouve dans la boucle d’entraînement ou d’inférence d’un seul modèle, généralement dans la mémoire GPU, et est écrasée pendant l’exécution du modèle.
- Fenêtre de contexte : Les jetons auxquels un transformeur prête attention lors d’un passage. Une banque mémoire contient des vecteurs en dehors de cette fenêtre, issus d’autres lots, images vidéo ou images.
- Transformer-XL : Met en cache les états cachés du segment de texte précédent pour que le segment suivant puisse s’y référer. Cette banque mémoire d’activations étend la portée d’un modèle de langage au-delà d’une seule fenêtre.
- Extraction des exemples négatifs difficiles : Sélectionne les exemples négatifs les plus déroutants pour l’entraînement. Une banque mémoire fournit un vaste ensemble d’exemples négatifs parmi lesquels effectuer cette sélection.
- Mémoire épisodique : Dans les agents d’IA et l’apprentissage par renforcement, stockage d’expériences passées auxquelles le système fait appel pour guider ses décisions. Les banques mémoire stockent des vecteurs utilisés dans les calculs propres à un modèle, comme les exemples négatifs, les images précédentes ou les patchs normaux.










