다중 벡터 모델의 미세 조정은 모델 자체, 데이터셋, 손실 함수, 학습 인자, 평가자, 그리고 트레이너 클래스 등 여러 구성 요소로 이루어져 있습니다. 각 구성 요소를 살펴보고, 강력한 다중 벡터 모델을 미세 조정하는 데 실제로 어떻게 활용할 수 있는지에 대한 예제를 통해 알아보겠습니다.
마지막으로 평가 섹션에서, 이 블로그 게시물과 함께 단일 RTX 3090에서 14.5시간 만에 학습시킨 제 미세 조정된 멀티 벡터 인코더/mLateOn-medical 모델이 의료 검색 평가에서 제가 찾을 수 있는 모든 범용 검색 모델(밀집, 희소, 어휘 및 멀티 벡터 모델 포함)보다 훨씬 뛰어난 성능을 보여준다는 것을 보여드리겠습니다.
밀집 임베딩 모델, 희소 임베딩 모델 또는 재순위 모델 미세 조정에 관심이 있다면 이전에 작성한 " 임베딩 모델 학습 및 미세 조정" , "희소 임베딩 모델 학습 및 미세 조정" , "재순위 모델 학습 및 미세 조정" 블로그 게시물을 참고하시기 바랍니다.
이 블로그 게시물은 멀티 벡터 모델 학습 에 관한 것입니다. 벡터 데이터베이스에서 데이터를 로드하고 인코딩하고 인덱싱하는 등 모델 사용 방법에 대해 자세히 알아보려면 , 함께 게시된 "문장 변환기를 사용한 멀티 벡터(지연 상호작용) 임베딩 모델" 블로그 게시물을 참조하세요.
목차
멀티벡터 모델이란 무엇인가요?
밀집 임베딩 모델은 전체 텍스트를 단일 벡터로 압축하고, 유사도는 이러한 두 요약 벡터 간의 내적으로 계산됩니다. 다중 벡터 모델(후기 상호작용 모델 또는 ColBERT 스타일 모델이라고도 함)은 이러한 압축 과정을 생략합니다. 각 토큰마다 작은 벡터를 하나씩 유지하고 , MaxSim 연산자를 사용하여 문서에 대한 쿼리 점수를 계산합니다. 이 연산자에서는 모든 쿼리 토큰이 가장 잘 일치하는 문서 토큰을 찾고, 그 점수를 합산합니다. 토큰 수준 매칭은 단일 벡터에서 평균화 과정에서 제거해야 하는 세밀한 신호들을 그대로 보존하므로, 일반적으로 검색 성능이 향상되지만 인덱스 크기가 커집니다.
관련 블로그 게시물인 "다중 벡터 임베딩 모델" 에서 아키텍처, 인코딩, 스코어링 및 인덱싱에 대해 자세히 다루고 있으므로 이 부분은 간략하게 설명하고 바로 학습으로 넘어가겠습니다.
미세 조정이 필요한 이유는 무엇일까요?
다중 벡터 모델을 미세 조정하면 특정 도메인에서의 검색 성능이 크게 향상됩니다. 웹 검색, 법률 정보 검색, 코드 검색, 과학 문헌 검토 등 각 검색 분야는 어휘, 쿼리 스타일, 관련성 개념이 모두 다르기 때문입니다. 다중 벡터 모델은 쿼리와 문서를 토큰 단위로 매칭하기 때문에 단일 벡터 모델이 평균화 과정에서 놓치는 세밀한 도메인 특성을 포착할 수 있으며, 도메인 내 미세 조정 데이터가 조금만 있어도 매우 효과적으로 반응합니다.
게다가, 대부분의 기존 검색 모델은 짧은 문단에 맞춰 구성되어 있습니다. 고전적인 ColBERT 체크포인트는 문서를 180개 또는 300개 토큰에서 잘라내고, 많은 인기 있는 밀집 검색 모델은 256개 또는 512개 토큰에서 잘라냅니다. 이는 해당 모델들이 사용하는 MS MARCO 스타일의 학습 데이터가 그 길이를 넘는 경우가 드물기 때문입니다. 문서 길이가 길 경우, 이러한 모델들은 점수를 매기기 전에 대부분의 문서를 조용히 버립니다. 평균 941개 토큰으로 구성된 문단을 사용한 제 의학 데이터 분석에서, 이러한 문서 잘림으로 인해 최대 0.24 NDCG@10의 손실이 발생하는 것을 측정했는데, 이는 모델 아키텍처 간의 차이보다 훨씬 큰 수치입니다. 따라서 직접 모델을 학습시킬 때는 데이터에 필요한 문서 길이를 설정해야 합니다 .
LightOn은 코드 검색에서도 비슷한 문제를 겪었습니다. 일반적인 LateOn 모델 로는 부족했기에 LateOn-Code 모델을 따로 학습시켰습니다 . 의료, 법률, 금융 분야든 회사 내부 문서든, 현재 공식 LateOn 모델은 존재하지 않습니다. 이 블로그 게시물에서는 일반 소비자용 GPU 하나만으로 몇 시간 만에 공식 LateOn 모델을 직접 구축하는 방법을 소개합니다.
교육 구성 요소
멀티벡터인코더 모델 학습에는 다음과 같은 구성 요소가 포함됩니다.
- 모델 : 미세 조정할 모델 또는 새롭게 구축할 아키텍처.
- 데이터셋 : 훈련 및 평가에 사용되는 데이터.
- 손실 함수 : 모델의 성능을 측정하고 최적화 과정을 안내하는 함수입니다.
- 훈련 인수 (선택 사항): 훈련 성능, 추적 및 디버깅에 영향을 미치는 매개변수입니다.
- 평가자 (선택 사항): 학습 전, 학습 중 또는 학습 후에 모델을 평가하기 위한 클래스입니다.
- 트레이너 : 모든 교육 구성 요소를 통합합니다.
각 구성 요소를 좀 더 자세히 살펴보겠습니다.
모델
멀티 벡터 학습은 시작점을 선택할 수 있는 진정한 기회를 제공하며, 이는 예상보다 훨씬 중요합니다.
기존 다중 벡터 모델의 미세 조정
기존 멀티벡터 모델을 더욱 세밀하게 조정하고 싶다면 아키텍처에 대해서는 전혀 걱정할 필요가 없습니다.
체크포인트는 자체 레시피를 함께 제공합니다. 여기에는 쿼리 및 문서 마커 토큰, 프로젝션 헤드, 스코어링 스킵 목록이 포함됩니다. 미세 조정을 위해서는 일반적으로 이러한 모든 정보를 유지하고 데이터에 필요한 부분만 변경하는 것이 좋습니다. 가장 먼저 확인해야 할 것은 길이 구성입니다. 많은 기존 체크포인트는 문서 길이를 180~512개 토큰으로 제한하고 있기 때문입니다( 미세 조정의 이유 참조 ). 제가 사용하는 의학 관련 문서는 1,400개 토큰에 달합니다. mLateOn 제품군은 이미 백본의 전체 8192개 토큰 컨텍스트를 지원하지만, 시작 체크포인트에 길이 제한이 있는 경우 해당 제한을 해제해야 합니다.
작업별 제한이 설정되지 않은 경우 잘림 처리는 토크나이저의 방식으로 대체되므로 model_max_length위에서 로드 시 해당 제한을 구성하는 것입니다.
한 가지 변경 사항을 더 적용했는데, 문서 측 점수 계산 및 저장에서 구두점 토큰을 제외하는 구두점 스킵리스트를 추가했습니다. 4가지 기준(없음, 구두점, 불용어, 둘 다)으로 분석한 결과, 품질 면에서 약간 더 나은 결과를 보였고, 이 데이터에서 문서 인덱스 크기를 9.6% 줄이는 효과도 추가로 얻었습니다.
기본 변압기를 사용하여 하나를 제작합니다.
또한 임의의 기본 변환기를 지정할 수 있으며 MultiVectorEncoder, 그러면 새롭고 무작위로 초기화된 토큰 수준 프로젝션이 추가됩니다.
이것이 바로 전형적인 ColBERT 파이프라인입니다. Transformer문맥에 맞는 토큰 임베딩을 생성하고, Dense각 임베딩을 128차원으로 축소하는 토큰 수준 투영을 수행하며, MultiVectorMask점수 계산에 어떤 토큰을 사용할지 결정하고, 마지막으로 토큰 수준 Normalize변환을 수행합니다. 투영은 무작위로 시작되므로 이 모델을 유용하게 사용하려면 학습이 필요합니다. 흥미롭게도, 이 방식은 강력한 밀집 임베딩 백본에서도 잘 작동합니다. 제 실험에서 Alibaba-NLP/gte-modernbert-base 데이터셋에 대한 새로운 투영은 투영 데이터와 25,000개의 학습 데이터 쌍만을 사용하여 기존 체크포인트 시작점과 0.03 이내의 차이를 보였습니다.
ColBERT 토큰화의 고전적인 기법( [MASK]쿼리 확장, [Q]/ [D]접두사 토큰, 문서 길이 제한, 구두점 건너뛰기 목록)은 모두 기본적으로 비활성화되어 있으며 구성 가능합니다. 전체 설정 방법은 사용자 지정 모델 생성하기를 참조하세요 . 참고로, 저는 [MASK]제 도메인 미세 조정을 위해 네 가지 구성으로 쿼리 확장을 테스트해 봤는데, 어느 것도 눈에 띄는 차이를 만들지 못했습니다. 따라서 고전적인 방법을 굳이 사용할 필요는 없습니다.
어떤 시작점을 선택해야 할까요?
저는 이 블로그 게시물을 준비하는 과정에서 이를 직접 측정했습니다. 6개의 시작점을 선택하고 MIRIAD 의 25,000개 의학 문제-지문 쌍을 사용하여 각각에 동일한 학습 방법을 적용한 다음, 50,000개의 지문으로 구성된 코퍼스에서 1,000개의 검증된 문제를 기준으로 평가했습니다.
결과는 놀라웠고, 두 가지 모델 계열 모두에서 동일하게 나타났습니다. * -unsupervised체크포인트는 완성된 모델보다 새로운 도메인에 훨씬 더 잘 적응하며, 시작값이 더 낮음에도 불구하고 완성된 모델을 앞지릅니다. 이 체크포인트는 대규모 대조 사전 학습 후, 일반 검색에 대한 지도 미세 조정 전에 위치하므로, 도메인 학습에서 되돌려야 하는 일반적인 목적의 조정 없이 모든 후기 상호작용 구조를 그대로 유지하고 있습니다. 반면, 완성된 체크포인트는 제가 시도한 모든 학습률에서 거의 변화가 없거나 오히려 퇴보했습니다.
따라서 선호하는 모델 패밀리가 사전 지도 학습 체크포인트를 제공한다면 거기서부터 시작하세요. 그렇지 않다면, 검색 기능이 잘 사전 학습된 백본에 새로운 프로젝션을 적용하는 것도 좋은 방법입니다. 완전히 완료된 체크포인트에서 시작하는 것은 도메인 적응 측면에서 가장 약한 옵션이지만, 가장 자연스러운 느낌을 줍니다.
데이터셋
MultiVectorEncoderTrainer학습 및 평가에 사용할 수 있는 용도 또는 datasets.Dataset사례 입니다. Hugging Face 데이터셋 허브datasets.DatasetDict 에서 데이터를 불러 오거나 원하는 형식(예: CSV, JSON, Parquet, Arrow 또는 SQL)의 로컬 데이터를 사용할 수 있습니다.
참고: Hugging Face Hub에는 Sentence Transformers와 바로 사용할 수 있는 다양한 공개 데이터셋이 태그되어 있으므로 https://huggingface.co/datasets?other=sentence-transformerssentence-transformers 에서 쉽게 찾을 수 있습니다 . 이러한 데이터셋을 살펴보고 작업, 분야 또는 언어에 유용한 바로 사용할 수 있는 데이터셋을 찾아보세요.
허깅 페이스 허브의 데이터
이 함수를 사용하여 load_dataset허브의 데이터 세트에서 데이터를 불러올 수 있습니다.
이 블로그 게시물에서 사용할 데이터셋은 MIRIAD 에서 가져온 440만 개의 의학 관련 질문 으로, 각 질문은 답변이 포함된 원문 지문과 쌍을 이루고 있습니다(평균 토큰 수 941개). 이처럼 간단한 (질문과 관련 지문) 쌍은 여러분의 도메인에 맞는 검색 학습 데이터를 수집하는 가장 쉬운 방법이며, 보시다시피 이것만으로도 충분합니다.
로컬 데이터
load_dataset또한 일반적인 파일 형식으로 로컬 데이터를 로드하는 데 사용할 수도 있습니다 .
로컬 데이터에 사전 처리가 필요한 경우, datasets.Dataset.from_dict리스트로 구성된 딕셔너리를 사용하여 데이터셋을 초기화할 수 있습니다.
데이터셋 형식
데이터셋 형식이 손실 함수와 일치하는지(또는 데이터셋 형식에 맞는 손실 함수를 선택하는지) 확인하는 것이 중요합니다. 데이터셋 형식이 손실 함수와 호환되는지 확인하는 과정은 두 단계로 이루어집니다.
- 손실 함수 개요 표 에 따라 손실 함수에 레이블이 필요한 경우 , 데이터 세트에 "label" 또는 "score"라는 이름의 열이 있어야 합니다 . 이 열이 자동으로 레이블로 사용됩니다.
- 손실 개요 표 에 따르면 "label" 또는 "score"로 명명되지 않은 모든 열은 입력값 으로 간주됩니다 . 나머지 열의 수는 선택한 손실에 대한 유효한 입력값의 수와 일치해야 합니다. 이러한 열의 이름은 중요하지 않으며 순서 만 중요합니다 .
이 외에도 다중 벡터 관련 특정 규칙이 두 가지 더 있습니다.
- 위치 기반 쿼리 및 문서 할당: 첫 번째 열은 쿼리 로 , 이후의 모든 열은 열 이름과 관계없이 문서router_mapping 로 포함됩니다. 이 기본값은 표준 학습 인수를 통해 열별로 재정의할 수 있습니다.
- 지식 정제 형식: 후보 문서당 한 열, 즉 각 행에 N개의 교사 점수 목록이 있습니다. 쿼리 및 문서 ID와 별도의 텍스트 데이터 세트를 함께 저장하는 KD 데이터 세트(예: lightonai/ms-marco-en-bge)의 경우 (query, document_1, ..., document_N, scores), ID 를 텍스트 로 즉시 변환하는 기능을 사용할 수 있습니다 .scoresresolve_ids
손실 함수
손실 함수는 주어진 데이터 배치에 대해 모델의 성능을 정량화하는 데 사용되며, 최적화 도구가 모델 가중치를 조정하여 더 유리한(즉, 더 낮은) 손실 값을 생성할 수 있도록 합니다. 작업에 적합한 손실 함수는 보유한 데이터와 달성하려는 목표에 따라 달라집니다. 전체 옵션 목록은 손실 함수 개요 에서 확인할 수 있습니다 .
질문-답변 또는 질문-지문 쌍과 같은 일반적인 경우, 가장 효과적인 방법은 배치 내 음성 데이터 학습(in-batch negatives training)입니다 . 이 방법에서는 배치 내의 모든 문서 중 하나씩 건너뛰어 각 쿼리에 대한 음성 데이터 역할을 합니다. 배치 크기가 클수록 더 많은 음성 데이터가 생성되어 학습 효과가 향상되므로, 실제로 는 GPU 용량에 관계없이 효과적인 배치 크기를 설정할 수 있는 MultiVectorMultipleNegativesRankingLossGradCache 버전인 `native_name`을 사용하는 것이 좋습니다 .CachedMultiVectorMultipleNegativesRankingLoss
이 mini_batch_size매개변수는 문서를 이 크기의 청크로 인코딩하여 메모리 사용량을 제한하는 반면, 실제 대조 배치 크기(아래 실행에서는 128이었고, 더 큰 배치를 사용해도 성능 향상은 없었습니다)는 자유롭게 선택할 수 있습니다. GradCache는 청크 크기에 관계없이 동일한 결과를 보장하므로, GPU 성능이 낮은 경우 청크 크기를 줄이면 실제 작업 시간만 약간 증가할 뿐입니다. 문서 길이가 매우 다양한 경우에는 mini_batch_num_tokens각 청크를 문서 개수가 아닌 총 토큰 예산에 맞춰 처리하는 GradCache를 고려해 보세요. 이렇게 하면 비정상적으로 긴 문서로 구성된 청크로 인해 메모리 사용량이 급증하는 것을 방지할 수 있습니다(제 경우 mini_batch_size=16에는 문서당 약 940개의 토큰이 GradCache에 해당합니다 mini_batch_num_tokens=15_000).
멀티 벡터 임베딩에서 흔히 scale=1.0발생하는 함정 중 하나는 대조 손실(contrastive loss)의 기본값이 20.0이라는 점입니다. 이는 밀집 임베딩(dense embedding)의 경우 기본값 scale=20.0이 20.0인 것과 대조 손실의 기본값입니다. 20.0이라는 값이 존재하는 이유는 코사인 유사도가 [-1, 1] 범위의 단일 값으로 표현되기 때문인데, 이는 소프트맥스 함수를 적용하기에는 너무 좁은 범위입니다. MaxSim 점수는 쿼리 토큰당 최적의 유사도 값을 하나씩 합산하므로 대략 [0, query_length]의 범위를 가집니다. 예를 들어 32개의 토큰으로 구성된 쿼리는 최대 32의 점수를 얻을 수 있습니다. 따라서 scale=20.0밀집 임베딩 학습 스크립트에서 해당 값을 복사해 오지 마십시오. 소프트맥스 함수가 포화되어 기울기가 손상될 수 있습니다.
더 강력한 교사로부터의 지식 증류, 즉 가장 강력한 범용 후기 상호작용 모델을 훈련하는 방법에 대해서는 훈련 개요MultiVectorDistillKLDivLoss 문서 의 지식 증류 탭을 참조하십시오 .
훈련 논거
이 클래스를 사용하면 학습 과정을 사용자 지정할 수 있습니다 MultiVectorEncoderTrainingArguments. 이 클래스를 통해 학습 속도에 영향을 줄 수 있는 매개변수를 조정하고 학습 중에 발생하는 상황을 이해하는 데 도움을 받을 수 있습니다.
가장 유용한 학습 인수에 대한 자세한 내용은 멀티 벡터 인코더 > 학습 개요 > 학습 인수 부분을 참조하세요 . 학습 효과를 극대화하려면 꼭 읽어보시기 바랍니다.
다음은 제가 실제로 실행한 학습 결과 값을 사용한 예시입니다.
이 중 몇 가지는 언급할 가치가 있습니다.
- prompts학습 과정에서 모델에 저장된 프롬프트가 자동으로 적용되지 않으므로, 프롬프트를 학습 열에 명시적으로 매핑해야 합니다. 여기서는 [Q] 질문 열과 [D] 지문 열에 체크포인트 마커를 지정하여 학습과 추론의 일관성을 유지합니다.
- max_length(의도적으로 설정하지 않음): 이 인수는 모델의 전체 서빙 길이보다 학습 비용을 낮추고자 할 때, 학습 중에만 토큰화를 제한합니다 . 이 데이터셋에서 이러한 단축 학습 방식의 비용을 측정해 보았습니다. 512개의 토큰으로 학습했을 때 속도는 약 2배 빨라졌지만 NDCG@10 값은 약 0.015 정도 손실되었고, 데이터 양이 늘어나도 손실 폭은 줄어들지 않았습니다. 모델이 잘린 부분을 전혀 인식하지 못하기 때문입니다. 학습과 추론의 균형을 맞추려면, 품질보다 속도 향상이 더 중요한 경우가 아니라면 이 인수를 설정하지 않는 것이 좋습니다.
- learning_rate=1e-4: 5e-6에서 2e-4로 대폭 수정해 본 결과, 평소보다 높은 학습률에서 가장 좋은 결과를 얻었습니다.
평가자
학습 중 모델 성능을 추적하려면 eval_dataset평가 손실을 트레이너에 전달할 수 있지만, 구체적인 검색 지표가 훨씬 더 유용합니다. Sentence Transformers에는 다중 벡터 모델을 위한 다음과 같은 내장 평가기가 포함되어 있습니다.
도메인 미세 조정을 위해서는 MultiVectorInformationRetrievalEvaluator자체적으로 구축한 홀드아웃 데이터로 만든 코퍼스가 중요합니다. 코퍼스 구축에 대한 팁 하나는 모델들을 구분할 수 있을 만큼 난이도가 높아야 한다는 것입니다. 제 경우에는 MIRIAD 문제들이 자체 원본 지문에서 생성되었기 때문에 검색이 매우 쉽습니다. 10,000개의 정답 지문만으로 거의 모든 모델이 0.97 NDCG@10 이상의 점수를 받았습니다. 만약 평가가 이처럼 포화 상태에 이른다면, 점수 분포가 넓어질 때까지 오답 지문(저는 훈련 데이터에서 중복 제거된 지문을 사용합니다)을 추가하세요.
훈련자
여기서 이전의 모든 구성 요소가 하나로 통합됩니다. 다음은 서론에서 소개했던 모델인 multi-vector-encoder/mLateOn-medical을MultiVectorEncoderTrainer 학습시킨 전체 스크립트입니다 .
전체 레시피는 다음과 같습니다. 사전 지도 학습 체크포인트, 백만 개의 도메인 쌍, 배치 내 네거티브 데이터, 전체 문서 길이, 그리고 평소보다 높은 학습률. 제 RTX 3090 단일 그래픽 카드에서 최대 17.5GB VRAM을 사용했을 때 실행에 14.5시간이 걸렸으며, 모든 선택은 추측이 아닌 측정된 비교를 통해 얻은 결과였습니다.
예산이 부족한 독자분들을 위해, 제 확장성 실험 결과 10만 쌍(75분 학습)으로 100만 쌍 전체 실행 시와 0.012 NDCG@10 이내의 차이를 보였습니다. 성능 향상의 대부분은 첫 한 시간 안에 나타납니다.
콜백
MultiVectorEncoder 트레이너는 transformers.TrainerCallback다음과 같은 다양한 하위 클래스를 지원합니다.
- WandbCallbackW&B에 훈련 지표를 기록하려면 해당 기능이 wandb설치되어 있어야 합니다 .
- TensorBoardCallbacktensorboard접근 가능한 경우 학습 지표를 TensorBoard에 기록하기 위한 용도입니다.
- CodeCarbonCallback훈련 중 탄소 배출량 추적을 위해 codecarbon설치된 경우
report_to이러한 기능은 학습 인수를 통해 활성화할 수 있으며 report_to=["wandb", "codecarbon"], 필요한 종속성이 설치되어 있어야 합니다. 기본값은 이며 "none", report_to="all"종속성이 설치된 모든 통합 기능을 활성화합니다.
이러한 콜백 및 사용자 지정 콜백 생성 방법에 대한 자세한 내용은 Transformers 콜백 설명서를 참조하십시오 .
다중 데이터셋 학습
일반적으로 최고의 성능을 내는 범용 모델은 여러 데이터셋을 동시에 학습합니다. 하지만 각 데이터셋의 형식이 다양하기 때문에 이러한 접근 방식은 어려울 수 있습니다. 다행히 이 MultiVectorEncoderTrainer라이브러리를 사용하면 데이터셋 형식이 동일하지 않아도 여러 데이터셋을 학습할 수 있습니다. 또한 각 데이터셋에 서로 다른 손실 함수를 적용할 수 있는 유연성도 제공합니다. 다음은 여러 데이터셋을 동시에 학습하는 단계입니다.
- 인스턴스 사전 datasets.Dataset(또는 )을 (선택적으로 도 ) datasets.DatasetDict로 사용합니다 .train_dataseteval_dataset
- (선택 사항) 데이터셋 이름과 손실 함수를 매핑하는 손실 함수 사전을 사용합니다. 각 데이터셋에 대해 서로 다른 손실 함수를 사용하려는 경우에만 필요합니다.
각 학습/평가 배치에는 하나의 데이터셋에서 가져온 샘플만 포함됩니다. 여러 데이터셋에서 배치를 샘플링하는 순서는 열거형으로 정의되며 , 이 열거형은 를 통해 MultiDatasetBatchSamplers전달할 수 있습니다 . 유효한 옵션은 다음과 같습니다.MultiVectorEncoderTrainingArgumentsmulti_dataset_batch_sampler
- MultiDatasetBatchSamplers.ROUND_ROBIN각 데이터셋에서 라운드 로빈 방식으로 샘플링을 진행하여 하나의 데이터셋이 모두 소진될 때까지 반복합니다. 이 전략을 사용하면 각 데이터셋의 모든 샘플이 사용되지 않을 수 있지만, 각 데이터셋에서 동일한 비율로 샘플링이 이루어집니다.
- MultiDatasetBatchSamplers.PROPORTIONAL(기본값): 각 데이터셋의 크기에 비례하여 샘플링합니다. 이 전략을 사용하면 각 데이터셋의 모든 샘플이 사용되며, 데이터셋 크기가 클수록 더 자주 샘플링합니다.
평가
미세 조정된 모델의 성능을 확인하기 위해, 위 평가자 섹션에서 설명한 것과 동일한 방식으로 구축된 MIRIAD 평가 세트에서 4가지 아키텍처 계열에 걸쳐 50개 이상의 검색 모델 구성을 대상으로 평가를 진행했습니다. 이 평가 세트는 1,000개의 의학 관련 질문과 200,000개의 고유 지문(훈련 데이터에서 중복 제거된 190,000개의 방해 지문 중 숨겨진 10,000개의 정답 지문)으로 구성되어 있습니다. 이 코퍼스는 "어떤 시작점을 선택해야 할까요?" 에서 사용된 50,000개 지문 코퍼스의 4배 크기이므로 , 두 표의 점수는 직접 비교할 수 없습니다.
아래 접이식 표에서 전체 결과를 확인할 수 있으며, 주요 결과는 다음과 같습니다.
미세 조정된 모델이 모든 아키텍처 중 가장 강력한 제로샷 모델보다 NDCG@10 값이 +0.062만큼 높아 최고의 성능을 보였습니다. 다시 말해, 가장 강력한 제로샷 모델은 쿼리의 75.8%에서 정답 구절을 첫 번째 결과로 반환하는 반면, 미세 조정된 모델은 84.9%에서 정답을 반환하여 랭크 1 오류를 3분의 1 이상 줄였습니다.
아키텍처 패턴은 매우 명확하며, 표의 최상단은 전적으로 후기 상호작용에 초점을 맞추고 있습니다. 긴 문서의 경우, 동일한 학습 데이터와 백본을 사용하더라도 토큰당 하나의 벡터가 문서당 하나의 벡터보다 우수합니다. DenseOn과 LateOn은 헤드를 제외하고 학습 데이터와 아키텍처를 공유하며, 후기 상호작용 모델인 LateOn이 +0.12만큼 더 높은 성능을 보였고, 다국어 쌍(mDenseOn과 mLateOn)도 +0.13만큼 더 높은 성능을 보였습니다. 단일 벡터 모델은 규모 확장에도 불구하고 성능이 향상되지 않습니다. 제가 만든 모델보다 활성(비임베딩) 파라미터가 약 33배나 많은 가장 강력한 Dense 모델인 Qwen3-Embedding-4B 조차도 0.13만큼 부족한 성능을 보였으며, 8B 버전은 4B 버전보다 낮은 점수를 기록했습니다.
BM25는 놀라울 정도로 뛰어난 성능을 보여주며, 모든 희소 모델, 모든 절단 제한 멀티 벡터 모델, 그리고 Qwen3-Embedding-4B 및 8B 와 voyage-4-nano를 제외한 모든 밀집 모델을 능가합니다. voyage-4-nano 는 32,000개의 토큰으로 이루어진 전체 컨텍스트를 읽어 0.006의 근소한 차이로 앞섰습니다. 하지만 이러한 결과가 여러분의 데이터에도 그대로 적용될 것이라고 기대하지는 마세요. MIRIAD의 질문은 지문에서 생성되므로, 질의와 정답 지문 간의 어휘적 중복이 일반적인 검색보다 훨씬 큽니다. BM25는 컨텍스트 길이에 제한이 없기 때문에 대부분의 신경망 체크포인트가 단어를 잘라내는 것과 달리 모든 중복 단어를 활용할 수 있습니다. BM25 기준선은 비용이 저렴하고 실행해 볼 가치가 있지만, 이러한 성능 차이에 너무 의존하지는 마세요.
전체 후보지를 한눈에 볼 수 있도록 점수순으로 정렬하고 건축 양식별로 색상을 지정했습니다.
전체 평가표를 보려면 클릭하세요.표시된 모델들은 @N문서 길이 제한을 N 토큰으로 상향 조정하여 평가되었습니다. 원래 제한(180~512 토큰)으로는 평균 941 토큰 길이의 문단을 제대로 표시할 수 없었기 때문입니다. 모든 멀티 벡터 모델에서 이러한 상향 조정은 기존 데이터 행 대비 +0.08~+0.24 NDCG@10의 성능 향상을 가져왔으며, 밀집형 DenseOn 모델조차도 동일한 처리를 통해 +0.03의 성능 향상을 보였습니다.
참고로, 이는 multi-vector-encoder/mLateOn-medical 모델이 모든 영역 에서 가장 강력한 모델이라는 의미는 아닙니다 . 단지 제가 담당하는 영역 에서 가장 강력한 모델일 뿐입니다 . 저는 이 모델이 제 데이터에서 잘 작동하기만 하면 되기 때문에 전혀 문제가 없습니다.
도메인에 맞게 멀티 벡터 모델을 미세 조정하는 것의 위력을 과소평가하지 마세요. 일반 소비자용 GPU 하나에서 14시간 반 만에 이 데이터셋에서 어떤 범용 검색 엔진도 따라올 수 없는 성능을 내는 모델을 만들어냈습니다. 게다가 이 모든 과정은 교사 모델이나 마이닝된 네거티브 데이터셋 없이 단 하나의 스크립트만으로 이루어졌습니다!
인덱스 최적화
다중 벡터 검색에 대한 타당한 반론은 인덱스 크기이며, 이 도메인은 그에 대한 최악의 경우에 가깝습니다. 토큰당 하나의 벡터를 저장하는 제 모델은 문단당 약 878개의 벡터가 필요하므로, 20만 개의 문단으로 구성된 코퍼스는 fp16 기준으로 약 45GB의 용량을 차지합니다. 반면 밀집 모델은 1GB 미만의 용량만 필요합니다. 이러한 격차가 크게 발생하는 이유는 문서 길이 때문입니다. 관련 게시물 에 있는 자연어 질문 문단은 평균 약 125개의 토큰 벡터를 가지고 있는데, 이는 제 모델보다 7배나 적습니다. 따라서 짧은 문단으로 구성된 코퍼스는 이 모델보다 훨씬 작은 인덱스에서 시작합니다. 이 HierarchicalTokenPooling모듈은 각 문서의 토큰 임베딩을 클러스터링하고 클러스터 평균을 저장함으로써 정확히 이러한 문제를 해결하고, 대략적인 1 / pool_factor벡터 수만 유지합니다.
풀링을 고려한 학습 없이 완성된 모델을 대상으로 사후 측정해 본 결과, 긴 문서에서도 놀라울 정도로 비용이 적게 드는 것으로 나타났습니다.
솔리드 포인트는 압축되지 않은 임베딩이므로 모든 패밀리가 동일한 방식으로 계산되고 정확한 검색으로 점수가 매겨집니다. 하지만 실제로 이런 방식으로 배포하지는 않습니다. 밀집 인덱스는 일반적으로 int8 또는 이진 양자화와 재점수화를 사용하고, 희소 인덱스는 포스팅을 압축하며, 다중 벡터 인덱스는 PLAID 방식의 잔여 압축을 사용합니다. 이러한 점들을 구매해야 할 디스크 용량으로 생각하지 마시고, 상대적인 저장 비용으로 이해하시기 바랍니다.
실선은 토큰 풀링을 나타냅니다. 벡터 개수를 절반으로 줄이면 0.0033 NDCG@10의 비용이 발생하고 랭크 1 정확도는 그대로 유지됩니다. 벡터의 1/4만 남겨두는 11.2GB의 경우에도 여전히 0.8991의 점수를 얻습니다. 곡선은 계속 이어집니다(벡터의 1/10까지 측정해 보았지만 여전히 0.8765를 유지했습니다). 하지만 양자화가 고려 대상이 되면 풀링을 그 정도로까지 확장할 이유는 거의 없습니다. 아래 점선은 양자화에 대한 내용입니다.
점선은 실제 배포 환경이 어떻게 보일지 나타냅니다. 저는 오마르 카탑에게 모델과 벤치마크에 대한 조기 접근 권한을 제공했고, 그는 fast-plaid를 사용하여 1비트 잔여 양자화, 일반적인 64비트 정수 대신 압축된 17비트 중심 ID와 18비트 문서 ID, 그리고 문서 측 가지치기를 적용하여 이러한 구성을 측정했습니다.
첫 번째 행은 0.0155 NDCG@10에서 원시 임베딩보다 13배 작습니다. 이는 풀링 곡선의 어느 지점보다 훨씬 더 나은 절충안입니다. 양자화는 각 벡터의 크기를 줄이는 반면, 풀링과 가지치기는 유지할 벡터의 개수를 줄이므로 둘이 결합되어 작동하며, 따라서 양자화를 우선적으로 고려해야 합니다. 더 나아가 마지막 행은 1.45GB에 도달하는데, 이는 Qwen3-Embedding-8B 의 fp16 임베딩(1.64GB)보다 작 으면서도 0.0895 더 높은 점수를 얻습니다. 다중 벡터 인덱스가 너무 크다는 주장은 제대로 구성된 인덱스에서는 성립하지 않습니다.
여기서의 가지치기는 단순한 방식으로, 토큰 축소가 양자화 위에 적용된다는 것을 보여주기 위한 것이므로, 아래 두 행은 한계치로 이해해야 합니다. 양자화를 직접 조정하고 싶지 않다면, 관련 게시물의 인덱싱 섹션에서 fast-plaid, Qdrant, Weaviate, Vespa 등을 다룹니다.
다중 벡터 검색은 인덱스의 성능에 따라 비용이 결정됩니다. 이 코퍼스의 원시 임베딩 데이터는 45GB에 달하지만, 제대로 구성된 인덱스는 거의 동일한 정확도를 유지하면서 용량을 최소 7배 이상 줄입니다. 따라서 인덱스는 체크포인트만큼이나 중요하게 다뤄야 합니다.
감사의 말씀
인덱스 최적화 에서 양자화 및 가지치기된 인덱스 구성을 측정해 주신 Omar Khattab 님 과 후기 상호작용 인덱스 비용에 대한 논의에 감사드립니다 .
추가 자료
훈련 예제
이 페이지에는 설명이 포함된 학습 예제와 학습 스크립트 링크가 있습니다. 이를 통해 다중 벡터 학습 루프에 익숙해질 수 있습니다.
- MIRIAD : 의료 정보 검색에 대한 도메인별 교육으로, 이 블로그 게시물에서 소개하는 방법의 초기 버전이자 더 간단한 도구입니다.
- MS MARCO : 대조 및 지식 증류 레시피
- 멀티모달 : ColPali 스타일 시각적 문서 검색 학습
- PEFT 어댑터 : LoRA를 이용한 파라미터 효율적인 미세 조정
선적 서류 비치
더 자세한 학습을 위해 문장 변환에 관한 다음 자료들도 살펴보시기 바랍니다.
다음은 여러분이 관심을 가질 만한 고급 페이지입니다.
그리고 이 모델들을 사용하는 방법 에 대한 모든 것을 다루는 관련 블로그 게시물도 있습니다 .
