본문으로 건너뛰기

© 2026 Molayo

HuggingFace헤드라인2026. 05. 07. 19:36

Sentence Transformers 를 활용한 Reranker 모델 학습 및 Fine-tuning

요약

본 기사는 Reranker 모델을 효과적으로 학습하고 미세 조정(Fine-tuning)하는 방법을 포괄적으로 다룹니다. Reranker는 쿼리와 문서 쌍의 관련성을 평가하는 Cross Encoder 아키텍처를 사용하며, 이는 일반적인 임베딩 모델보다 더 높은 성능을 보일 수 있습니다. 기사는 데이터셋, 손실 함수, 학습 인자, 평가기 등 Fine-tuning에 필요한 핵심 구성 요소들을 설명하고, 도메인 특화 데이터를 활용하여 범용 모델의 한계를 뛰어넘는 강력한 맞춤형 Reranker를 구축하는 방법을 제시합니다.

핵심 포인트

  • Reranker 모델은 쿼리와 문서 쌍 간의 관련성을 평가하며, Cross Encoder 아키텍처를 사용하여 높은 성능을 달성할 수 있습니다.
  • Cross Encoder 방식은 모든 가능한 쌍을 처리해야 하므로 느리지만, 초기 검색 단계에서 얻은 Top-k 결과를 재정렬(Reranking)하는 데 이상적입니다.
  • 모델의 성능 극대화를 위해서는 도메인 특화 데이터셋을 활용하여 Reranker를 Fine-tuning 하는 것이 매우 중요합니다.
  • Reranker 학습에는 데이터셋, 손실 함수, 훈련 인자, 평가기 등 여러 구성 요소가 필요하며, Hugging Face 라이브러리를 통해 통합적으로 관리할 수 있습니다.

Reranker 모델의 Fine-tuning 은 데이터셋, 손실 함수 (loss functions), 학습 인수 (training arguments), 평가자 (evaluators) 및 트레이너 클래스 (trainer class) 등 여러 구성 요소를 포함합니다. 각 구성 요소에 대한 실용적인 예제와 함께 강력한 reranker 모델을 Fine-tuning 하는 방법을 살펴보겠습니다.

마지막으로, 평가 섹션에서는 이 블로그 포스트를 작성하는 동안 훈련한 작은 Fine-tuned tomaarsen/reranker-ModernBERT-base-gooaq-bce reranker 모델이 저의 평가 데이터셋에서 가장 많이 사용되는 13 개 공개된 reranker 모델을 압도적으로 능가함을 보여드리겠습니다. 심지어 4 배 더 큰 모델을 제압하기도 합니다.

더 큰 베이스 모델을 반복하여 훈련하면 tomaarsen/reranker-ModernBERT-large-gooaq-bce 를 얻을 수 있으며, 이는 저의 데이터에서 모든 기존 일반 목적용 reranker 모델을 물리치며 압도적인 성능을 보입니다.

Embedding 모델의 Fine-tuning에 관심이 있으신 경우, 제 이전 'Sentence Transformers 를 활용한 Embedding 모델 학습 및 Fine-tuning' 블로그 포스트를 참조하시기 바랍니다.

  • Reranker 모델은 무엇인가요?
  • 왜 Fine-tune 해야 할까요?
  • 학습 구성 요소
  • 데이터셋
  • 손실 함수
  • 학습 인수
  • 평가자
  • 트레이너
  • 학습 팁
  • 평가
  • 추가 리소스

Reranker 모델은 일반적으로 Cross Encoder 아키텍처를 사용하여 구현되며, 텍스트 쌍 (예: 쿼리와 문서 또는 두 문장) 간의 관련성을 평가하는 데 설계되었습니다. Sentence Transformers (a.k.a. bi-encoders, embedding models) 는 각 텍스트를 독립적으로 벡터로 임베딩하고 거리 계산을 통해 유사도를 계산하는 것과 달리, Cross Encoder 는 공유 신경 네트워크를 통해 텍스트 쌍을 함께 처리하여 하나의 출력 점수를 생성합니다. 두 텍스트가 서로에 대해 주의를 기울일 수 있도록 함으로써 Cross Encoder 모델은 Embedding 모델을 능가할 수 있습니다.

그러나 이 강점은 단점이 따릅니다: Cross Encoder 모델은 모든 가능한 텍스트 쌍 (예: 10 개의 쿼리와 500 개의 후보 문서) 을 처리해야 하므로 더 느립니다. 이는 대규모 초기 검색에는 비효율적이지만, 빠른 Sentence Transformer 모델이 먼저 식별한 Top-k 결과를 Reranking(재정렬)하는 데 이상적입니다. 가장 강력한 검색 시스템은 일반적으로 이 2 단계 '검색 및 Rerank' 접근법을 사용합니다.

이 블로그 포스트에서는 'reranker 모델'과 'Cross Encoder 모델'을 상호 교환적으로 사용할 것입니다.

Reranker 모델은 종종 어려운 문제를 수행하도록 의뢰됩니다:

이러한 관련성 높은 문서 중 어떤 것이 쿼리에 가장 잘 답합는가?

일반 목적용 reranker 모델은 다양한 도메인과 주제에서 이 정확한 질문을 적절히 수행할 수 있도록 훈련되며, 이는 특정 도메인에서 최대 성능에 도달하지 못하게 합니다. Fine-tuning 을 통해 모델은 귀하에게 중요한 도메인과/또는 언어에만 집중하도록 학습할 수 있습니다.

