Matryoshka Representation Learning (MRL)
Matryoshka Representation Learning(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]}")








