Sentence Transformers (SBERT) — 의미론적 임베딩과 재랭킹

카테고리: Vector DB & Embedding
모듈: “Vector DB & Embedding” (12시간)
대상: 데이터 사이언티스트, 검색 엔지니어, ML 엔지니어
핵심 주제: 사전학습 모델 + 파인튜닝 + 멀티모달 임베딩 + 재랭킹


핵심 Takeaways

  1. SBERT는 의미론적 임베딩의 표준: 10,000+ 사전학습 모델로 SOTA 임베딩 및 재랭킹 제공
  2. 멀티모달 임베딩 지원: 텍스트, 이미지, 오디오, 비디오 간 교차 모달 유사도 계산 가능
  3. 성능 최적화 기술: Flash Attention 2, 양자화, 증류로 추론 속도 극대화
  4. 훈련 유연성: 커스텀 도메인 모델 파인튜닝을 통해 특정 작업에 최적화
  5. 다양한 사용 사례: 의미 검색, 유사도 계산, 클러스터링, 재랭킹 등 광범위 활용

Part 1: SBERT 개요 및 핵심 개념

1.1 정의와 역할

**Sentence Transformers (SBERT)**는 Hugging Face와 UKP Lab이 공동 개발한 Python 라이브러리로, BERT 및 기타 Transformer 모델을 기반으로 문장 수준의 임베딩을 효율적으로 생성합니다.

기존 BERT는 문장 간 의미론적 유사도 계산에 적합하지 않았습니다. 두 문장의 BERT 임베딩을 비교하려면 별도의 Cross-Encoder가 필요했고, 이는 계산 비용이 컸습니다. SBERT는 Siamese Network 구조를 활용하여 문장 자체를 의미론적으로 의미 있는 벡터 공간으로 매핑합니다.

1.2 SBERT와 기존 방식의 차이

구분기존 BERTSBERT
입력두 문장을 함께 입력각 문장 독립 처리
출력클래스 레이블 (유사도 점수)문장 임베딩 벡터
비교 방식Cross-Encoder (느림)Siamese (빠름)
확장성대규모 데이터셋에 부적합수백만 개 문장 비교 가능

1.3 SBERT의 3가지 핵심 기능

A) Embedding Models (임베딩 모델)

문장, 단락, 이미지 등을 고정 차원의 밀집 벡터로 변환합니다.

예제:

from sentence_transformers import SentenceTransformer
 
model = SentenceTransformer('all-MiniLM-L6-v2')
sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)
# shape: (2, 384)

B) Cross-Encoders (재랭킹 모델)

두 텍스트의 의미론적 유사도를 직접 점수로 계산합니다. 임베딩 모델의 후속 처리로 정확도 향상에 사용됩니다.

사용 사례: 초기 검색으로 후보 1,000개 추출 → Cross-Encoder로 상위 10개 재선별

C) Sparse Encoders (희소 임베딩 모델)

BM25와 의미론적 검색을 결합한 하이브리드 검색을 지원합니다. 어휘 일치도와 의미 유사도를 모두 고려합니다.

1.4 SBERT의 설계 원리

SBERT는 Siamese Network + Triplet Loss를 기반합니다:

  • Siamese Network: 같은 모델을 두 입력에 독립적으로 적용하여 두 임베딩을 생성
  • 손실 함수: Triplet Loss, MultipleNegativesRankingLoss, ContrastiveNegativesLoss 등으로 학습
  • 풀링 (Pooling): [CLS] 토큰 또는 평균 풀링으로 문장 레벨 임베딩 생성

Part 2: 멀티모달 임베딩 및 확장

2.1 멀티모달 지원의 진화

SBERT v5.4부터 첫 번째 클래스 멀티모달 지원을 제공합니다:

  • 텍스트: 원래부터 지원
  • 이미지: Vision Transformer (ViT) 기반 이미지 인코더 통합
  • 오디오: Wav2Vec 등 음성 모델 통합
  • 비디오: 프레임 추출 + 텍스트 + 오디오 결합

2.2 교차 모달 유사도 계산

멀티모달 SBERT 모델은 모든 형식의 입력을 공통 임베딩 공간으로 매핑합니다:

[ 텍스트 이미지 오디오 ] → 인코더 → 공통 벡터 공간 → 유사도 계산

실제 응용:

  • 이미지 캡션 검색 (이미지 쿼리로 관련 텍스트 검색)
  • 음성 질의응답 (음성 입력 → 텍스트 지식 검색)
  • 비디오 클립 정렬 (오디오 트랙과 비디오 콘텐츠 동기화)

2.3 모달리티 간 불균형 문제

