Articlehuggingface.co·2026년 11월 11일·0

Token Pooling-Aware Training for Multi-Vector Embedding Models

Quick Summary

토큰 풀링을 학습 목표에 포함하면 다중 벡터 검색의 저장 공간을 줄이면서 검색 품질을 더 잘 보존할 수 있으며, 글은 pool factor=4에서 NanoBEIR nDCG@10 유지율이 일반 학습의 94.6%에서 풀링 인지 학습의 97.8%로 높아졌다고 보고한다.

Token Pooling-Aware Training for Multi-Vector Embedding Models 관련 대표 이미지

🖼️ 인포그래픽

Token Pooling-Aware Training for Multi-Vector Embedding Models 내용을 설명하는 본문 이미지

🖼️ 4컷 인포그래픽

Token Pooling-Aware Training for Multi-Vector Embedding Models의 핵심 내용을 4단계로 요약한 인포그래픽
Token Pooling-Aware Training for Multi-Vector Embedding Models 핵심 내용을 4단계로 압축한 4컷 인포그래픽

💡 한 줄 요약

토큰 풀링을 학습 목표에 포함하면 다중 벡터 검색의 저장 공간을 줄이면서 검색 품질을 더 잘 보존할 수 있으며, 글은 pool_factor=4에서 NanoBEIR nDCG@10 유지율이 일반 학습의 94.6%에서 풀링 인지 학습의 97.8%로 높아졌다고 보고한다.

📌 핵심 요약

  • ColBERT 같은 다중 벡터 모델은 질의의 각 토큰이 문서에서 적합한 부분을 찾도록 하지만 저장할 벡터가 많다. 128차원 벡터 200개를 좌표당 4비트 잔차로 저장하면 문서당 12.8 KB, 100만 문서에서 12.8 GB가 필요하며, 문서당 50개로 풀링하면 잔차 저장량은 3.2 GB로 줄어든다.
  • HierarchicalTokenPooling은 Ward 계층적 군집화로 유사한 토큰 벡터를 합치고 군집 평균을 다시 정규화한다. 예산은 max_tokens=16, pool_factor=4, distance_threshold로 조절하며, 기본적으로 첫 토큰은 병합에서 보호하고 문서 임베딩에만 풀링을 적용한다.
  • distance_threshold는 대표 문서 표본으로 보정해 평균 16개 같은 목표 벡터 수에 맞출 수 있다. 개별 문서의 벡터 수는 달라질 수 있고, 다른 코퍼스에서는 실제 평균도 바뀔 수 있다.
  • 예시 학습은 비압축 검색 손실과 pool_factor=4 압축 검색 손실을 각각 0.5의 가중치로 결합한다. 도입부는 문서 벡터를 4분의 1로 줄였을 때 NanoBEIR nDCG@10의 비압축 대비 유지율이 일반 학습에서는 94.6%, 풀링 인지 학습에서는 97.8%라고 보고한다.
  • Sentence Transformers의 MultiVectorTokenPoolingLoss는 기존 검색 손실을 감싸 여러 풀링 조건을 학습에 반영한다. 예시는 answerdotai/ModernBERT-base와 MaxSim을 사용하고, 미니배치 64와 학습 배치 256을 결합하며, 추가 풀링 조건은 인코더 재실행 없이 군집화와 점수 계산 비용을 더한다.

🧩 주요 포인트

  1. 문서 벡터 수가 저장량을 좌우함 → 고정 상한, 길이에 비례한 압축, 임베딩 구조에 따른 적응형 배분 중 문서 특성과 저장 예산에 맞는 방식을 선택할 수 있다.
  2. 압축 전후 손실을 같은 인코더에 적용함 → 풀링 이후에도 검색에 필요한 구별이 남도록 학습하며, 보고된 pool_factor=4 결과는 같은 벡터 예산에서 품질 보존이 개선될 가능성을 보여준다.
  3. 풀링 조건별 토큰 임베딩을 재사용함 → 배포 조건에 맞춰 학습 목표를 구성할 수 있지만, 풀링 조건을 늘릴수록 군집화와 점수 계산 작업도 증가한다.

🧠 상세 정리

