임베딩 모델의 개념
임베딩 모델은 텍스트와 같은 입력 데이터를 의미적 의미를 담은 벡터 표현(임베딩)으로 변환하는 모델입니다. 이 벡터 표현을 사용하면 원시 텍스트와 달리 수학적 연산이 가능해져 검색, 클러스터링, 분류 등 다양한 작업에 활용할 수 있는 유사도 점수를 얻을 수 있습니다.
- 밀집 임베딩 모델 (Dense Embedding Models): 일반적으로 사용되는 모델로, 대부분의 값이 0이 아닌 저차원(예: 384, 768 차원) 벡터를 생성합니다.
- 희소 임베딩 모델 (Sparse Embedding Models): 대부분의 값이 0인 고차원(예: 30,000+ 차원) 벡터를 생성합니다. 활성화된(0이 아닌) 각 차원은 모델 어휘의 특정 토큰에 해당하므로 해석이 용이합니다.
SPLADE: 최첨단 희소 임베딩 모델
SPLADE는 대표적인 희소 임베딩 모델입니다. 이 모델은 입력 문장을 고차원 희소 벡터로 변환하며, decode 메서드를 통해 임베딩에 가장 큰 영향을 미친 토큰들을 확인할 수 있어 해석 가능성이 높습니다. 예를 들어, 두 임베딩 간의 교집합을 계산하여 왜 두 텍스트가 유사하다고 판단되었는지 파악할 수 있습니다.
쿼리 및 문서 확장 (Query/Document Expansion)
희소 임베딩 모델의 핵심 기능 중 하나는 쿼리/문서 확장입니다. 기존의 BM25와 같은 어휘 기반 검색 방식이 텍스트에 있는 정확한 토큰만 일치시키는 반면, 희소 모델은 의미적으로 관련된 용어를 자동으로 확장합니다.
- 예시: “오늘 날씨가 정말 좋아요(The weather is lovely today)“라는 문장은 원문에는 없는 “아름다운(beautiful)”, “시원한(cool)”, “예쁜(pretty)” 등의 단어로 확장될 수 있습니다.
이 기능 덕분에 정확한 토큰이 일치하지 않아도 의미적으로 관련된 내용을 찾을 수 있어 동의어나 철자 오류 문제를 해결하고, 어휘 불일치 문제를 극복하는 데 도움이 됩니다. 하지만 의도치 않은 단어(예: “화요일 날씨” 쿼리가 “월요일”, “수요일”로 확장되는 경우)로 확장될 위험도 존재합니다.
희소 임베딩 모델을 사용하는 이유
희소 임베딩 모델은 기존의 어휘 기반 검색과 밀집 임베딩 모델 사이에서 다음과 같은 장점을 가집니다.
- 하이브리드 잠재력: 어휘적 일치가 중요한 검색에서 어려움을 겪을 수 있는 밀집 모델과 매우 효과적으로 결합될 수 있습니다.
- 해석 가능성: 어떤 토큰이 검색 결과에 기여했는지 정확히 확인할 수 있습니다.
- 성능: 많은 검색 작업에서 밀집 모델과 비슷하거나 더 나은 성능을 보입니다.
Dense Embedding과 어떻게 다른가요
Sparse Embedding과 Dense Embedding은 서로 명확하게 다른 목표와 특성을 가지고 있으며, 상호 보완적으로 활용될 수 있습니다.
Sparse Embedding(예: SPLADE)은 어휘적(Lexical) 매칭을 강화하는 데 중점을 둡니다. 언어 모델을 통해 각 단어의 중요도를 학습하고, 해당 단어에 가중치를 부여하여 표현합니다. 이 방식은 수만 차원의 고차원 벡터를 사용하며, 대부분의 값이 0인 희소(sparse) 형태를 띱니다. 이러한 구조 덕분에 어떤 단어가 검색 결과에 영향을 주었는지 명확하게 파악할 수 있어 해석 가능성이 높습니다. 특히 정확한 키워드 매칭이나 관련 용어 탐색에 매우 효과적입니다. 반면, 완전히 새로운 개념이나 문맥을 추론하는 능력은 상대적으로 떨어질 수 있습니다.
반대로 Dense Embedding(예: SBERT)은 의미적·개념적(Semantic) 매칭을 목표로 합니다. 문장이나 문서 전체의 의미를 하나의 저차원 벡터로 압축하여 표현하고, 대부분의 차원이 0이 아닌 값을 가집니다. 이 방식은 키워드가 다르더라도 의미적으로 유사한 내용을 찾아내는 데 강점을 보입니다. 하지만 각 차원이 구체적인 의미를 나타내지 않으므로 해석 가능성은 낮고(일종의 블랙박스), 특정 키워드의 중요성을 간과할 가능성이 있습니다.
결국 두 방식은 각각 어휘적 정확성과 의미적 유연성이라는 장단점을 가지며, 상황에 따라 적절히 선택하거나 함께 사용할 수 있습니다.
미세조정(Finetuning)의 필요성
대부분의 기성 희소 임베딩 모델은 일반적인 동의어(예: “grocery”를 “supermarket”으로 확장)는 잘 인식하지만, 특정 도메인의 전문 용어는 인식하지 못하는 경우가 많습니다.
- 예시: 의학 용어인 “cephalalgia(두통)“를 일반인들이 사용하는 “headache(두통)“로 확장하지 못할 수 있습니다. 또한 “Java”가 프로그래밍 언어라거나, “NVIDIA”가 그래픽 카드 회사라는 사실을 인식하지 못할 수도 있습니다.
미세조정을 통해 모델이 특정 도메인이나 언어에 집중하도록 학습시켜 이러한 문제를 해결할 수 있습니다.
모델 학습의 구성 요소
희소 임베딩 모델을 학습시키기 위해서는 다음 여섯 가지 요소가 필요합니다.
- 모델: 학습시킬 희소 인코더 모델 또는 기반 모델.
- 데이터셋: 학습 및 평가에 사용될 데이터.
- 손실 함수: 모델의 성능을 정량화하고 최적화 과정을 안내하는 함수.
- 학습 인자 (선택 사항): 학습 성능 및 추적/디버깅에 영향을 미치는 매개변수.
- 평가기 (선택 사항): 학습 전후 또는 학습 중에 모델을 평가하는 도구.
- 트레이너: 모델, 데이터셋, 손실 함수 등 모든 구성 요소를 결합하여 학습을 실행하는 주체.
주요 모델 아키텍처
어떤 아키텍처를 선택할지 확실하지 않다면 다음 가이드를 따를 수 있습니다.
- 기존의 밀집 임베딩 모델을 희소화하고 싶다면 CSR을 사용합니다.
- 성능 저하를 감수하더라도 쿼리 추론 속도를 즉각적으로 만들고 싶다면 Inference-free SPLADE를 사용합니다.
- 그 외의 경우에는 SPLADE를 사용합니다.
아키텍처 상세 설명
- SPLADE: MLMTransformer와 SpladePooling 모듈로 구성됩니다. 어휘 크기와 동일한 크기의 희소 임베딩을 생성하여 해석이 용이합니다.
- Inference-free SPLADE: 쿼리와 문서에 각기 다른 모듈을 사용하는 Router를 활용합니다. 쿼리 처리 속도가 매우 빠르다는 장점이 있어 쿼리 지연 시간이 중요한 검색 애플리케이션에 유용합니다.
- Contrastive Sparse Representation (CSR): 밀집 임베딩 모델 위에 SparseAutoEncoder 모듈을 추가하는 방식입니다. SPLADE와 달리 임베딩이 어휘와 직접적으로 매핑되지 않아 해석이 어렵지만, 기존의 고차원 밀집 모델을 효과적으로 희소화할 수 있습니다.
데이터셋 형식의 중요성
학습에 사용할 데이터셋의 형식은 선택한 손실 함수와 반드시 일치해야 합니다.
- 손실 함수가 레이블을 요구하는 경우, 데이터셋에는 “label” 또는 “score” 라는 이름의 열이 있어야 합니다.
- 레이블 열을 제외한 나머지 열들은 입력으로 간주되며, 이 열들의 개수는 손실 함수가 요구하는 입력 개수와 일치해야 합니다. 열의 이름은 중요하지 않지만 순서는 매우 중요합니다. 예를 들어, (기준, 긍정, 부정) 쌍을 입력으로 받는 손실 함수를 사용한다면 데이터셋의 첫 번째, 두 번째, 세 번째 열이 각각 기준, 긍정, 부정 텍스트에 해당해야 합니다.
손실 함수
SparseEncoder를 학습시키려면 SpladeLoss 또는 CSRLoss와 같은 래퍼(wrapper) 손실 함수가 필요합니다. 이들은 주 손실 함수 위에 희소성 정규화를 추가하는 역할을 합니다.
학습 팁
- 희소 인코더 모델은 평가 점수뿐만 아니라 임베딩의 희소성도 함께 평가해야 합니다. 희소성이 낮으면 저장 비용이 크고 검색 속도가 느려지기 때문입니다.
- 성능이 좋은 희소 인코더 모델들은 주로 더 강력한 교사 모델(예: CrossEncoder)로부터 증류(distillation)하는 방식으로 학습됩니다. 이는 직접 텍스트 쌍으로 학습하는 것보다 더 효과적인 결과를 낳습니다.
벡터 데이터베이스 연동
학습된 희소 임베딩 모델을 실제 환경에서 효과적으로 사용하려면 벡터 데이터베이스가 필수적입니다. Qdrant, OpenSearch, Elasticsearch와 같은 데이터베이스는 희소 임베딩을 대규모로 저장, 인덱싱 및 검색하기 위한 인프라를 제공합니다.