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.fitAPI를 사용하며, 이는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는 가변 길이 텍스트(또는 이미지)를 의미를 포착하는 고정 크기 임베딩으로 매핑합니다.
- Transformer layer – 입력 텍스트는 사전 학습된 Transformer(예:
distilroberta-base)에 의해 처리됩니다. 모델은 컨텍스트화된 토큰 임베딩을 출력합니다. - 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 1 –
ContrastiveLoss(정수 레이블) 또는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를 사용하는 최신 학습 가이드를 참고하십시오.