1. 다중 벡터 검색의 표현력과 저장 비용

단일 벡터 모델은 문서 전체를 하나의 벡터로 압축하지만, ColBERT 같은 다중 벡터 모델은 문맥을 반영한 토큰 벡터들을 유지해 질의의 서로 다른 부분이 문서의 서로 다른 부분과 대응하도록 한다. MaxSim은 각 질의 벡터와 가장 잘 맞는 문서 벡터의 내적을 구한 뒤 그 점수들을 합하므로, 노트북과 긴 배터리 수명에 관한 근거가 문서 내에서 떨어져 있어도 활용할 수 있다. 이 표현력에는 저장 비용이 따르며, Fast-PLAID가 지원하는 2비트 또는 4비트 잔차 양자화를 사용하더라도 문서마다 수백 개의 벡터가 쌓이면 전체 규모가 커진다. 원문의 예시에서 128차원 벡터 200개를 잔차 좌표당 4비트로 저장하면 문서당 잔차는 12.8 KB이고, 100만 문서에서는 12.8 GB가 된다. 같은 차원과 정밀도에서 문서당 벡터를 50개로 줄이면 이 잔차 저장량은 3.2 GB가 되며, 서로 유사한 문서 토큰 벡터들을 함께 표현하는 것이 압축의 출발점이다.

2. Ward 군집화로 유사한 토큰 벡터 병합

HierarchicalTokenPooling은 Ward 계층적 군집화를 사용해 유사한 토큰 임베딩들을 묶으며, 처음에는 각 토큰 벡터를 별개의 군집으로 취급한다. 이후 각 벡터와 소속 군집 평균 사이의 제곱 거리 합이 가장 적게 증가하도록 두 군집을 반복해서 합치므로, 서로 가까운 벡터들로 이루어진 조밀한 군집을 선호한다. 이 과정에서 점점 큰 군집으로 이어지는 계층이 만들어지고, 원하는 저장 예산에 맞는 단계에서 병합을 멈출 수 있다. 최종적으로 각 군집을 평균 벡터로 대표한 뒤 다시 정규화하여 MaxSim 점수 계산에 사용할 수 있게 한다. pool_factor=4는 문서의 원래 벡터 중 대략 4분의 1을 남기는 설정이며, 기본 동작에서는 첫 토큰을 병합에서 보호하고 질의 임베딩은 그대로 둔 채 문서 임베딩에만 풀링을 적용한다.

3. 문서 특성에 따라 달라지는 풀링 예산

HierarchicalTokenPooling은 서로 다른 예산 의도를 표현하는 대안으로 max_tokens, pool_factor, distance_threshold를 제공하며, 선택한 방식에 따라 문서별 표현 용량이 달라진다. max_tokens=16은 보호된 토큰을 포함해 문서당 최대 16개의 벡터를 허용하므로, 문서 길이와 관계없이 상한을 정하고 싶을 때 사용하는 설정이다. pool_factor=4는 각 문서의 원래 벡터 수 중 대략 4분의 1을 유지하므로, 긴 문서에는 그 길이에 비례해 더 많은 벡터를 배정할 수 있다. distance_threshold는 공통 Ward 병합 거리 임계값을 사용하기 때문에, 임베딩의 기하학적 구조에 따라 문서별 최종 벡터 수가 달라질 수 있다. 따라서 길이가 다양한 문서 집합에서는 고정 상한을 둘지, 내용의 길이에 비례하게 할지, 서로 구별되는 임베딩의 정도에 따라 용량을 배분할지를 구분해야 한다.

4. 대표 문서 표본을 이용한 적응형 풀링 보정

