본문으로 건너뛰기

© 2026 Molayo

HuggingFace헤드라인2026. 05. 08. 13:14

Training and Finetuning Sparse Embedding Models with Sentence Transformers

요약

본 기사는 희소 임베딩 모델(Sparse Embedding Models)을 파인튜닝하는 과정과 구성 요소를 심층적으로 다룹니다. 일반적인 밀집 임베딩 모델이 저차원 벡터를 생성하는 것과 달리, 희소 임베딩 모델은 대부분의 값이 0인 고차원 벡터를 생성하며, 이는 각 토큰에 대한 해석 가능성을 제공합니다. 특히 SPLADE와 같은 신경망 기반 희소 모델은 원본 텍스트를 의미적으로 관련된 용어로 자동으로 확장(query/document expansion)하는 능력이 뛰어나며, 이를 통해 검색 및 유사도 계산의 정확도를 높일 수 있습니다.

핵심 포인트

  • 희소 임베딩 모델은 대부분의 값이 0인 고차원 벡터를 생성하여 각 토큰 기여도를 해석할 수 있게 합니다.
  • 신경망 희소 모델(예: SPLADE)은 원본 텍스트에 없던 의미적으로 관련된 용어로 자동으로 확장하는 능력을 가집니다 (Query/Document Expansion).
  • 임베딩의 교집합(Intersection)을 계산하여 두 문서가 공유하는 핵심 개념이나 토큰을 추출할 수 있습니다.
  • 희소 임베딩 모델 파인튜닝에는 모델, 데이터셋, 손실 함수, 훈련 인수 등 체계적인 구성 요소들이 필요합니다.

Sparse embedding models 을 finetuning 하는 과정에는 여러 구성 요소가 포함됩니다: 모델, 데이터셋, 손실 함수 (loss functions), 훈련 인수 (training arguments), 평가자 (evaluators), 그리고 트레이너 클래스 (trainer class). 각 구성 요소를 살펴보고, 이를 사용하여 강력한 sparse embedding models 을 finetuning 하는 실제 예시를 함께 살펴보겠습니다.

Hugging Face Hub 에서 사용할 수 있는 다양한 사전 학습된 sparse encoders 를 선택할 수 있습니다. 이 공간을 탐색하기 위해 우리는 가장 관련성 높은 모델들을 강조하는 SPLADE Models 컬래션을 정리했습니다.

우리는 문서 (Documentation) 의 Pretrained Models 섹션에서 가장 두드러진 것들과 그 벤치마크 결과를 나열합니다.

  • Sparse Embedding models 은 무엇인가요?
  • 왜 Finetune 해야 할까요?
  • Training Components
  • Model
  • Dataset
  • Loss Function
  • Training Arguments
  • Evaluator
  • Trainer
  • Evaluation
  • Training Tips
  • Vector Database Integration
  • Additional Resources

"Embedding models"이라는 더 넓은 용어는 입력 (보통 텍스트) 을 의미론적 의미를 포착하는 벡터 표현 (embedding) 으로 변환하는 모델을 지칭합니다. 원본 입력과 달리, 이러한 embedding 에 대해 수학적 연산을 수행할 수 있으며, 검색 (search), 클러스터링 (clustering), 분류 (classification) 등 다양한 작업에 사용할 유사도 점수 (similarity scores) 를 얻을 수 있습니다.

Dense embedding models, 즉 일반적인 종류에서는 embedding 이 대부분 0 이 아닌 값이 있는 저차원 벡터 (예: 384, 768, 또는 1024 차원) 입니다. 반면에 Sparse embedding models 은 대부분의 값이 0 인 고차원 벡터 (예: 30,000+ 차원) 를 생성합니다. 일반적으로 sparse embedding 의 활성 차원 (즉, 0 이 아닌 값을 가진 차원) 은 모델의 어휘 (vocabulary) 에서 특정 토큰에 해당하여 해석 가능성 (interpretability) 을 제공합니다.

예를 들어 naver/splade-v3 라는 최상급 sparse embedding model 을 살펴보겠습니다:

from sentence_transformers import SparseEncoder
# 🤗 Hub 에서 다운로드
model = SparseEncoder("naver/splade-v3")
...
Sentence: The weather is lovely today.
Decoded: [('weather', 2.754288673400879), ('today', 2.610959529876709), ('lovely', 2.431990623474121), ('currently', 1.5520408153533936), ('beautiful', 1.5046082735061646), ('cool', 1.4664798974990845), ('pretty', 0.8986214995384216), ('yesterday', 0.8603134155273438), ('nice', 0.8322536945343018), ('summer', 0.7702118158340454)]
Sentence: It's so sunny outside!
...

