Memory Bank
메모리 뱅크는 이전 배치, 프레임 또는 참조 이미지의 임베딩을 저장하므로, 모델은 한 배치보다 훨씬 많은 예시와 새 입력을 비교할 수 있습니다.
메모리 뱅크는 모델이 이전에 계산한 특성 벡터, 즉 임베딩을 저장하는 공간입니다. 새로운 입력을 한 배치나 한 번의 순전파에 담을 수 있는 것보다 훨씬 많은 예제와 비교할 수 있도록 유지합니다. 방법에 따라 저장된 벡터는 이전 학습 배치, 이전 비디오 프레임 또는 정상 이미지 참조 세트에서 가져오며, 유사도 검색이나 어텐션으로 조회하고 새 벡터가 들어오면 업데이트합니다. 메모리 뱅크는 컴퓨터 비전의 세 분야에서 핵심 역할을 합니다. 대조 학습에서는 단계마다 수천 개의 음성 예제를 제공하고, 비디오 분할 및 추적에서는 이전 프레임에서 객체가 어떻게 보였는지 기억하며, 이상 탐지에서는 정상 데이터의 모습을 저장합니다.
대조 학습의 메모리 뱅크#
대조 자기 지도 학습은 동일한 이미지의 두 보기를 서로 가깝게 만들고 다른 이미지는 멀어지게 하도록 인코더를 학습합니다. 일반적으로 음성 예제가 많을수록 학습 신호가 더 좋아집니다. 더 많은 이미지와 비교하려면 보통 더 큰 배치 크기가 필요하지만 GPU 메모리가 이를 제한합니다. Zhirong Wu와 동료들은 CVPR 2018에서 비모수 인스턴스 판별을 통한 비지도 특성 학습 논문을 발표하며 이 목적을 위한 메모리 뱅크를 소개했습니다. 메모리 뱅크는 ImageNet 학습 이미지 128만 장마다 128차원 특성을 저장하고, 이미지가 다시 나타날 때마다 해당 항목을 새로 고치며, 단계마다 수천 개의 음성 예제를 가져왔습니다. 오래된 인코더 버전이 기록한 항목은 시간이 지나면서 현재 모델과 맞지 않게 되었고 서로 일관성을 잃었습니다.
Facebook AI Research의 Kaiming He와 동료들은 큐와 두 번째 인코더를 사용해 이 문제를 해결했습니다. 메모리 뱅크에는 기본적으로 가장 최근 배치의 키 65,536개를 저장합니다. 새 배치가 들어오면 큐에 추가하고 가장 오래된 항목은 제거합니다. 키는 주 인코더의 가중치를 천천히 따라가는 모멘텀 인코더에서 가져옵니다. 모멘텀 인코더는 기존 가중치에 0.999를 곱한 값과 주 인코더 가중치에 0.001을 곱한 값의 합으로 업데이트되므로, 서로 다른 단계에서 기록한 키가 일관성을 유지합니다.
비디오 분할 및 추적의 메모리 뱅크#
비디오에서 메모리 뱅크는 이전 프레임을 참조해 모델이 가림과 외형 변화를 처리하도록 합니다. 시공간 메모리 네트워크(STM)는 마스크와 함께 과거 프레임의 키 및 값 특성을 저장하고, 이 특성에 어텐션을 적용해 새 프레임을 분할합니다. XMem은 단기 및 장기 메모리를 분리해 이를 긴 비디오로 확장했습니다. Meta의 SAM 2는 사용자가 프롬프트를 제공한 프레임과 가장 최근 프레임을 메모리 뱅크에 저장합니다. 메모리 어텐션은 모든 새 프레임의 특성을 해당 프레임에 맞춰 조정하므로, 시야에서 벗어났다가 다시 나타나는 객체를 마스크가 따라갈 수 있습니다. Ultralytics 패키지에서 SAM 2는 기본적으로 프롬프트가 제공된 프레임과 가장 최근 프레임 6개에 어텐션을 적용합니다. SAM2DynamicInteractivePredictor를 update_memory=True과 함께 호출하면 프롬프트가 제공된 이미지의 객체 상태를 메모리 뱅크에 추가한 다음, 저장한 정보를 바탕으로 이후 이미지를 분할합니다.
다중 객체 추적기는 재식별에 같은 아이디어를 사용합니다. DeepSORT는 각 추적 대상의 최근 외형 디스크립터 100개를 갤러리에 보관하고, 새로운 탐지 결과를 저장된 디스크립터와 가장 가까운 추적 대상에 연결합니다.
이상 탐지를 위한 메모리 뱅크#
Karsten Roth와 동료들이 CVPR 2022에서 발표한 PatchCore는 결함이 없는 제품 이미지에서 ImageNet 사전 학습 CNN이 추출한 패치 특성으로 메모리 뱅크를 구축합니다. 테스트 패치에는 저장된 특성 중 가장 가까운 특성과의 거리를 기준으로 점수를 부여하고, 이미지 점수는 가장 높은 패치 점수로 정하므로 모든 정상 패치와 다른 부분이 두드러집니다. 탐욕적 코어셋 서브샘플링은 특성의 분포 범위를 유지하면서 전체 특성 중 일부만 남깁니다. 이 방법은 산업용 결함 탐지 벤치마크 MVTec AD에서 이미지 수준 AUROC 최대 99.6%를 달성했습니다.
이 PyTorch 예제는 픽셀 값을 특성으로 사용해 8x8 손글씨 숫자에 같은 방식을 적용합니다. 숫자 3 이미지 100개가 메모리 뱅크를 구성하고 다른 모든 숫자는 이상으로 간주합니다:
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}")테스트 이미지 1,697개에서 전체 메모리 뱅크는 보지 못한 숫자 3 이미지 83개를 다른 숫자와 분리하며 ROC 곡선 아래 면적(AUC)은 0.984입니다. 10개 항목의 코어셋은 0.982의 점수를 기록해, 메모리와 조회 횟수를 10분의 1로 줄이면서 탐지 성능을 거의 모두 유지합니다.
메모리 뱅크와 관련 개념 비교#
- 벡터 데이터베이스: 임베딩을 영구 저장하고 여러 애플리케이션에 유사도 검색 기능을 제공합니다. 메모리 뱅크는 보통 GPU 메모리에서 단일 모델의 학습 또는 추론 루프 안에 존재하며, 모델이 실행되는 동안 덮어쓰입니다.
- 컨텍스트 윈도우: 트랜스포머가 한 번의 처리에서 어텐션을 적용하는 토큰입니다. 메모리 뱅크는 다른 배치, 프레임, 이미지에서 가져온 벡터를 해당 윈도우 외부에 보관합니다.
- Transformer-XL: 이전 텍스트 세그먼트의 은닉 상태를 캐시해 다음 세그먼트가 참조하는 메모리로 사용합니다. 즉, 언어 모델이 단일 윈도우를 넘어 더 많은 텍스트를 처리하도록 활성화를 메모리 뱅크에 저장합니다.
- 하드 네거티브 마이닝: 학습을 위해 가장 혼동하기 쉬운 음성 예제를 선택합니다. 메모리 뱅크는 이러한 선택에 사용할 수 있는 대규모 음성 예제 풀을 제공합니다.
- 에피소드 메모리: AI 에이전트 및 강화 학습에서 의사결정을 안내하기 위해 검색하는 과거 경험의 저장소입니다. 메모리 뱅크는 음성 예제, 과거 프레임, 정상 패치와 같이 모델의 자체 연산을 위한 벡터를 저장합니다.