적응형 풀링은 공통 거리 임계값 아래에서 유사한 임베딩을 적극적으로 합치는 한편, 서로 다른 내용을 담은 문서에는 더 많은 벡터를 남기는 방식이다. 이 방법은 풀링 인지 목표로 학습하지 않은 모델에도 적용할 수 있으며, 원문은 lightonai/LateOn으로 대표 문서 표본의 임베딩을 생성하는 예시를 제시한다. 이어 HierarchicalTokenPooling.calibrate_distance_threshold에 해당 임베딩과 target_tokens=16을 전달하면, 문서당 평균 벡터 수를 목표에 맞추기 위한 임계값을 얻을 수 있다. 보정에는 문서 임베딩만 필요하고, 반환된 임계값은 이후 색인할 문서의 풀링에 재사용할 수 있다. 다만 16개는 각 문서에 강제되는 수가 아니라 평균 목표이므로 개별 문서는 더 많거나 적은 벡터를 받을 수 있으며, 보정 표본과 다른 코퍼스에 적용하면 실제 평균도 달라질 수 있다.

5. 압축 이후의 검색까지 학습 목표에 포함

일반 다중 벡터 모델에도 풀링을 적용할 수 있지만, 검색에 중요한 구별이 벡터 병합 과정에서 약해질 수 있다는 문제가 있으며 기존 학습 목표는 압축 표현의 검색 성능을 직접 요구하지 않는다. 풀링 인지 학습은 여러 임베딩 너비에 검색 목표를 적용하는 Matryoshka의 원리와 유사하게, 토큰 벡터 수를 줄인 표현에도 검색 목표를 적용한다. 예시에서는 원래 문서 임베딩으로 계산한 검색 손실과 벡터를 약 4분의 1로 줄인 뒤 계산한 검색 손실을 각각 0.5의 가중치로 평균해 같은 인코더를 갱신한다. Ward 군집화의 소속 결정은 이산적이므로, 학습 중에는 straight-through estimator로 풀링 벡터의 기울기를 구성 토큰들에 전달하되 군집 할당 자체를 미분하지 않는다. 글의 도입부는 pool_factor=4에서 비압축 대비 NanoBEIR nDCG@10 유지율이 일반 학습의 94.6%에서 풀링 인지 학습의 97.8%로 높아졌다고 보고하지만, 제공된 본문에는 그 평가의 상세 조건과 결과표가 포함되어 있지 않다.

6. Sentence Transformers의 손실 래퍼와 계산 재사용

MultiVectorTokenPoolingLoss는 기존 다중 벡터 검색 손실을 감싸 선택한 풀링 조건별로 손실을 적용하며, 예시는 answerdotai/ModernBERT-base를 MaxSim 유사도로 설정한다. 기본 검색 손실인 CachedMultiVectorMultipleNegativesRankingLoss는 각 질의가 배치 안의 부정 문서보다 관련 문서에 높은 점수를 주도록 학습하고, 기본적으로 모델의 유사도 함수와 커널 설정을 따른다. 따라서 유사도를 meanmaxsim으로 설정한 모델이라면 학습에서도 MeanMaxSim을 사용하며, 예시 스크립트는 기울기 캐싱으로 미니배치 64를 처리하면서 학습 배치 256의 배치 내 부정 문서를 활용한다. 래퍼의 token_poolings에 지정한 None은 원래 임베딩을, 다른 항목은 pool_factor=4로 압축한 임베딩을 뜻하고, 두 항목의 가중치 0.5가 손실을 평균한다. 각 풀링 조건은 이미 계산한 토큰 임베딩을 재사용하므로 별도의 인코더 실행은 필요하지 않지만 군집화와 점수 계산 작업은 추가되며, 입력 임베딩으로의 기울기를 보존하는 사용자 정의 BaseTokenPooling이나 여러 풀링 조건으로 배포 표현에 맞춘 학습도 가능하다.

7. 로컬 실행과 Hugging Face Jobs를 통한 학습

원문이 연결하는 전체 학습 스크립트에는 데이터셋, 트레이너, 검증 손실과 학습 중 수행하는 소규모 검색 평가가 포함되어 있으며, 일반 손실 기준 모델과 풀링 인지 모델을 각각 실행할 수 있다. 저장소를 내려받은 환경에서는 uv로 examples/multi_vector_encoder/training/token_pooling/training_cached_contrastive.py를 실행하고, 일반 손실 기준 모델에는 --baseline 인자를 추가한다. 스크립트가 학습 및 커널 의존성을 선언하므로 uv가 필요한 항목을 설치하며, 호환되는 커널은 자동으로 활성화된다. 클라우드 실행 예시는 huggingface_hub CLI를 설치하고 Jobs 실행과 모델 업로드 권한이 있는 토큰으로 로그인한 뒤, Hugging Face Jobs에서 a10g-small 사양과 4시간 제한을 지정해 풀링 인지 학습을 실행한다. HF_TOKEN을 비밀값으로 전달하면 학습 종료 후 사용자의 Hub 계정에 모델을 업로드할 수 있고, 같은 방식으로 기준 모델을 실행하려면 스크립트 URL 뒤에 --baseline을 추가한다.

