Multi-Vector Representation

A little pooling goes a long way for multi-vector representations – Answer.AI

ColBERT의 주요 약점인 벡터 수 폭증 문제를 해결하기 위해 토큰 풀링(token pooling) 기술의 초기 버전을 공개했습니다. 이 기술은 검색 성능 저하를 최소화하면서 메모리 및 디스크 사용량을 크게 줄일 수 있습니다.

주요 연구 결과는 다음과 같습니다:

  • 토큰 풀링은 거의 공짜 점심과 같습니다: 벡터 수를 크게 줄여 메모리 사용량을 감소시키면서도, 벡터를 적극적으로 양자화(quantised)하더라도 검색 성능 저셔하가 거의 없습니다.
  • 풀링 요소(Pool Factor) 2와 3에서 최적의 성능을 보입니다: 풀링 요소는 함께 풀링할 토큰의 최대 개수로, 압축률을 나타냅니다. 풀링 요소가 2일 때는 성능 저하가 거의 없었고, 3일 때도 약간의 저하만 있었으며, 4일 때도 준수한 성능을 보였습니다.
  • 간단하고 확장성이 뛰어납니다: 이 방법은 모델 수정이나 복잡한 처리 과정 없이 기존 ColBERT 모델에 바로 적용할 수 있으며, 일반적으로 ColBERT와 함께 사용하기 어려운 인덱싱 방법의 확장성을 크게 향상시킵니다.
  • 이미 사용 가능합니다: 이 기능은 이미 ColBERT에 적용되었으며, RAGatouille에서도 곧 지원될 예정입니다.

A.1.1) 다중 벡터 표현 (ColBERT): 원리와 방법

기존의 딥러닝 검색 방법은 크게 두 가지로 나뉩니다.

  • 교차 인코더 (Cross-Encoders): 쿼리와 문서를 함께 입력받아 처리하므로 최고의 검색 성능을 보이지만, 모든 쿼리/문서 쌍에 대해 모델을 실행해야 하므로 비용이 매우 높습니다.
  • 양방향 인코더 (Bi-Encoders): 문서와 쿼리를 각각 별도의 벡터로 변환하여 코사인 유사도로 관련성을 계산합니다. 계산 비용이 저렴하고 빠르지만, 단일 벡터에 모든 정보를 압축해야 하므로 성능 저하가 발생할 수 있습니다.

ColBERT와 다중 벡터 표현

ColBERT는 이 두 가지 방법의 장점을 결합한 “지연 상호작용(late interaction)” 방식의 다중 벡터 표현 모델입니다. 문서는 미리 토큰 단위의 벡터들로 변환해두고, 검색 시점에 쿼리 토큰과 문서 토큰들 간의 유사도를 계산합니다. 구체적으로 maxSim 연산을 통해 각 쿼리 토큰에 대해 가장 높은 문서 토큰과의 유사도 점수를 구한 뒤, 이 점수들을 합산하여 최종 유사도 점수를 계산합니다.

이 방식은 단일 벡터 방식보다 훨씬 더 세밀한 의미 정보를 포착하여 일반화 성능이 뛰어납니다.

다중 벡터 표현의 효율성 문제

ColBERT의 단점은 문서당 벡터 수가 많아져 저장 공간과 메모리 사용량이 급증하고 검색이 복잡해진다는 것입니다. 이를 해결하기 위해 ColBERT는 다음과 같은 방법을 사용합니다.

  1. 차원 축소: 출력 벡터의 차원을 768에서 128로 줄여 저장 공간을 줄입니다.
  2. 극단적 양자화 (Extreme Quantization): 각 토큰 벡터를 2비트로 압축하여 저장 공간을 약 6배 더 줄입니다.
  3. 후보 생성 (Candidate Generation): 검색 시 전체 문서가 아닌, 근사 검색을 통해 선별된 일부 후보 문서에 대해서만 maxSim 연산을 수행하여 계산 비용을 줄입니다.

하지만 이렇게 많은 벡터를 인덱싱하는 과정 자체가 비용이 많이 들고, 특히 문서를 추가하거나 삭제하는 CRUD(Create, Read, Update, Delete) 작업이 어렵다는 문제가 남아있습니다.


A.1.2) 토큰 풀링: 벡터 수 줄이기

Answer.AI가 제안하는 토큰 풀링은 이러한 문제를 해결하기 위한 간단한 방법입니다. 문서 내에서 의미적으로 유사한 토큰들을 클러스터링하고, 이들의 벡터 표현을 평균(mean pooling)하여 하나의 벡터로 만듭니다.

작동 원리

  1. 풀링 요소(Pool Factor) 정의: 벡터 수를 얼마나 줄일지 결정하는 비율입니다. 예를 들어 풀링 요소가 3이면, 전체 토큰 수를 1/3로 줄입니다.
  2. 클러스터링: 문서 내 모든 토큰 벡터 간의 코사인 유사도를 계산합니다.
  3. 계층적 클러스터링: 정의된 풀링 요소에 맞춰 유사도가 높은 토큰들을 클러스터로 묶습니다.
  4. 평균 풀링: 각 클러스터에 속한 토큰들의 벡터를 평균내어 하나의 대표 벡터를 생성합니다.

이 과정을 통해 문서당 벡터 수가 크게 줄어들어 메모리 및 디스크 사용량이 감소하고, CRUD 친화적인 인덱싱 방법의 확장성이 향상됩니다.

성능

실험 결과, 토큰 풀링은 매우 효과적인 것으로 나타났습니다.

  • 비압축 벡터: 풀링 요소가 2일 때 (벡터 수 50% 감소) 오히려 검색 성능이 약간 향상되었으며, 3일 때 (66% 감소)는 원본 성능의 99%를 유지했습니다.
  • 2비트 양자화 벡터: 양자화를 적용한 후에도 비슷한 경향을 보였습니다. 특히 대규모 데이터셋인 TREC-COVID에서는 풀링 요소가 2에서 6 사이일 때, 풀링된 벡터의 성능이 풀링되지 않은 벡터보다 약간 더 높게 나타났습니다.

흥미롭게도 Webis-Touché 데이터셋에서는 풀링 요소가 클수록 성능이 최대 40%까지 크게 향상되는 이례적인 결과를 보였습니다.