Training and Finetuning Reranker Models with Sentence Transformers
Quick Summary
이 글은 Sentence Transformers로 reranker 또는 Cross Encoder 모델을 도메인 데이터에 맞게 학습·파인튜닝하는 구성요소, 데이터 형식, hard negative mining의 중요성을 설명하고, 저자가 학습한 ModernBERT 기반 reranker가 자신의 평가 데이터에서 기존 공개 모델들을 앞섰다고 소개한다.
🖼️ 인포그래픽
🖼️ 4컷 인포그래픽
💡 한 줄 요약
이 글은 Sentence Transformers로 reranker 또는 Cross Encoder 모델을 도메인 데이터에 맞게 학습·파인튜닝하는 구성요소, 데이터 형식, hard negative mining의 중요성을 설명하고, 저자가 학습한 ModernBERT 기반 reranker가 자신의 평가 데이터에서 기존 공개 모델들을 앞섰다고 소개한다.
📌 핵심 요약
- Sentence Transformers는 검색 증강 생성, 의미 검색, 의미 유사도, 패러프레이즈 마이닝 등에 쓰이는 embedding 및 reranker 모델을 사용하고 학습할 수 있는 Python 라이브러리이며, 글의 목표는 reranker 모델을 실제 데이터에 맞게 파인튜닝하는 방법을 설명하는 것이다.
- Reranker 모델은 보통 Cross Encoder 구조로 구현되며, query와 document 같은 두 텍스트를 따로 임베딩하지 않고 한 신경망 안에서 함께 처리해 관련성 점수를 출력한다. 이 방식은 두 텍스트가 서로 attention할 수 있어 성능상 이점이 있지만, 모든 텍스트 쌍을 계산해야 하므로 초기 대규모 검색에는 느리다.
- 강한 검색 시스템은 빠른 Sentence Transformer 기반 검색으로 후보를 먼저 좁힌 뒤, Cross Encoder reranker로 상위 후보를 다시 정렬하는 2단계 retrieve-and-rerank 방식을 자주 사용한다. 이 글에서는 reranker model과 Cross Encoder model이라는 표현을 같은 의미로 사용한다.
- 파인튜닝의 핵심 이유는 범용 reranker가 여러 도메인에서 무난히 동작하도록 학습되어 특정 도메인이나 언어에 최적화되기 어렵기 때문이다. 저자는 도메인 데이터로 학습한 모델이 훨씬 큰 범용 reranker보다도 자신의 평가 데이터에서 더 좋은 성능을 낼 수 있다고 강조한다.
- 학습 과정은 데이터셋, loss function, training arguments, evaluator, trainer로 구성된다. 특히 데이터셋 형식은 선택한 loss function 및 모델 출력 라벨 수와 맞아야 하며, reranker 성능을 높이려면 관련 없어 보이는 쉬운 negative보다 실제로 헷갈리는 hard negative를 잘 수집하는 것이 중요하다.
🧩 주요 포인트
- Sentence Transformers는 검색 증강 생성, 의미 검색, 의미 유사도, 패러프레이즈 마이닝 등에 쓰이는 embedding 및 reranker 모델을 사용하고 학습할 수 있는 Python 라이브러리이며, 글의 목표는 reranker 모델을 실제 데이터에 맞게 파인튜닝하는 방법을 설명하는 것이다.
- Reranker 모델은 보통 Cross Encoder 구조로 구현되며, query와 document 같은 두 텍스트를 따로 임베딩하지 않고 한 신경망 안에서 함께 처리해 관련성 점수를 출력한다. 이 방식은 두 텍스트가 서로 attention할 수 있어 성능상 이점이 있지만, 모든 텍스트 쌍을 계산해야 하므로 초기 대규모 검색에는 느리다.
- 강한 검색 시스템은 빠른 Sentence Transformer 기반 검색으로 후보를 먼저 좁힌 뒤, Cross Encoder reranker로 상위 후보를 다시 정렬하는 2단계 retrieve-and-rerank 방식을 자주 사용한다. 이 글에서는 reranker model과 Cross Encoder model이라는 표현을 같은 의미로 사용한다.
- 파인튜닝의 핵심 이유는 범용 reranker가 여러 도메인에서 무난히 동작하도록 학습되어 특정 도메인이나 언어에 최적화되기 어렵기 때문이다. 저자는 도메인 데이터로 학습한 모델이 훨씬 큰 범용 reranker보다도 자신의 평가 데이터에서 더 좋은 성능을 낼 수 있다고 강조한다.
- 학습 과정은 데이터셋, loss function, training arguments, evaluator, trainer로 구성된다. 특히 데이터셋 형식은 선택한 loss function 및 모델 출력 라벨 수와 맞아야 하며, reranker 성능을 높이려면 관련 없어 보이는 쉬운 negative보다 실제로 헷갈리는 hard negative를 잘 수집하는 것이 중요하다.
🧠 상세 정리
1. 글의 목적과 Sentence Transformers의 역할
이 글은 Sentence Transformers를 이용해 reranker 모델, 즉 Cross Encoder 모델을 학습하고 파인튜닝하는 방법을 설명한다. Sentence Transformers는 retrieval augmented generation, semantic search, semantic textual similarity, paraphrase mining 등 여러 응용에서 embedding 모델과 reranker 모델을 사용하거나 학습할 수 있게 해주는 Python 라이브러리로 소개된다. 저자는 단순한 개념 소개에 그치지 않고 데이터셋, loss function, training arguments, evaluator, trainer 같은 실제 학습 구성요소를 차례로 다루겠다고 밝힌다. 또한 글을 작성하면서 함께 학습한 ModernBERT 기반 reranker 모델이 자신의 평가 데이터에서 기존 공개 reranker 모델들을 앞섰다는 결과를 뒤에서 보여주겠다고 예고한다.
2. Reranker와 Cross Encoder의 기본 개념
Reranker 모델은 두 텍스트 사이의 관련성을 평가하는 모델이며, 예시로는 query와 document의 쌍 또는 두 문장의 쌍이 제시된다. 이 모델은 흔히 Cross Encoder 구조로 구현되며, Sentence Transformers 또는 bi-encoder 방식의 embedding 모델과 다르게 각 텍스트를 독립적으로 벡터화한 뒤 거리 기반 유사도를 계산하지 않는다. 대신 두 텍스트를 함께 하나의 공유 신경망에 넣어 처리하고, 그 결과로 하나의 관련성 점수를 얻는다. 두 입력 텍스트가 서로 attention할 수 있기 때문에 Cross Encoder는 embedding 모델보다 더 정교한 관련성 판단을 할 수 있으며, 글에서는 reranker model과 Cross Encoder model을 같은 의미로 사용한다고 명시한다.
3. 성능과 속도 사이의 trade-off
Cross Encoder 방식의 강점은 두 텍스트를 함께 처리해 높은 관련성 판단 성능을 낼 수 있다는 점이지만, 그만큼 계산 비용이 크다는 단점도 있다. 예를 들어 query 10개와 후보 document 500개를 비교해야 한다면 Cross Encoder는 가능한 쌍마다 계산해야 하므로 5,000번의 처리가 필요하다. 반면 embedding 모델은 각 query와 document를 한 번씩 임베딩하면 되므로 같은 상황에서 510번 수준의 계산으로 비교가 가능하다. 그래서 Cross Encoder는 대규모 초기 검색 단계에는 비효율적이지만, 이미 빠른 모델이 찾아낸 top-k 후보를 다시 정렬하는 reranking 단계에는 적합하다. 저자는 가장 강한 검색 시스템들이 흔히 먼저 retrieve하고 이후 rerank하는 2단계 접근을 사용한다고 설명한다.
4. 왜 파인튜닝이 필요한가
Reranker가 실제로 풀어야 하는 문제는 이미 서로 관련성이 높은 여러 문서 중 어떤 문서가 query에 가장 잘 답하는지를 고르는 것이다. 범용 reranker 모델은 다양한 도메인과 주제에서 이 문제를 적당히 잘 풀도록 학습되지만, 바로 그 범용성 때문에 특정 도메인에서 가능한 최대 성능에 도달하지 못할 수 있다. 파인튜닝을 하면 모델이 사용자가 중요하게 생각하는 특정 도메인이나 언어에 집중하도록 학습될 수 있다. 저자는 글의 평가 부분에서 도메인 데이터로 학습한 모델이 훨씬 큰 범용 모델보다도 자신의 데이터에서 더 좋은 성능을 낼 수 있음을 보여주겠다고 말한다. 이 주장은 일반적 보장이 아니라 저자가 사용한 평가 데이터에서 관찰한 결과로 제시된다.
5. 학습을 구성하는 핵심 요소
글은 reranker 모델 학습이 몇 가지 구성요소의 조합으로 이루어진다고 정리한다. 첫 번째는 training 또는 evaluation에 사용할 데이터셋이고, 두 번째는 모델의 성능을 측정해 최적화 방향을 제공하는 loss function이다. 세 번째는 선택 사항인 training arguments로, 학습 성능이나 추적, 디버깅에 영향을 주는 매개변수들을 포함한다. 네 번째는 학습 전, 중, 후에 모델을 평가할 수 있는 evaluator이며, 마지막은 이 모든 요소를 묶어 실제 학습을 수행하는 trainer이다. 이 글에서는 특히 CrossEncoderTrainer가 Hugging Face datasets의 Dataset 또는 DatasetDict 인스턴스를 사용한다는 점을 중심으로 데이터 준비 과정을 자세히 설명한다.
6. Hugging Face Hub와 로컬 데이터 사용
CrossEncoderTrainer는 Hugging Face Datasets Hub의 데이터셋을 바로 불러오거나 사용자가 가진 로컬 데이터를 사용할 수 있다. 글에서는 load_dataset 함수를 이용해 sentence-transformers/natural-questions의 train split을 불러오고, query와 answer 컬럼 및 100,231개 row가 있는 데이터셋을 출력하는 예시를 보여준다. 또한 nthakur/swim-ir-monolingual처럼 여러 subset과 서로 다른 데이터 형식을 가진 데이터셋은 데이터셋 이름과 함께 subset 이름을 지정해야 한다고 설명한다. 로컬 데이터의 경우 CSV, JSON, Parquet, Arrow, SQL 같은 형식을 사용할 수 있으며, 단순 파일 로딩이 아니라 전처리·필터링·정제가 필요한 경우에는 Dataset.from_dict로 리스트 기반 dictionary를 만들어 데이터셋을 구성할 수 있다. 이때 dictionary의 각 key는 결과 데이터셋의 column이 된다.
7. 데이터셋 형식과 loss function의 정합성
저자는 데이터셋 형식이 loss function 및 모델 출력과 반드시 맞아야 한다고 강조한다. 검증 기준은 세 가지로 정리된다. 먼저 label, labels, score, scores라는 이름이 아닌 모든 column은 입력으로 간주되며, 그 개수가 선택한 loss가 요구하는 입력 수와 맞아야 한다. 다음으로 loss function이 label을 요구한다면 데이터셋에는 label, labels, score, scores 중 하나의 이름을 가진 column이 있어야 하며, 이 column은 자동으로 label로 사용된다. 마지막으로 모델의 output label 수 역시 loss function이 요구하는 수와 일치해야 한다. 예시로 text1, text2, label column을 갖고 label이 0에서 1 사이의 float similarity score이며 모델이 1개 label을 출력한다면 BinaryCrossEntropyLoss와 맞는다고 설명한다.
8. column 순서와 불필요한 column 관리
데이터셋이 loss function과 겉으로는 맞아 보여도 column 순서가 잘못되면 의도와 다른 학습 입력이 만들어질 수 있다. 글에서는 good_answer, bad_answer, question이라는 column을 가진 데이터셋을 예로 들며, triplet 형식의 loss에 사용할 수는 있어도 column 순서 때문에 good_answer가 anchor, bad_answer가 positive, question이 negative로 해석될 수 있다고 경고한다. 따라서 필요한 경우 Dataset.select_columns로 column을 올바른 순서로 재배열해야 한다. 또한 sample_id, metadata, source, type 같은 부가 column이 있으면 label 이름이 아닌 이상 입력으로 사용될 수 있으므로 Dataset.remove_columns로 제거하거나 select_columns로 원하는 column만 남기는 것이 필요하다. 이 부분은 학습 성능 이전에 데이터가 모델에 어떻게 들어가는지부터 정확히 맞춰야 한다는 실무적 주의를 담고 있다.
9. Hard negative mining의 중요성
Reranker 모델 학습의 성공은 negative의 품질에 크게 좌우된다고 설명된다. negative는 query와의 점수가 낮아야 하는 passage를 뜻하며, 완전히 관련 없는 soft negative와 겉보기에는 관련 있어 보이지만 정답은 아닌 hard negative로 나뉜다. 글은 “Apple은 어디서 설립되었는가?”라는 query에 대해, Arkansas의 다리 설명은 soft negative이고 Fuji apple 품종 설명은 hard negative라는 예를 든다. 강한 Cross Encoder 모델은 일반적으로 이런 hard negative를 구별하도록 학습되므로, 학습 데이터에서 hard negative를 확보하는 과정이 중요하다. Sentence Transformers는 query-answer pair 데이터셋과 효율적인 embedding 모델을 이용해 hard negative를 찾는 mine_hard_negatives 함수를 제공하며, 글에서는 GooAQ 데이터셋 일부와 static-retrieval-mrl-en-v1 모델을 사용한 예시를 보여준다.
10. GooAQ 예시와 평가 결과의 위치
hard negative mining 예시에서는 sentence-transformers/gooaq 데이터셋의 train split에서 100,000개 샘플을 선택하고, CPU에서 동작하는 효율적인 embedding 모델로 negative를 찾는 흐름이 제시된다. 설정에는 question-answer pair마다 5개의 negative를 찾는 num_negatives, 너무 가까운 샘플을 건너뛰는 range_min, 고려 범위를 제한하는 range_max, 최대 유사도 max_score, positive와 negative 사이의 margin, top 기반 sampling_strategy, 4096 batch size, labeled-pair 출력 형식, FAISS 사용 등이 포함된다. 출력 예시는 positive와 negative의 평균·중앙값·표준편차·최솟값·최댓값 등 통계를 보여주며, margin이나 maximum score 조건 때문에 일부 후보 negative가 제외되었다는 정보도 제공한다. 글 앞부분에서 저자는 이 과정을 포함한 recipe로 학습한 ModernBERT base 및 large 기반 reranker가 자신의 평가 데이터에서 기존 일반 목적 reranker보다 강한 결과를 냈다고 예고한다.
🧾 핵심 주장 / 시사점
- Reranker 파인튜닝에서 중요한 것은 단순히 모델 크기를 키우는 것이 아니라, 실제 검색 상황에서 헷갈릴 만한 hard negative를 포함해 도메인에 맞는 데이터 분포를 만드는 것이다.
- Cross Encoder는 느리지만 정밀하므로 초기 검색을 대체하기보다, 빠른 embedding 검색 이후 top-k 후보를 정교하게 재정렬하는 단계에 배치할 때 장점이 가장 잘 드러난다.
- 데이터셋 column 이름과 순서, label column 처리, 불필요한 metadata 제거 같은 형식적 요소가 loss function과 맞지 않으면 학습 의도 자체가 어긋날 수 있으므로, 모델 학습 전에 데이터 구조 검증이 필수적이다.
✅ 액션 아이템
- 도메인별 검색 품질을 높이려면 빠른 Sentence Transformers 후보 추출 후 Cross Encoder reranker로 상위 재정렬하는 2단계 흐름을 먼저 고정한다.
- 학습 구성요소(데이터셋, loss function, training arguments, evaluator, trainer)를 도메인 목표에 맞춰 정렬하고 변경 이력을 함께 관리한다.
- 데이터셋 형식을 손실함수와 라벨 수 규격에 맞춰 정비하고, hard negative 중심으로 부정 샘플을 수집해 재학습셋을 설계한다.
❓ 열린 질문
- Cross Encoder 재정렬 단계의 계산 비용은 도메인 검색량이 어느 구간부터 실시간 처리 병목으로 작동하는가?
- 도메인별·언어별 데이터에서 hard negative를 효과적으로 선별하려면 어떤 규칙으로 혼동 사례를 정의하고 갱신할 것인가?
- 자체 평가 데이터에서 공개 모델 대비 개선을 판정할 때 어떤 정량 지표를 우선 채택해 모니터링할 것인가?