멀티모달 학습의 도전:

  1. 데이터 불균형: 특정 모달리티의 학습 데이터 부족
  2. 정렬 문제: 텍스트-이미지 페어의 의미론적 정렬 수준 편차
  3. 계산 비용: 다중 인코더 실행으로 추론 시간 증가

SBERT는 가중치 조정 및 대비 학습(Contrastive Learning)으로 이를 해결합니다.


Part 3: 성능 최적화 기법

3.1 Flash Attention 2

표준 Attention 메커니즘은 O(n²) 메모리를 사용합니다. Flash Attention 2는:

  • 블록 단위 계산: 어텐션을 작은 블록으로 분할하여 메모리 I/O 감소
  • 성능 개선: 2-4배 빠른 추론 속도
  • 메모리 효율: 장문 입력 처리 가능
활성화: model.enable_flash_attention()
효과: BERT base 기준 약 3배 속도 개선

3.2 모델 증류 (Knowledge Distillation)

큰 모델(Teacher)을 작은 모델(Student)에 압축:

  • SBERT의 증류: all-MiniLM-L6-v2 (384차원, 22M 파라미터)는 all-roberta-large-v1 (1024차원, 355M 파라미터)의 증류 버전
  • 성능 유지: 추론 시간 80% 단축, 정확도 손실 최소 (<3%)

3.3 양자화 (Quantization)

정밀도 축소로 모델 크기 및 추론 시간 감소:

  • INT8 양자화: FP32 → INT8로 4배 크기 축소
  • ONNX 런타임: GPU 추론을 50-70% 가속화

3.4 배치 처리 및 GPU 활용

# GPU 배치 처리로 처리량 극대화
embeddings = model.encode(
    sentences,
    batch_size=128,
    device='cuda',
    show_progress_bar=True
)

성능 특성:

  • 배치 크기 32 vs 1: 약 30배 처리량 향상
  • GPU (V100): CPU 대비 50-100배 빠름

Part 4: 훈련 및 파인튜닝

4.1 도메인 특화 모델 학습

도메인의 중요성:

  • 의료 문헌의 임베딩 공간과 뉴스 기사의 공간은 다름
  • SBERT 사전학습 모델(일반 도메인)을 특화 도메인으로 파인튜닝

4.2 주요 손실 함수

A) Triplet Loss

Loss = max(distance(anchor, negative) - distance(anchor, positive) + margin, 0)
  • 긍정 쌍은 가깝게, 부정 쌍은 멀게
  • 추천 시스템, 차별화 학습에 적합

B) MultipleNegativesRankingLoss

  • 한 배치 내 다른 샘플들을 부정 사례로 활용
  • 더 효율적이고 큰 배치에서 성능 우수

C) ContrastiveNegativesLoss

  • 명시적 부정 쌍 사용
  • 하드 네거티브 마이닝에 유용

4.3 파인튜닝 전략

Step 1: 데이터 준비

from sentence_transformers import InputExample
 
train_examples = [
    InputExample(texts=['같은 의미의 문장1', '같은 의미의 문장2'], label=1.0),
    InputExample(texts=['다른 의미의 문장1', '다른 의미의 문장2'], label=0.0)
]

Step 2: 모델 초기화 및 학습기 설정

from sentence_transformers import models, losses
 
model = SentenceTransformer('distilbert-base-uncased')
train_loss = losses.CosineSimilarityLoss(model)
 
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=1)

Step 3: 평가 및 배포

sentences1 = ['This is a test sentence', ...]
sentences2 = ['This is a test sentence', ...]
 
similarity_scores = model.similarity(sentences1, sentences2)

4.4 실전 파인튜닝 예제: FAQ 검색

시나리오: 고객 FAQ 검색 모델 구축

  1. 데이터 수집: 1,000개 FAQ 질문-답변 쌍
  2. 훈련: 사용자 쿼리와 FAQ 질문의 의미론적 유사도 학습
  3. 평가: 관련성 순위 (MRR, NDCG)
  4. 배포: REST API로 제공
# 훈련 후 쿼리
query = "결제 방법은 무엇인가요?"
query_embedding = model.encode(query)
 
faq_embeddings = model.encode(faq_questions)
scores = util.cos_sim(query_embedding, faq_embeddings)
top_k = torch.topk(scores, k=5)

Part 5: 벡터 DB와의 통합 및 프로덕션 아키텍처

5.1 SBERT + Vector DB 파이프라인

일반적 구성:

[텍스트 문서] → SBERT 임베딩 → Pinecone/Qdrant → 저장
     ↓
[사용자 쿼리] → SBERT 임베딩 → 벡터 DB 검색 → 상위 K 결과

5.2 임베딩 캐싱 전략