8. 선택적 커널 가속과 제공된 자료의 범위

선택적 커널 가속 부분은 MaxSim 점수 계산, Ward 군집화, 지원되는 백본 연산을 kernels로 가속할 수 있다고 설명하며, sentence-transformers[train,kernels] 설치 명령을 제시한다. 이어 손실을 구성하기 전에 모델과 풀러 초기화를 바꾸도록 안내하고, 모델에는 answerdotai/ModernBERT-base, device="cuda", similarity_fn_name="maxsim", use_kernels=True를 지정한다. 다만 제공된 source_body는 이어지는 HierarchicalTokenPooling의 pool_factor=4 설정 코드 도중에 끝나므로, 이후 사용법이나 가속 효과의 구체적인 측정 결과는 확인할 수 없다. 글은 Stefan Josef의 Learn to Pool과 LightOn의 풀링 정규화 연구를 선행 작업으로 소개하며, 그중 LightOn의 연구는 표적화된 학습과 적응형 예산도 다룬다고 설명한다. 목차에는 학습 모델 사용, 평가 결과, 압축 기법 결합 등의 후속 항목이 있지만 해당 본문은 제공되지 않았으므로, 이 요약은 도입부에서 보고한 성능 수치와 실제로 제시된 방법 및 실행 예시에 근거한다.

🧾 핵심 주장 / 시사점

  • 양자화가 벡터 좌표의 저장 비용을 낮추는 상황에서도 문서당 벡터 수는 별도의 압축 축으로 남으며, 원문의 계산은 같은 차원과 정밀도에서 풀링이 잔차 저장량을 줄이는 효과를 보여준다.
  • 풀링 인지 학습의 핵심은 압축 연산을 적용하는 것뿐 아니라 압축된 표현의 검색 오류를 같은 인코더에 되돌려 주는 데 있다. 다만 군집 할당 자체는 미분하지 않는다는 학습상의 구분이 있다.
  • distance_threshold로 목표 평균을 맞추는 방식은 문서별 벡터 수의 유연성을 제공하지만, 보정된 평균이 다른 코퍼스에서도 그대로 유지된다는 보장은 없다. 또한 제공된 본문만으로는 도입부 성능 수치의 상세 평가 조건이나 커널 가속의 실측 효과를 판단할 수 없다.

✅ 액션 아이템

  • pool_factor=4의 같은 벡터 예산에서 일반 학습과 풀링 인지 학습의 NanoBEIR nDCG@10 유지율을 비교하고, 보고된 94.6%와 97.8%의 차이를 검토.
  • distance_threshold를 평균 16개 벡터 목표로 보정할 때 문서별 벡터 수와 다른 코퍼스에서 달라질 수 있는 실제 평균을 확인.
  • 배포할 풀링 조건에 맞춰 MultiVectorTokenPoolingLoss의 조건과 가중치를 선택하고, 조건 추가에 따른 군집화와 점수 계산 비용을 함께 검토.

❓ 열린 질문

  • pool_factor=4에서 보고된 NanoBEIR nDCG@10 유지율 97.8%는 다른 문서 집합에서도 유지되는가?
  • distance_threshold를 평균 16개 벡터에 맞춰 보정했을 때 다른 코퍼스의 실제 평균은 얼마나 달라지는가?
  • 비압축 손실과 pool_factor=4 압축 손실의 가중치를 각각 0.5에서 변경하면 압축 전후 검색 품질은 어떻게 달라지는가?

관련 문서

공통 태그와 주제 흐름을 기준으로 같이 보면 좋은 문서를 이어서 제안합니다.