Sentence Transformers를 사용한 임베딩 모델 훈련 및 파인튜닝
Hugging Face는 Sentence Transformers 라이브러리를 사용하여 임베딩 모델을 훈련하고 파인튜닝하는 간소화된 워크플로우를 자세히 설명합니다. 이 프레임워크를 통해 개발자는 일반 목적의 임베딩 모델을 검색 증강 생성(RAG), 의미 검색, 패러프레이즈 마이닝과 같은 작업에 필요한 특정 유사성 개념에 맞게 조정할 수 있습니다.
작업별 유사성을 위한 파인튜닝의 필요성
파인튜닝은 서로 다른 애플리케이션이 서로 다른 “유사성” 정의를 필요로 하기 때문에 중요합니다. 예를 들어, 서로 다른 기업(예: Apple과 NVIDIA)에 관한 두 뉴스 헤드라인은 두 경우 모두 '기술' 카테고리에 속하므로 뉴스 분류 모델에서는 유사하게 여겨질 수 있지만, 의미 텍스트 유사성 또는 검색 모델에서는 서로 다른 사건을 설명하므로 비유사하게 간주되어야 합니다.
핵심 훈련 구성 요소
Sentence Transformer 모델을 훈련할 때는 다섯 가지 주요 구성 요소가 포함됩니다:
- 데이터셋: 훈련 및 평가 데이터로, 일반적으로
datasets.Dataset또는datasets.DatasetDict인스턴스로 로드됩니다. - 손실 함수: 사용 가능한 데이터와 목표 작업에 기반하여 모델 성능을 정량화하고 최적화를 안내하는 함수입니다.
- 훈련 인자:
SentenceTransformersTrainingArguments를 통해 제공되는 선택적 매개변수로, 훈련 효율성, 추적 및 디버깅을 제어합니다. - 평가자: 훈련 전·중·후에 구체적인 지표를 사용해 모델 성능을 평가하는 선택적 도구입니다.
- 트레이너: 모델, 데이터셋, 손실 함수 및 기타 구성 요소를 통합하는
SentenceTransformerTrainer입니다.
데이터셋 요구 사항 및 포맷
데이터셋은 Hugging Face Hub(종종 sentence-transformers 태그가 붙음)에서 가져오거나 CSV, JSON, Parquet, Arrow, SQL 형식으로 로컬에서 로드할 수 있습니다. 선택한 손실 함수와 호환성을 보장하려면 데이터셋은 특정 포맷 규칙을 따라야 합니다:
- 레이블: 손실 함수가 레이블을 필요로 하는 경우, 데이터셋에
label또는score라는 열이 포함되어야 합니다. - 입력: 레이블을 제외한 모든 열은 입력으로 간주됩니다. 이러한 열의 개수와 순서는 손실 함수의 요구 사항과 일치해야 합니다(예:
(anchor, positive, negative)삼중 형식).
손실 함수 및 훈련 인자
손실 함수는 훈련 중인 모델과 함께 초기화됩니다. 손실 선택은 사용 가능한 데이터에 따라 달라집니다(예: 부동 소수점 유사성 점수가 있는 쌍에 대해 CoSENTLoss).
SentenceTransformersTrainingArguments를 사용하여 훈련 성능을 조정할 수 있으며, 여기에는 num_train_epochs, per_device_train_batch_size, warmup_ratio 및 fp16이나 bf16과 같은 하드웨어별 설정이 포함됩니다. “in-batch negatives”를 활용하는 손실의 경우 batch_sampler=BatchSamplers.NO_DUPLICATES 인자를 권장합니다.
모델 평가
트레이너가 평가 손실을 제공할 수 있지만, 전용 평가자는 작업별 지표를 제공합니다. 사용 가능한 평가자는 다음과 같습니다:
- EmbeddingSimilarityEvaluator: 유사성 점수가 있는 쌍에 대해 사용됩니다(예: STSb 벤치마크).
- TripletEvaluator:
(anchor, positive, negative)쌍에 사용됩니다(예: AllNLI 데이터셋). - InformationRetrievalEvaluator: 쿼리, 코퍼스 및 관련 문서에 사용됩니다.
- BinaryClassificationEvaluator: 클래스 레이블이 있는 쌍에 사용됩니다.
여러 평가자를 하나의 SequentialEvaluator로 결합하여 훈련 중에 다양한 지표를 동시에 추적할 수 있습니다.
고급 훈련 워크플로우
다중 데이터셋 훈련
고성능 모델은 종종 여러 데이터셋을 동시에 훈련해야 합니다. SentenceTransformerTrainer는 데이터셋 사전과 해당 손실 함수 사전을 받아 이를 지원합니다. 이를 통해 동일한 훈련 실행에서 서로 다른 데이터셋에 서로 다른 손실을 적용할 수 있습니다.
여러 데이터셋에서 샘플링은 MultiDatasetBatchSamplers를 사용하여 두 가지 전략으로 처리할 수 있습니다:
- ROUND_ROBIN: 각 데이터셋에서 동일하게 샘플링하며, 하나가 소진될 때까지 진행합니다.
- PROPORTIONAL: 각 데이터셋의 크기에 비례하여 샘플링하여 모든 샘플이 사용되도록 합니다.
SentenceTransformerTrainer로 전환
Sentence Transformers v3.0이 출시되면서 기존 SentenceTransformer.fit 메서드는 내부적으로 SentenceTransformerTrainer를 사용합니다. 레거시 코드는 여전히 작동하지만, Hugging Face는 다중 GPU 훈련 및 향상된 손실 로깅과 같은 고급 기능을 활용하기 위해 새로운 트레이너 방식을 채택할 것을 권장합니다.
성능 예시
제공된 예시에서 MultipleNegativesRankingLoss를 사용해 AllNLI 삼중쌍으로 microsoft/mpnet-base 모델을 파인튜닝하면 성능이 크게 향상되었습니다. 기본 모델은 개발 셋에서 68.32%를 기록했으며, 파인튜닝된 모델은 개발 셋에서 90.04%, 테스트 셋에서 91.5%를 달성했으며, 이는 코사인 유사성을 이용한 삼중 정확도로 측정되었습니다.