대규모 데이터셋의 경우 매번 임베딩을 계산할 수 없습니다:

# 배치 임베딩 및 저장
documents = load_documents()
embeddings = model.encode(documents, batch_size=256, show_progress_bar=True)
 
# Pinecone에 저장
index.upsert([(str(i), embedding, {"doc": doc}) for i, (embedding, doc) in enumerate(zip(embeddings, documents))])

5.3 재랭킹을 통한 정확도 향상

[검색 결과] (상위 100개)
     ↓
[Cross-Encoder 재랭킹]
     ↓
[최종 결과] (상위 10개, 높은 정확도)

성능: Cross-Encoder 재랭킹으로 NDCG@10 보통 5-15% 개선

5.4 프로덕션 아키텍처

마이크로서비스 설계:

API Gateway
  ├─ Embedding Service (SBERT 임베딩 생성)
  ├─ Vector DB (Pinecone/Qdrant, 스토리지)
  └─ Ranking Service (Cross-Encoder 재랭킹)

확장성:

  • Embedding Service: 배치 처리, 비동기 큐 (Redis)
  • Vector DB: 자동 샤딩, 레플리카
  • Ranking Service: 캐시 (Redis), 동적 스케일링

5.5 모니터링 및 성능 지표

# 임베딩 품질 모니터링
embeddings = model.encode(test_sentences)
 
# 내 일관성 (Intrinsic Consistency)
consistency = model.evaluate(evaluator)
 
# 응답 시간 측정
import time
start = time.time()
embeddings = model.encode(sentences)
latency = (time.time() - start) / len(sentences)

학습 목표 (ABCD 프레임워크)

A) Understand (이해)

  • SBERT가 기존 BERT와 다른 이유를 설명할 수 있다
  • Siamese Network와 손실 함수의 역할을 이해한다
  • 멀티모달 임베딩의 작동 원리를 설명할 수 있다
  • SBERT의 3가지 핵심 기능 (Embedding, Cross-Encoder, Sparse)을 구분한다

B) Apply (적용)

  • 사전학습 SBERT 모델로 문장 임베딩을 생성할 수 있다
  • 코사인 유사도를 활용한 간단한 검색 시스템을 구현할 수 있다
  • Cross-Encoder를 사용한 재랭킹 파이프라인을 구축할 수 있다
  • 도메인 데이터로 SBERT 모델을 파인튜닝할 수 있다

C) Analyze (분석)

  • 임베딩 모델의 성능을 정량적으로 평가 (MRR, NDCG, 정확도)할 수 있다
  • 다양한 손실 함수의 트레이드오프를 분석할 수 있다
  • 모달리티별 임베딩 품질 편차의 원인을 진단할 수 있다
  • 벡터 DB와의 통합 시 병목 지점을 식별할 수 있다

D) Create (창조)

  • 멀티모달 검색 시스템 (이미지+텍스트)을 설계 및 구현할 수 있다
  • 특화 도메인 재랭킹 모델을 학습할 수 있다
  • 프로덕션 수준의 의미 검색 아키텍처를 설계할 수 있다
  • 커스텀 손실 함수를 정의하고 파인튜닝 프로세스를 자동화할 수 있다

교육 설계 강점 (5가지)

1. 실용적 직관성

  • 추상적 “Transformer” 대신 “문장을 벡터로”라는 명확한 목표
  • 코드 예제가 즉시 실행 가능하고 결과 확인 가능
  • 도메인별 사용 사례 (FAQ 검색, 이미지 검색, 추천)로 동기 부여

2. 단계적 복잡도 증가

  • Level 1: 사전학습 모델 → 임베딩 생성 (10줄 코드)
  • Level 2: 유사도 계산 및 검색 (20줄)
  • Level 3: Cross-Encoder 재랭킹 (50줄)
  • Level 4: 파인튜닝 및 배포 (200줄)

3. 멀티모달 확장성

  • 텍스트 임베딩부터 시작해 이미지, 오디오까지 자연스러운 확장
  • 공통 벡터 공간 개념이 모든 모달리티에 일관되게 적용
  • 최신 기술 (v5.4 멀티모달)도 이해 가능

4. 성능 최적화 학습

  • Flash Attention, 양자화, 증류 같은 현업 기술 체험
  • 추론 시간 3배-50배 개선 가능성을 실증으로 학습
  • 클라우드 비용 절감과 직결된 실무 감각

5. 커뮤니티 자산 활용

  • Hugging Face Hub의 10,000+ 모델 직접 활용
  • 학습 완료 후 모든 표준 작업에 즉시 적용 가능
  • 활발한 커뮤니티로부터 계속 학습

관련 문서