Hugging Face Sentence Transformers Training Guide (역사적 참고)

TL;DR

Hugging Face는 Sentence Transformers 모델을 구축, 학습 및 파인튜닝하는 과정을 단계별로 안내하는 역사적인 가이드를 발표했으며, 아키텍처, 데이터셋 준비, 손실 선택 및 모델 배포를 다루지만, 설명된 SentenceTransformer.fit API가 더 이상 사용되지 않으며 독자를 최신 SentenceTransformerTrainer 기반 가이드로 안내합니다.


가이드 개요

이 튜토리얼은 참고용으로만 보관되며, 처음부터 Sentence Transformers 모델을 만드는 방법 또는 기존 모델을 파인튜닝하는 방법, 학습 데이터 형식 지정 방법, 각 형식에 맞는 손실 함수, 그리고 결과 모델을 Hugging Face Hub에 푸시하는 방법을 설명합니다.

Note: 가이드는 pre‑v3.0 SentenceTransformer.fit API를 사용하며, 이는 SentenceTransformerTrainer에 의해 대체되었습니다. 최신 학습 절차는 다음 최신 게시물에 문서화되어 있습니다:

  • Embedding models – Training and Finetuning Embedding Models with Sentence Transformers
  • Reranker models – Training and Finetuning Reranker Models with Sentence Transformers
  • Sparse embedding models – Training and Finetuning Sparse Embedding Models with Sentence Transformers
  • Multimodal models – Training and Finetuning Multimodal Embedding & Reranker Models with Sentence Transformers

Sentence Transformers 모델 작동 방식

Sentence Transformers는 가변 길이 텍스트(또는 이미지)를 의미를 포착하는 고정 크기 임베딩으로 매핑합니다.

  1. Transformer layer – 입력 텍스트는 사전 학습된 Transformer(예: distilroberta-base)에 의해 처리됩니다. 모델은 컨텍스트화된 토큰 임베딩을 출력합니다.
  2. Pooling layer – 토큰 임베딩은 (예: 평균 풀링) 단일 문장 수준 벡터로 집계됩니다.
from sentence_transformers import SentenceTransformer, models

# Layer 1: pre‑trained transformer
word_embedding_model = models.Transformer('distilroberta-base')

# Layer 2: pooling to a fixed‑size vector
pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension())

# Assemble the modules
model = SentenceTransformer(modules=[word_embedding_model, pooling_model])

모델은 모듈들의 순차적 리스트이며, 필요에 따라 추가 레이어(밀집, 컨볼루션 등)를 삽입할 수 있습니다.

왜 일반 Transformer를 문장 임베딩에 사용하지 않을까요?

  • 10,000개의 문장에 대해 원시 BERT 모델을 사용한 의미 검색 추론은 약 5천만 연산(~65 시간)이 필요하지만, Sentence Transformer는 이를 약 5 초로 감소시킵니다.
  • BERT 토큰 임베딩을 직접 평균하면 고전적인 GloVe 임베딩보다 품질이 낮은 문장 표현이 생성됩니다.

데이터셋 준비

학습에는 두 문장이 유사하거나 비유사하다는 신호가 필요합니다. 가이드는 네 가지 일반적인 데이터셋 구조를 식별합니다:

케이스 형식 일반적인 출처 추천 손실
1 (sentence_a, sentence_b, similarity_label) – 레이블은 정수 또는 실수일 수 있음 자연어 추론(NLI) 데이터셋 ContrastiveLoss, SoftmaxLoss, CosineSimilarityLoss
2 (sentence_a, sentence_b) – 양성 쌍, 명시적 레이블 없음 패러프레이즈, 요약, 중복 질문 쌍 MultipleNegativesRankingLoss, MegaBatchMarginLoss
3 (sentence, class_id) – 정수 클래스 레이블 주제 분류 데이터셋(예: TREC) 클래스 ID를 사용하는 트리플렛 기반 손실(BatchHardTripletLoss 등)
4 (anchor, positive, negative) – 명시적 트리플렛, 클래스 ID 없음 사전 구축된 트리플렛 데이터셋(예: Quora Triplets) TripletLoss

튜토리얼은 embedding-data/QQP_triplets 데이터셋을 사용하여 케이스 4를 시연합니다. datasets.load_dataset으로 데이터셋을 로드하고 구조를 검사한 뒤 각 예제를 sentence_transformers.InputExample으로 변환하는 방법을 보여줍니다:

from datasets import load_dataset
from sentence_transformers import InputExample

dataset = load_dataset('embedding-data/QQP_triplets')
train_examples = []
train_data = dataset['train']['set']
for i in range(dataset['train'].num_rows // 2):  # use half the data for speed
    ex = train_data[i]
    train_examples.append(
        InputExample(texts=[ex['query'], ex['pos'][0], ex['neg'][0]])
    )

그런 다음 예제들을 배치를 위해 torch.utils.data.DataLoader에 감쌉니다:

from torch.utils.data import DataLoader
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)

손실 함수 선택

손실은 데이터셋 형식에 맞아야 합니다:

  • Case 1ContrastiveLoss(정수 레이블) 또는 CosineSimilarityLoss(실수 레이블)를 사용합니다.
  • Case 2 – 가장 일반적인 MultipleNegativesRankingLoss 또는 MegaBatchMarginLoss를 사용합니다.
  • Case 3 – 클래스 ID에 의존하는 트리플렛 기반 손실, 예를 들어 BatchHardTripletLoss를 사용합니다.
  • Case 4 – 클래스 레이블이 필요 없는 TripletLoss를 사용합니다.

손실을 인스턴스화하는 코드는 매우 간단합니다:

from sentence_transformers import losses
train_loss = losses.TripletLoss(model=model)

모델 학습 / 파인튜닝

DataLoader와 손실이 준비되면, 학습은 단일 fit 호출로 진행됩니다:

model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=10)

기존 모델을 파인튜닝하려면(예: sentence-transformers/all-MiniLM-L6-v2), SentenceTransformer(model_id)로 로드한 뒤 fit을 직접 호출합니다.


모델을 Hub에 배포

학습이 끝난 후 모델을 Hugging Face Hub에 푸시합니다:

from huggingface_hub import notebook_login
notebook_login()  # or `huggingface-cli login` in a terminal

model.save_to_hub(
    "distilroberta-base-sentence-transformer",
    organization="<your‑username-or‑org>",
    train_datasets=["embedding-data/QQP_triplets"]
)

save_to_hub은 자동으로 모델 카드, 추론 위젯 및 예제 스니펫을 생성합니다.


Sentence Transformers의 한계

Sentence Transformers는 의미 검색 및 유사도 작업에 뛰어나지만 순수 분류 문제에는 적합하지 않습니다. 분류 작업에는 표준 🤗 Transformers 라이브러리(예: 시퀀스 분류 파이프라인)를 대신 사용해야 합니다.


추가 자료

  • Getting Started With Embeddings – 임베딩 입문 가이드.
  • Understanding Semantic Search – 의미 검색에 대한 심층 탐구.
  • Your First Sentence Transformers Model – 단계별 초보자 튜토리얼.
  • Playlist Generator – Sentence Transformers의 예시 애플리케이션.
  • Hugging Face + Sentence Transformers documentation – 포괄적인 API 레퍼런스.

이 가이드는 역사적 참고용으로만 보관됩니다; 프로덕션에 적합한 워크플로를 위해 SentenceTransformerTrainer를 사용하는 최신 학습 가이드를 참고하십시오.

Sources