임베딩 줄이기: Matryoshka(MRL) 자르기 vs PCA
Honey, I shrunk the embeddings: Matryoshka vs. PCA
TL;DR Highlight
임베딩 차원을 줄였더니 PCA가 MRL 자르기와 같거나 더 잘 버텼다
Who Should Read
벡터 DB 비용과 검색 속도 때문에 임베딩 차원 축소를 고민하는 RAG 백엔드 개발자
Core Mechanics
- MRL은 학습 때, PCA는 학습 후에 줄인다
- MRL(Matryoshka Representation Learning)은 앞쪽 d개 차원에 중요한 정보가 몰리도록 학습하고, 쓸 때는 앞 d개를 자른 뒤 재정규화한다.
- PCA는 임베딩 샘플에서 변동이 큰 방향 top d개를 투영 행렬로 쓰며 어떤 모델에도 적용할 수 있다.
- 대신 PCA는 변환 행렬을 저장하고 버전 관리해야 해서 운영이 복잡해진다.
- text-embedding-3-small은 32차원에서 PCA 65%, 자르기 46%
- 원래 1,536차원 대비 NDCG@10 유지율이며 BEIR 8개 데이터셋 평균이다.
- 64차원은 PCA 82%, 자르기 71%였다.
- 512차원에서만 자르기가 98%로 PCA 97%보다 살짝 앞섰다.
- qwen3-embedding-8b는 격차가 작았다
- 4,096차원 대비 32차원 유지율이 PCA 71%, 자르기 68%였다.
- 128차원은 둘 다 91%였다.
- 필자는 qwen3의 MRL 학습이 더 강해서 PCA와의 격차가 줄었다고 본다.
- MRL 덕분에 PCA가 잘 되는 건 아니었다
- MRL 없이 학습된 ada-002에 PCA를 써도 32차원에서 59%를 유지했다.
- 이는 MRL 모델 3-small을 자른 46%보다 높다.
Community Reactions
- 양자화 전에 랜덤 회전을 쓸 수 있다는 의견
- 랜덤 회전이 정보를 여러 차원에 퍼뜨려 더 강한 양자화를 가능하게 한다는 의견이다.
- 다만 텍스트 임베딩이 그런 구조를 갖는지는 불확실하다는 단서가 붙었다.
- 다른 실험에서는 결과가 이렇게 균일하지 않았다는 경험
- 여러 임베딩 모델로 비슷한 비교를 해 봤더니 곡선이 이처럼 고르지 않았다는 경험이다.
- 다만 API 기반 모델은 쓰지 않았다고 한다.
- 원 MRL 논문의 SVD 기준선은 저차원에서 크게 떨어졌다는 지적
- 논문 Table 1에서 d>=256은 비슷했지만 d가 8, 32, 64에서는 성능이 크게 낮았다는 것이다.
- 왜 이번 결과와 다른지 조사했느냐는 질문이 달렸다.
- PCA는 대규모 데이터에서 확장성이 문제라는 의견
- O(n^3) 복잡도 때문에 아주 큰 데이터셋에는 비현실적이라는 의견이다.
- MRL은 약간의 성능을 내주고 학습·검증 데이터 커버리지를 보장받는 장점이 있다고 한다.
How to Apply
- 내 임베딩으로 자르기 vs PCA 비교 돌려보기
- 오늘 내 코퍼스에서 문서 임베딩 1,000개를 뽑아 PCA를 맞추고, 같은 차원으로 앞쪽 자르기와 비교하라.
- 쿼리 세트로 NDCG@10을 풀 차원 대비 유지율로 계산하라.
- 128·64·32차원에서 차이가 나는지 확인하라.
- MRL 미지원 모델이면 PCA를 우선 시험하기
- ada-002처럼 MRL 없이 학습된 모델에서도 PCA는 32차원에 59%를 유지했다.
- 모델 교체 없이 저장 비용을 줄이고 싶으면 PCA 투영을 적용하라.
- PCA 행렬을 버전과 함께 인덱스에 묶어 관리하기
- 투영 행렬을 파일로 저장하고 인덱스 메타데이터에 버전을 기록하라.
- 문서 적재와 쿼리에 같은 버전을 쓰도록 강제하라.
- 실제 환경에서 다시 검증하기
- 필자 실험은 정확 검색이라 근사 인덱스, BM25, 리랭커를 쓰는 운영 환경과 다르다.
- 도입 전에 운영과 같은 구성에서 품질 저하를 측정하라.
Try It
# Claude나 ChatGPT에 붙여넣는 프롬프트 (코드 생성용)
파이썬으로 임베딩 차원 축소 비교 스크립트를 작성해줘.
- 입력: numpy 배열 doc_emb (N x D), query_emb (Q x D), 그리고 정답 {{relevance 정보 형식}}
- 방법 1: 앞 d개 차원 자르기 후 L2 재정규화
- 방법 2: sklearn PCA를 doc_emb 중 {{1000}}개 샘플로 맞추고, 문서와 쿼리에 투영 후 L2 재정규화
- d는 [512, 256, 128, 64, 32]
- 코사인 유사도로 검색하고 NDCG@10을 계산
- 각 d의 NDCG@10을 풀 차원 NDCG@10으로 나눈 유지율을 표로 출력
이어서 해 볼 것: 결과에 int8 양자화(문서만)를 추가해서 크기 대비 품질을 비교해줘.Terminology
관련 논문
트랜스포머는 '기억 저장소'에서 처음부터 만들어 낼 수 있었다
선형층→MLP→self-attention을 기억 저장소로 보면 용량이 64→약 2,700→100만 이상
400년치 고문서에 AI를 돌렸더니 잊힌 운석·코뿔소·화산 폭발이 나왔다
임베딩 검색과 싼 필터 모델로 400년 고문서를 뒤져 미기록 사건 발굴
EmbeddingGemma 2: 텍스트·이미지·오디오·비디오를 한 벡터 공간에 넣는 오픈 경량 임베딩 모델
740M 오픈 모델 하나로 텍스트·이미지·오디오·비디오를 같은 벡터 공간에서 검색
RAG-NAROK: 출처를 직접 반박하는 문서로 RAG 지식베이스를 오염시키는 공격
검색된 출처를 겨냥해 반박문을 심었더니 1위 검색과 탐지 회피가 높아졌다
텍스트냐 이미지냐 둘 다냐: 멀티모달 문서 QA 입력 방식 비교
문서 QA에서 페이지 이미지가 정확도는 높지만 느려서, 질문별 라우터로 지연 30% 줄였다
MS 임원이 AI 스크래핑을 '인류 역사상 최대의 노동 도둑질'이라 불렀다는 NYT 소송 공개 문서
NYT 소송 공개 문서에서 MS·OpenAI 내부의 스크래핑 인식이 드러났다
임베딩의 보편적 기하 구조 활용: 짝 데이터 없이 임베딩 공간 간 변환
짝 데이터 없이 임베딩을 다른 모델 공간으로 옮겼고, 벡터 DB 보안 위험이 드러났다