이 예제에서는 임베딩이 모델의 어휘에서 각 토큰에 해당하는 30,522 차원 벡터입니다. decode 방법은 임베딩에서 가장 높은 값을 가진 상위 10 개의 토큰을 반환하여 임베딩에 가장 많은 기여를 하는 토큰을 해석할 수 있게 합니다.

우리는 또한 두 텍스트가 왜 유사하거나 불유사하게 간주되는지 결정하는 데 매우 유용한 임베딩 간의 교집합 또는 중첩을 결정할 수도 있습니다:

# 첫 번째 임베딩의 교집합/중첩도 계산해봅시다
intersection_embedding = model.intersection(embeddings[0], embeddings[1])
decoded_intersection = model.decode(intersection_embedding)
...
Decoded: [('weather', 3.0842742919921875), ('cool', 1.379457712173462), ('summer', 0.5275946259498596), ('comfort', 0.3239051103591919), ('sally', 0.22571465373039246), ('julian', 0.14787325263023376), ('nature', 0.08582140505313873), ('beauty', 0.0588383711874485), ('mood', 0.018594780936837196), ('nathan', 0.000752730411477387)]

신경망 희소 임베딩 모델의 핵심 구성 요소는 쿼리/문서 확장 (query/document expansion) 입니다. BM25 와 같은 전통적인 단어 기반 방법과 달리, 신경망 희소 모델은 일반적으로 원본 텍스트를 의미적으로 관련된 용어와 자동으로 확장합니다:

전통적, 단어 기반 (예: BM25): 텍스트의 정확한 토큰에만 매칭 신경희소 모델: 관련 용어로 자동으로 확장

예를 들어, 위의 코드 출력에서 문장 "The weather is lovely today" 는 원래 텍스트에 없던 "beautiful", "cool", "pretty", "nice" 같은 용어를 포함하도록 확장됩니다. 마찬가지로 "It's so sunny outside!" 는 "weather", "summer", "sun" 을 포함하도록 확장됩니다.

이러한 확장은 신경망 희소 모델이 정확한 토큰 매칭 없이도 의미적으로 관련된 내용이나 동의어를 매칭할 수 있고, 오타를 처리하며, 어휘 불일치 문제를 극복할 수 있게 합니다. 이것이 SPLADE 와 같은 신경망 희소 모델이 전통적인 단어 기반 검색 방법보다 우수한 성능을 보임과 동시에 희소 표현의 효율성 이점을 유지하는 이유입니다.

그러나 확장은 위험성을 가집니다. 예를 들어, "What is the weather on Tuesday?" 의 쿼리 확장은 "monday", "wednesday" 등으로 확장될 가능성이 높으며 이는 원하지 않을 수 있습니다.

요약하자면, 신경망 희소 임베딩 모델은 BM25 와 같은 전통적인 단어 기반 방법과 Sentence Transformers 와 같은 밀도 기반 임베딩 모델 사이의 가치 있는 틈새에 위치합니다. 이들은 다음과 같은 이점을 가집니다:

혼합 잠재력 (Hybrid potential): 밀도 기반 모델과 매우 효과적으로 결합되며, 단어 일치가 중요한 검색에서 어려움을 겪을 수 있습니다.

해석 가능성 (Interpretability): 매칭에 기여하는 토큰이 정확히 보입니다.

성능 (Performance): 많은 리트리벌 작업에서 밀도 기반 모델과 경쟁적이거나 더 좋습니다.

이 블로그 포스트에서는 "스파르스 임베딩 모델"과 "스파르스 인코더 모델"을 상호 교환적으로 사용합니다.

대부분의 (신경망) 스파르스 임베딩 모델은 의미는 거의 같지만 단어가 공유되지 않은 텍스트를 매칭할 수 있도록 aforementioned 쿼리/문서 확장을 사용합니다. 즉, 모델은 동의어를 인식해야 최종 임베딩에 해당 토큰을 배치할 수 있습니다.

대부분의 오프더박스 스파르스 임베딩 모델은 "supermarket", "food", "market"이 "grocery"를 포함하는 텍스트의 유용한 확장이 된다는 것을 쉽게 인식하지만, 예를 들어:

  • "The patient complained of severe cephalalgia."

는 다음과 같이 확장됩니다:

'##lal', 'severe', '##pha', 'ce', '##gia', 'patient', 'complaint', 'patients', 'complained', 'warning', 'suffered', 'had', 'disease', 'complain', 'diagnosis', 'syndrome', 'mild', 'pain', 'hospital', 'injury'