이 블로그 포스트의 평가 섹션 말미에서는 도메인에 대한 모델을 훈련하면 일반 목적용 reranker 모델을 능가할 수 있음을 보여드리겠습니다. 이러한 베이스라인이 훨씬 더 크더라도 마찬가지입니다. 도메인 Fine-tuning 의 힘을 과소평가하지 마십시오!

Reranker 모델을 훈련하는 데는 다음과 같은 구성 요소가 포함됩니다:

데이터셋: 모델 훈련 및/또는 평가에 사용되는 데이터.
손실 함수 (Loss Function): 모델의 성능을 측정하고 최적화 과정을 안내하는 함수.
훈련 인자 (Training Arguments) (선택 사항): 훈련 성능, 추적, 디버깅에 영향을 미치는 파라미터.
평가기 (Evaluator) (선택 사항): 훈련 전, 중, 후 모델 평가를 위한 클래스.
트레이너 (Trainer): 모든 훈련 구성 요소를 통합합니다.

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

CrossEncoderTrainer

훈련 및 평가에 datasets.Dataset 또는 datasets.DatasetDict 인스턴스를 사용합니다. Hugging Face Datasets Hub 에서 데이터를 로드하거나 선호하는 형식 (예: CSV, JSON, Parquet, Arrow, 또는 SQL) 으로 로컬 데이터를 사용할 수 있습니다.

참고: Sentence Transformers 와 함께 바로 작동하는 많은 공개 데이터셋은 Hugging Face Hub 에 sentence-transformers 태그가 붙어 있으므로 https://huggingface.co/datasets?other=sentence-transformers 에서 쉽게 찾을 수 있습니다. 이러한 것들을 둘러보며 작업, 도메인, 또는 언어에 유용할 수 있는 준비된 데이터셋을 찾아보세요.

load_dataset 함수를 사용하여 Hugging Face Hub 의 데이터셋에서 데이터를 로드할 수 있습니다:

from datasets import load_dataset
train_dataset = load_dataset(

if your columns are not ordered correctly. For example, if your dataset has `[

However, you might want more detailed metrics beyond just the evaluation loss. That's where evaluators can help you assess your model's performance using specific metrics at various stages of training. You can use an evaluation dataset, an evaluator, both, or neither, depending on your needs. The evaluation strategy and frequency are controlled by the `eval_strategy` and `eval_steps` Training Arguments.

Sentence Transformers includes the following built-in evaluators:

| Evaluator | Required Data |
|---|---|
`CrossEncoderClassificationEvaluator` | Pairs with class labels (binary or multiclass) |
`CrossEncoderCorrelationEvaluator` | Pairs with similarity scores |
`CrossEncoderNanoBEIREvaluator` | No data required |
`CrossEncoderRerankingEvaluator` | List of `{'query': '...', 'positive': [...], 'negative': [...]}` dictionaries. Negatives can be mined with `mine_hard_negatives` |

You can also use `SequentialEvaluator` to join multiple evaluators into one, which can then be passed to the `CrossEncoderTrainer`. You can also just pass a list of evaluators to the trainer.

Sometimes you don't have the required evaluation data to prepare one of these evaluators on your own, but you still want to track how well the model performs on some common benchmarks. In that case, you can use these evaluators with data from Hugging Face.

The STS Benchmark (a.k.a. STSb) is a commonly used benchmarking dataset to measure the model's understanding of semantic textual similarity of short texts like "A man is feeding a mouse to a snake.".

Feel free to browse the sentence-transformers/stsb dataset on Hugging Face.

```python
from datasets import load_dataset
from sentence_transformers import CrossEncoder
from sentence_transformers.cross_encoder.evaluation import CrossEncoderCorrelationEvaluator
...

Preparing data for CrossEncoderRerankingEvaluator can be difficult as you need negatives in addition to your query-positive data.

The mine_hard_negatives function has a convenient include_positives parameter, which can be set to True to also mine for the positive texts. When supplied as documents (which have to be 1. ranked and 2. contain positives) to CrossEncoderRerankingEvaluator, the evaluator will not just evaluate the reranking performance of the CrossEncoder, but also the original rankings by the embedding model used for mining.

For example:

CrossEncoderRerankingEvaluator: Evaluating the model on the gooaq-dev dataset:
Queries: 1000 Positives: Min 1.0, Mean 1.0, Max 1.0 Negatives: Min 49.0, Mean 49.1, Max 50.0
Base -> Reranked
...

Note that by default, if you are using CrossEncoderRerankingEvaluator with documents, the evaluator will rerank with all positives, even if they are not in the documents. This is useful for getting a stronger signal out of your evaluator, but does give a slightly unrealistic performance. After all, the maximum performance is now 100, whereas normally its bounded by whether the first-stage retriever actually retrieved the positives.

You can enable the realistic behaviour by setting always_rerank_positives=False when initializing CrossEncoderRerankingEvaluator. Repeating the same script with this realistic two-stage performance results in::

CrossEncoderRerankingEvaluator: Evaluating the model on the gooaq-dev dataset:
Queries: 1000 Positives: Min 1.0, Mean 1.0, Max 1.0 Negatives: Min 49.0, Mean 49.1, Max 50.0
Base -> Reranked
...

AI 자동 생성 콘텐츠

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

원문 바로가기
2

댓글

0