Sentence Transformers를 사용한 멀티모달 임베딩 & 리랭커 모델의 학습 및 파인튜닝
Hugging Face는 Sentence Transformers 라이브러리를 사용하여 멀티모달 임베딩 및 리랭커 모델을 학습하고 파인튜닝하는 방법을 보여주는 튜토리얼을 출시했으며, 이를 통해 사용자는 Qwen3-VL-Embedding-2B와 같은 모델을 Visual Document Retrieval과 같은 특정 작업에 맞게 조정할 수 있습니다.
왜 멀티모달 모델을 파인튜닝해야 하나요?
파인튜팅은 범용 멀티모달 모델을 특정 작업에 맞게 조정하여 검색 성능을 크게 향상시킵니다. 다양한 데이터로 학습된 범용 모델은 단일 작업에서 뛰어난 성능을 보이기 어렵습니다. Visual Document Retrieval의 경우, 도메인별 데이터로 파인튜팅하여 작성자의 실험에서 NDCG@10이 0.888에서 0.947로 증가했으며, 더 큰 모델보다 우수한 성능을 보였습니다.
멀티모달 Sentence Transformer 학습의 핵심 구성 요소
멀티모달 Sentence Transformer 모델을 학습하려면 모델, 데이터셋, 손실 함수, 학습 인수, 평가기, 트레이너라는 여섯 가지 구성 요소가 필요합니다. 파이프라인은 텍스트 전용 학습과 동일한 SentenceTransformerTrainer를 사용하며, 주요 차이점은 데이터셋에 여러 모달리티(텍스트, 이미지, 오디오, 비디오)가 포함되어 있고 모델의 프로세서가 전처리를 자동으로 처리한다는 점입니다.
멀티모달 학습을 위한 모델 준비
기존 멀티모달 임베딩 모델을 파인튜팅하려면 SentenceTransformer로 로드하고, 선택적으로 model_kwargs(정밀도 및 어텐션 구현용)와 processor_kwargs(이미지 해상도 경계용)를 지정할 수 있습니다. 또는 Vision-Language Model 체크포인트에서 시작할 수 있는데, Sentence Transformers는 모달리티를 추론하고 포워드 메서드 및 풀링을 설정하려고 시도합니다. Transformer 모듈은 프로세서를 검사하여 사용 가능한 모달리티를 결정하고, 필요한 경우 풀링이 자동으로 추가됩니다. model.modalities와 model.supports("modality))를 사용하여 지원되는 모달리티를 확인할 수 있습니다.
멀티모달 학습을 위한 데이터셋 요구 사항
데이터셋 형식은 손실 함수의 입력 요구 사항과 일치해야 합니다. "label" 또는 "score"를 제외한 다른 컬럼은 입력이며, 이들의 순서는 손실 함수의 유효한 입력 수와 일치해야 합니다. 입력에는 텍스트(문자열), 이미지(PIL 이미지, 파일 경로, URL, 또는 numpy/torch 배열), 오디오, 비디오, 또는 모달리티 이름을 값에 매핑하는 멀티모달 딕셔너리가 포함될 수 있습니다. 데이터 콜레이터는 model.preprocess()를 자동으로 호출하여 모달리티별 전처리를 처리하므로 수동 토큰화나 이미지 처리가 필요 없습니다.
멀티모달 검색을 위한 손실 함수
검색 작업에는 CachedMultipleNegativesRankingLoss를 사용하세요. 이 손실 함수는 하드 네거티브 컬럼이 여러 개인 (쿼리, 양성) 쌍을 받아들입니다. 각 쿼리의 유사도를 양성 쪽으로 올리고 모든 네거티브 쪽으로 내리며, 데이터셋의 하드 네거티브와 동일한 배치 내 다른 샘플의 인-배치 네거티브를 사용합니다. "캐시된" 변형은 미니배치 크기 파라미터로 제어되는 그래디언트 캐싱을 통해 큰 효과적인 배치 크기를 가능하게 합니다. 여러 차원에서 작동하는 임베딩을 생성하려면 기본 손실을 MatryoshkaLoss로 래핑하여, 임베딩을 더 작은 차원으로 잘라도 좋은 성능을 유지하도록 모델을 훈련시킵니다.
학습 인수 및 구성
SentenceTransformerTrainingArguments를 사용하여 학습을 구성합니다. 멀티모달 학습을 위한 주요 설정은 다음과 같습니다: VLMs의 수치적 안정성을 높이기 위해 bf16=True, 배치 샘플러를 BatchSamplers.NO_DUPLICATES로 설정하여 인-배치 네거티브가 고유한 샘플이 되도록 함, 그리고 gradient caching이 적용된 CachedMultipleNegativesRankingLoss 덕분에 per_device_train_batch_size를 64와 같은 값으로 설정 가능(메모리 관리 용이). eval_strategy, save_strategy, logging_steps를 분수(예: 0.1)로 설정하여 에포크의 10%마다 평가, 저장, 로그를 수행합니다.
멀티모달 검색을 위한 평가 설정
InformationRetrievalEvaluator를 사용하여 NDCG@10, MAP, Recall@k와 같은 메트릭을 계산합니다. 데이터셋에서 평가 데이터를 구성하려면: 쿼리와 코퍼스를 정수 ID로 매핑하고, 충돌을 피하기 위해 오프셋 ID를 사용하여 하드 네거티브를 코퍼스에 추가하며, 각 쿼리와 동일한 인덱스의 양성 문서를 관련 문서로 정의합니다. 평가기는 텍스트 쿼리, 하드 네거티브를 포함한 이미지 코퍼스, 그리고 쿼리-관련 문서 매핑을 입력으로 받습니다. 대형 VLM으로 인한 메모리 부족 문제를 방지하기 위해 평가 시 batch_size=1을 사용합니다.
학습 과정 및 결과
학습 스크립트는 SentenceTransformerTrainer를 통해 모델, 데이터셋, 손실 함수, 인수, 평가기를 통합합니다. 텍스트 전용 학습과의 차이점은: 모델 로드 시 model_kwargs와 processor_kwargs를 전달하고, 메모리 관리를 위해 mini_batch_size=1로 CachedMultipleNegativesRankingLoss를 사용하며, 코퍼스에 이미지가 있고 쿼리에 텍스트가 있는 평가기를 사용하는 것입니다. Visual Document Retrieval 예시에서 Qwen3-VL-Embedding-2B를 한 에포크 동안 파인튜팅하여 평가 세트에서 NDCG@10 0.947을 달성했으며, 이는 기본 모델의 0.888보다 향상된 성능이고, 테스트된 모든 VDR 모델(4배 더 큰 모델 포함)을 능가했습니다. Matryoshka 학습은 낮은 차원에서도 강한 성능을 가능하게 했습니다: 파인튜팅된 모델은 전체 2048 차원의 32배 작은 64 차원에서도 피크 NDCG@10의 92% 이상을 유지했습니다.
멀티모달 리랭커 모델 학습
멀티모달 크로스 인코더(리랭커) 모델은 CrossEncoderTrainer와 크로스 인코더 전용 손실 함수를 사용하여 파인튜팅할 수 있습니다. 이 과정은 임베딩 모델 학습과 유사하지만 SentenceTransformer 대신 CrossEncoder를 사용하고 적절한 손실 함수(BinaryCrossEntropyLoss 등)를 사용합니다. 아키텍처 선택에는 multimodal 언어 모델을 사용하여 토큰을 생성하고 로그 오즈를 계산하는 Any-to-Any with LogitScore, 또는 마지막 토큰의 은닉 상태를 추출하여 점수로 투영하는 Feature Extraction with Pooling and Dense가 포함됩니다. 학습 예시는 Sentence Transformers 저장소에서 확인할 수 있습니다.
추가 리소스
Sentence Transformers 저장소에는 멀티모달 학습 예시가 제공됩니다: Visual Document Retrieval, Multimodal Reranker (Any-to-Any), Multimodal Reranker (Feature Extraction). 문서에서는 학습 개요, 손실 함수, 데이터셋 처리, API 참조를 다룹니다. 동반 블로그 포스트에서는 멀티모달 추론, 텍스트 전용 임베딩 및 리랭커 학습, 스파스 인코더 학습, Matryoshka 임베딩, 정적 임베딩, 임베딩 양자화, 다국어 Visual Document Retrieval 등을 다룹니다.
Sources
관련
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch