Memory Bank
Un memory bank archivia gli embedding di batch, frame o immagini di riferimento precedenti, così un modello può confrontare nuovi input con molti più esempi di quanti ne contenga un singolo batch.
Una banca di memoria è un archivio di vettori di feature, o embedding, calcolati in precedenza da un modello e conservati per confrontare nuovi input con un numero di esempi molto superiore a quello che entra in un batch o in un singolo passaggio forward. A seconda del metodo, i vettori memorizzati provengono da batch di addestramento precedenti, fotogrammi video precedenti o un insieme di riferimento di immagini normali; la banca viene letta tramite ricerche di similarità o meccanismi di attenzione e aggiornata man mano che arrivano nuovi vettori. Le banche di memoria sono fondamentali in tre ambiti della visione artificiale: l'apprendimento contrastivo, in cui forniscono migliaia di esempi negativi per passaggio; la segmentazione video e il tracciamento, in cui conservano informazioni sull'aspetto precedente di un oggetto; e il rilevamento delle anomalie, in cui raccolgono esempi di dati normali.
Banche di memoria nell'apprendimento contrastivo#
L'apprendimento autosupervisionato contrastivo addestra un codificatore ad avvicinare due viste della stessa immagine e ad allontanare le altre immagini; in generale, più esempi negativi producono un segnale di addestramento migliore. Per confrontare più immagini serve normalmente un batch size maggiore, limitato dalla memoria della GPU. Zhirong Wu e colleghi hanno introdotto a questo scopo la banca di memoria nell'articolo Unsupervised Feature Learning via Non-Parametric Instance Discrimination, presentato a CVPR 2018: conservava una feature a 128 dimensioni per ciascuna delle 1,28 milioni di immagini di addestramento di ImageNet, aggiornava ogni voce ogni volta che l'immagine corrispondente veniva rivista e a ogni passaggio ne estraeva migliaia di esempi negativi. Poiché le voci erano state scritte da versioni precedenti del codificatore, le feature memorizzate diventavano obsolete e incoerenti con il modello corrente.
Momentum Contrast (MoCo), ideato da Kaiming He e colleghi di Facebook AI Research, ha risolto il problema con una coda e un secondo codificatore. La banca conserva le chiavi dei batch più recenti, 65.536 per impostazione predefinita, accodando ogni nuovo batch ed eliminando il più vecchio. Le chiavi provengono da un codificatore basato sul momentum, i cui pesi seguono lentamente quelli del codificatore principale e vengono aggiornati come 0,999 volte il loro vecchio valore più 0,001 volte i pesi del codificatore principale; così le chiavi scritte in passaggi diversi restano coerenti tra loro.
Banche di memoria nella segmentazione video e nel tracciamento#
Nei video, una banca di memoria consente a un modello di gestire occlusioni e cambiamenti d'aspetto consultando i fotogrammi precedenti. Le reti Space-Time Memory (STM) conservavano le feature chiave e valore dei fotogrammi passati insieme alle relative maschere e segmentavano ogni nuovo fotogramma applicandovi l'attenzione; XMem ha esteso questo approccio ai video lunghi con memorie a breve e a lungo termine separate. SAM 2 di Meta conserva in una banca di memoria i fotogrammi su cui l'utente ha fornito un prompt e quelli più recenti; l'attenzione sulla memoria condiziona su questi le feature di ogni nuovo fotogramma, consentendo alla maschera di seguire un oggetto che esce e rientra nell'inquadratura. Nel pacchetto Ultralytics, SAM 2 applica per impostazione predefinita l'attenzione ai fotogrammi con prompt e ai 6 più recenti; SAM2DynamicInteractivePredictor aggiunge lo stato dell'oggetto di un'immagine con prompt alla propria banca di memoria quando viene chiamato con update_memory=True, poi segmenta le immagini successive in base a ciò che ha memorizzato.
I tracker multi-oggetto usano la stessa idea per la re-identificazione: DeepSORT conserva una galleria degli ultimi 100 descrittori dell'aspetto di ogni traccia e associa i nuovi rilevamenti alla traccia con i descrittori memorizzati più simili.
Banche di memoria per il rilevamento delle anomalie#
PatchCore, presentato da Karsten Roth e colleghi a CVPR 2022, crea una banca di memoria di feature di patch estratte da una CNN preaddestrata su ImageNet a partire da immagini di prodotti privi di difetti. Il punteggio di una patch di test corrisponde alla distanza dalla feature memorizzata più vicina; il punteggio dell'immagine è quello della patch peggiore, perciò risaltano gli elementi diversi da tutte le patch normali. Il sottocampionamento greedy di un coreset conserva solo una piccola parte delle feature mantenendone però la distribuzione; sul benchmark industriale MVTec AD per il rilevamento dei difetti, il metodo ha raggiunto un AUROC a livello di immagine fino al 99,6%.
Questo esempio con PyTorch applica lo stesso metodo a cifre manoscritte 8x8, usando i pixel grezzi come feature: 100 immagini della cifra 3 costituiscono la banca di memoria e tutte le altre cifre vengono considerate anomalie:
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}")Sulle 1.697 immagini di test, la banca completa separa gli 83 tre mai visti dalle altre cifre con un'area sotto la curva ROC (AUC) di 0.984; il coreset con 10 voci ottiene 0.982, conservando quasi tutta la qualità di rilevamento con un decimo della memoria e delle ricerche.
Banca di memoria e concetti correlati#
- Database vettoriale: conserva gli embedding in modo persistente e offre ricerche di similarità a molte applicazioni. Una banca di memoria risiede nel ciclo di addestramento o inferenza di un singolo modello, di solito nella memoria della GPU, e viene sovrascritta durante l'esecuzione del modello.
- Finestra di contesto: i token a cui un transformer applica l'attenzione in un singolo passaggio. Una banca di memoria conserva vettori al di fuori di tale finestra, provenienti da altri batch, fotogrammi o immagini.
- Transformer-XL: memorizza gli stati nascosti del segmento di testo precedente come una memoria a cui il segmento successivo applica l'attenzione; è una banca di memoria di attivazioni che estende la portata di un modello linguistico oltre una singola finestra.
- Ricerca di esempi negativi difficili: seleziona gli esempi negativi più difficili da distinguere durante l'addestramento. Una banca di memoria fornisce un ampio insieme di esempi negativi da cui effettuare la selezione.
- Memoria episodica: nell'IA agentica e nell'apprendimento per rinforzo, è un archivio di esperienze passate recuperate per orientare le decisioni. Le banche di memoria conservano invece vettori usati nei calcoli del modello, come esempi negativi, fotogrammi passati o patch normali.