하지만 우리는 "cephalalgia"의 일반적인 단어가 "headache"라고 확장되기를 원합니다. 이 예시는 여러 도메인에 적용되며, 예를 들어 "Java"가 프로그래밍 언어인지, "Audi"가 자동차를 만드는지, "NVIDIA"가 그래픽 카드를 만드는 회사인지를 인식하지 못합니다.

파인튜닝을 통해 모델은 중요하게 여기는 도메인과/또는 언어에만 집중할 수 있습니다.

Sentence Transformer 모델을 훈련하는 과정에는 다음 구성 요소가 포함됩니다:

모델 (Model): 훈련하거나 파인튜닝할 모델로, 사전 학습된 스파르스 인코더 모델 또는 기본 모델일 수 있습니다.

데이터셋 (Dataset): 훈련 및 평가에 사용되는 데이터입니다.

손실 함수 (Loss Function): 모델의 성능을 정량화하고 최적화 과정을 안내하는 함수입니다.

훈련 인수 (Training Arguments)(선택 사항): 훈련 성능과 추적/디버깅에 영향을 미치는 매개변수입니다.

평가자 (Evaluator)(선택 사항): 훈련 전, 중, 후 모델 평가를 위한 도구입니다.

트레이너 (Trainer): 모델을 데이터셋, 손실 함수 및 기타 구성 요소와 결합하여 훈련합니다.

이제 각 구성 요소를 자세히 살펴보겠습니다.

Sparse Encoder 모델은 많은 유연성을 허용하기 위해 모듈의 시퀀스, Sparse Encoder 전용 모듈 또는 커스텀 모듈로 구성됩니다. Sparse Encoder 모델을 더 세밀하게 조정 (fine-tune) 하고 싶다면 (예: modules.json 파일이 있는 경우), 어떤 모듈을 사용했는지 걱정할 필요가 없습니다:

from sentence_transformers import SparseEncoder
model = SparseEncoder("naver/splade-cocondenser-ensembledistil")

하지만 다른 체크포인트에서부터 또는 처음부터 훈련하고 싶다면, 다음이 가장 일반적인 아키텍처입니다:

Splade 모델은 MLMTransformer 모듈을 사용하여 사전 학습된 Masked Language Modeling 트랜스포머 모델을 로드합니다 (예: BERT, RoBERTa, DistilBERT, ModernBERT 등) 그리고 SpladePooling 모듈은 MLMHead 의 출력을 풀어서 단어휘의 크기의 단일 희소 임베딩을 생성합니다.

from sentence_transformers import models, SparseEncoder
from sentence_transformers.sparse_encoder.models import MLMTransformer, SpladePooling
# Fill-mask 모델을 사용하여 MLM 트랜스포머 초기화
...

이 아키텍처는 SparseEncoder 에 fill-mask 모델 아키텍처를 제공하면 기본값으로 사용되므로, 이를 사용하는 것이 더 쉽습니다:

from sentence_transformers import SparseEncoder
model = SparseEncoder("google-bert/bert-base-uncased")
# SparseEncoder(
...

Inference-free Splade 는 쿼리와 문서에 대해 다른 모듈을 가진 Router 모듈을 사용합니다. 일반적으로 이 유형의 아키텍처에서 문서 부분은 전통적인 Splade 아키텍처 ( MLMTransformer 를 사용하여 사전 학습된 Masked Language Modeling 트랜스포머 모델을 로드하고 SpladePooling 모듈을 사용하여 단어휘의 크기의 단일 희소 임베딩을 생성) 이고 쿼리 부분은 SparseStaticEmbedding 모듈로, 쿼리의 모든 토큰에 대해 미리 계산된 점수를 반환합니다.

from sentence_transformers import SparseEncoder
from sentence_transformers.models import Router
from sentence_transformers.sparse_encoder.models import SparseStaticEmbedding, MLMTransformer, SpladePooling
...

이 아키텍처는 경량 SparseStaticEmbedding 접근법을 사용하여 쿼리 처리 시간을 빠르게 처리할 수 있게 하며, 이는 선형 가중치로 훈련되고 볼 수 있습니다. 반면 문서는 전체 MLM 트랜스포머와 SpladePooling 을 사용하여 처리됩니다.

Inference-free Splade 는 쿼리 지연 시간이 중요한 검색 응용 프로그램에 특히 유용하며, 계산 복잡도를 문서 인덱싱 단계로 이동시킵니다. 이는 오프라인에서 수행할 수 있습니다.

Router 모듈을 사용하여 모델을 훈련할 때, router_mapping 을 사용해야 합니다.

SparseEncoderTrainingArgumentsrouter_mapping` 인자를 사용하여 학습 데이터 컬럼을 올바른 경로 (

AI 자동 생성 콘텐츠

본 콘텐츠는 Hugging Face Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
2

댓글

0