Memory Bank
Eine Memory Bank speichert Embeddings aus früheren Batches, Frames oder Referenzbildern. So kann ein Modell neue Eingaben mit deutlich mehr Beispielen vergleichen, als in einen Batch passen.
Eine Speicherbank enthält zuvor berechnete Merkmalsvektoren oder Einbettungen, auf die ein Modell zurückgreifen kann, um neue Eingaben mit deutlich mehr Beispielen zu vergleichen, als in einen Batch oder einen Vorwärtsdurchlauf passen. Je nach Verfahren stammen die gespeicherten Vektoren aus früheren Trainings-Batches, vorherigen Videobildern oder einem Referenzsatz normaler Bilder. Die Bank wird durch Ähnlichkeitssuchen oder Attention abgefragt und beim Eintreffen neuer Vektoren aktualisiert. Speicherbanken spielen in drei Bereichen der Computer Vision eine zentrale Rolle: beim kontrastiven Lernen, wo sie pro Schritt Tausende negativer Beispiele liefern; bei der Videosegmentierung und dem Tracking, wo sie das Erscheinungsbild eines Objekts in früheren Bildern speichern; und bei der Anomalieerkennung, wo sie festhalten, wie normale Daten aussehen.
Speicherbanken beim kontrastiven Lernen#
Beim kontrastiven selbstüberwachten Lernen wird ein Encoder darauf trainiert, zwei Ansichten desselben Bildes einander anzunähern und andere Bilder davon abzustoßen. Mehr negative Beispiele liefern in der Regel ein besseres Trainingssignal. Der Vergleich mit mehr Bildern erfordert normalerweise eine größere Batch-Größe, was den GPU-Speicher an seine Grenzen bringt. Zhirong Wu und seine Kolleginnen und Kollegen führten Speicherbanken für diesen Zweck 2018 auf der CVPR in Unüberwachtes Lernen von Merkmalen durch nichtparametrische Instanzunterscheidung ein. Die Bank speicherte für jedes der 1,28 Millionen ImageNet-Trainingsbilder ein 128-dimensionales Merkmal, aktualisierte jeden Eintrag, wenn das zugehörige Bild erneut angezeigt wurde, und zog pro Schritt Tausende negativer Beispiele daraus. Da ältere Versionen des Encoders die Einträge geschrieben hatten, veralteten die gespeicherten Merkmale und stimmten nicht mehr mit dem aktuellen Modell überein.
Momentum Contrast (MoCo) von Kaiming He und seinen Kolleginnen und Kollegen bei Facebook AI Research löste dieses Problem mit einer Warteschlange und einem zweiten Encoder. Die Bank enthält die Schlüssel der jüngsten Batches – standardmäßig 65.536 –, wobei jeder neue Batch hinzugefügt und der älteste entfernt wird. Die Schlüssel stammen von einem Momentum-Encoder, dessen Gewichte den Gewichten des Hauptencoders langsam folgen. Sie werden aktualisiert, indem man 0,999 mit ihrem alten Wert und 0,001 mit den Gewichten des Hauptencoders multipliziert. So bleiben die Schlüssel, die zu unterschiedlichen Zeitpunkten geschrieben werden, untereinander konsistent.
Speicherbanken bei Videosegmentierung und Tracking#
Bei Videos kann ein Modell mithilfe früherer Bilder mit Verdeckungen und veränderten Erscheinungsbildern umgehen. Space-Time-Memory-Netze (STM) speicherten Schlüssel- und Wertmerkmale früherer Bilder samt Masken und segmentierten jedes neue Bild, indem sie auf diese Daten achteten. XMem erweiterte diesen Ansatz mit getrennten Kurzzeit- und Langzeitspeichern auf lange Videos. SAM 2 von Meta führt eine Speicherbank mit den vom Benutzer markierten Bildern und den jüngsten Bildern. Die Speicher-Attention bezieht die Merkmale jedes neuen Bildes auf diese gespeicherten Daten. So folgt eine Maske einem Objekt, das aus dem Sichtfeld verschwindet und später wieder darin auftaucht. Im Ultralytics-Paket berücksichtigt SAM 2 standardmäßig die markierten Bilder und die 6 jüngsten Bilder. SAM2DynamicInteractivePredictor fügt den Zustand des Objekts aus einem markierten Bild zur Speicherbank hinzu, wenn es mit update_memory=True aufgerufen wird. Anschließend segmentiert es spätere Bilder anhand der gespeicherten Informationen.
Mehrfachobjekt-Tracker verwenden denselben Ansatz zur Wiederidentifizierung: DeepSORT speichert die letzten 100 Erscheinungsbildbeschreibungen jeder Verfolgungsspur in einer Galerie und ordnet neue Erkennungen der Spur zu, deren gespeicherte Beschreibungen ihnen am ähnlichsten sind.
Speicherbanken zur Anomalieerkennung#
PatchCore, das Karsten Roth und seine Kolleginnen und Kollegen 2022 auf der CVPR vorstellten, erstellt eine Speicherbank mit Merkmalen von Bildausschnitten. Ein mit ImageNet vortrainiertes CNN extrahiert diese Merkmale aus fehlerfreien Produktbildern. Ein Testausschnitt wird anhand seiner Entfernung zum ähnlichsten gespeicherten Merkmal bewertet. Der Bildwert entspricht dem schlechtesten Wert eines Ausschnitts, sodass alles auffällt, was sich von allen normalen Ausschnitten unterscheidet. Eine gierige Unterstichprobenziehung mit einer Kerngruppe behält nur einen kleinen Teil der Merkmale und deckt dennoch deren Verteilung ab. Im industriellen Benchmark MVTec AD zur Fehlererkennung erreichte das Verfahren auf Bildebene eine AUROC von bis zu 99,6 %.
Dieses PyTorch-Beispiel wendet dasselbe Verfahren auf handgeschriebene Ziffern mit 8 × 8 Pixeln und rohen Pixelwerten als Merkmalen an: 100 Bilder der Ziffer 3 bilden die Speicherbank, alle anderen Ziffern gelten als Anomalien:
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}")Bei den 1.697 Testbildern trennt die vollständige Speicherbank die 83 zuvor ungesehenen Dreien von den anderen Ziffern mit einer Fläche unter der ROC-Kurve (AUC) von 0.984. Die Kerngruppe mit 10 Einträgen erreicht 0.982 und behält damit fast die gesamte Erkennungsleistung bei einem Zehntel des Speicherbedarfs und der Abfragen.
Speicherbanken und verwandte Konzepte#
- Vektordatenbank: Speichert Einbettungen dauerhaft und ermöglicht vielen Anwendungen eine Ähnlichkeitssuche. Eine Speicherbank ist Teil der Trainings- oder Inferenzschleife eines einzelnen Modells, befindet sich meist im GPU-Speicher und wird beim Modellbetrieb überschrieben.
- Kontextfenster: Die Token, auf die ein Transformer in einem Durchlauf achtet. Eine Speicherbank enthält Vektoren außerhalb dieses Fensters, die aus anderen Batches, Bildern oder Videobildern stammen.
- Transformer-XL: Speichert die verborgenen Zustände des vorherigen Textabschnitts zwischen, damit der nächste Abschnitt darauf zugreifen kann. Diese Aktivierungsspeicherbank erweitert die Reichweite eines Sprachmodells über ein einzelnes Fenster hinaus.
- Auswahl schwieriger negativer Beispiele: Wählt die am leichtesten zu verwechselnden negativen Beispiele für das Training aus. Eine Speicherbank stellt dafür einen großen Pool negativer Beispiele bereit.
- Episodisches Gedächtnis: In KI-Agenten und beim bestärkenden Lernen werden frühere Erfahrungen gespeichert und abgerufen, um Entscheidungen zu unterstützen. Speicherbanken halten Vektoren für die Berechnungen eines Modells bereit, etwa negative Beispiele, frühere Bilder oder normale Bildausschnitte.










