Matryoshka Representation Learning (MRL)
마트료시카 표현 학습(MRL)이 다중 세분성 임베딩을 지원하는 방법을 알아보세요. Ultralytics YOLO26의 검색과 엣지 배포를 최적화하는 방법을 살펴보세요.
마트료시카 표현 학습(MRL)은 인공지능(AI) 및 머신러닝(ML)에서 사용하는 학습 기법으로, 신경망이 하나의 출력 벡터 안에서 다중 세분도의 임베딩을 학습하도록 합니다. 러시아 전통 인형에서 영감을 얻은 MRL은 중요한 의미 정보를 앞부분에 배치하도록 임베딩을 구성합니다. 즉, 고차원 벡터(예: 1024차원)를 더 작은 중첩 하위 집합(예: 512, 256 또는 64차원)으로 잘라도 내부 표현을 잃지 않습니다. 이러한 유연성은 정보 검색 작업에서 일반적으로 발생하는 연산 오버헤드를 크게 줄입니다.
마트료시카 표현 학습의 작동 방식#
기존에는 임베딩 모델을 고정된 출력 크기에 대해 특정 손실 함수를 최적화하도록 학습했습니다. 메모리 절약을 위해 더 작은 벡터가 필요한 경우 시스템을 위해 새 모델 전체를 학습해야 했습니다. MRL은 학습 단계에서 중첩 손실 함수를 적용해 이 문제를 해결합니다. 전체 표현과 그 중첩 하위 집합을 함께 최적화합니다. OpenAI는 MRL을 도입해 최신 임베딩 API에 적용했으며, 개발자는 정확한 코사인 유사도 점수를 유지하면서 벡터 끝부분의 차원을 동적으로 제거할 수 있습니다.
실제 적용 사례#
MRL은 정확도와 저장 비용 및 메모리 대역폭 간 균형을 맞출 때 뚜렷한 이점을 제공합니다.
- LLM을 위한 적응형 벡터 검색: 검색 증강 생성(RAG) 파이프라인에서 대규모 언어 모델(LLMs)은 방대한 벡터 데이터베이스에 의존하는 경우가 많습니다. MRL을 사용하면 기업은 임베딩의 앞부분 64개 차원으로 빠른 대략적 시맨틱 검색을 수행한 뒤, 전체 1024차원 벡터를 사용해 상위 결과의 순위를 다시 매길 수 있습니다. 이 2단계 접근법은 벡터 검색을 크게 가속하고 데이터베이스 저장 비용을 낮춥니다.
- 엣지에서 확장 가능한 컴퓨터 비전: Ultralytics Platform을 사용해 컴퓨터 비전 시스템을 배포할 때 하드웨어 제약은 크게 달라질 수 있습니다. MRL을 사용하는 모델은 전체 크기의 시각 임베딩을 강력한 클라우드 배포 서버로 전송하는 동시에, 저전력 엣지 컴퓨팅 기기에서는 128차원으로 잘린 임베딩을 전송하는 방식으로 원활하게 전환하여 모델을 재학습하지 않고도 지연 시간을 최적화할 수 있습니다.
관련 개념 구분#
MRL을 제대로 활용하려면 데이터를 압축하는 기존 기법과 구분하는 것이 좋습니다.
- MRL과 차원 축소 비교: PCA(주성분 분석)나 t-SNE와 같은 알고리즘은 학습 후 데이터를 압축하는 데 적용됩니다. 반면 MRL은 학습 중 신경망 아키텍처에 기본적으로 통합되어 더 깊은 비선형 관계를 보존합니다.
- MRL과 모델 가지치기 비교: 가지치기는 실제 신경망에서 가중치와 계층을 제거해 추론 속도를 높입니다. 예를 들어 Ultralytics YOLO 모델의 더 작은 변형을 만들 수 있습니다. MRL은 모델 크기를 바꾸지 않고 모델이 생성하는 출력 벡터의 크기만 변경합니다.
실무 구현#
MRL 임베딩은 시맨틱 인덱싱을 위한 복잡한 로직 없이도 매우 간단하게 자를 수 있습니다. 가장 중요한 특징이 앞쪽 차원에 집중되어 있으므로 배열을 간단히 슬라이스하면 됩니다. 다음 예제에서는 기본적인 PyTorch 텐서 연산을 사용해 시뮬레이션한 YOLO26 멀티모달 출력을 자르는 방법을 보여 줍니다.
import torch
# Simulate a full 1024-dimensional MRL embedding returned by a model
full_embedding = torch.rand(1, 1024)
# To deploy on memory-constrained hardware, simply slice the first 256 dimensions
# Because the model was trained with MRL, this subset remains highly accurate
truncated_embedding = full_embedding[:, :256]
print(f"Original size: {full_embedding.shape[1]}, Compressed size: {truncated_embedding.shape[1]}")








