Sentence Transformersを使用して400倍高速なStatic Embedding Modelをトレーニングする

TL;DR

Hugging Faceは、標準的なTransformerベースの埋め込みの品質を少なくとも85%維持しつつ、CPU上で100倍〜400倍高速に動作する静的埋め込みモデル(static embedding models)のトレーニングレシピを公開しました。また、2つの具体的なモデル(英語検索用の static-retrieval-mrl-en-v1 と多言語類似度用の static-similarity-mrl-multilingual-v1)を、トレーニングスクリプト、評価結果、Weights & Biasesのログと共に公開しました。

手法

このアプローチは、対照学習(contrastive learning)を MultipleNegativesRankingLoss およびオプションのMatryoshka Representation Learningと組み合わせることで、アテンションベースのエンコーディングの代わりに単純なトークン埋め込みのルックアップを行う静的エンコーダをトレーニングします。これにより、品質の低下を最小限に抑えつつ、数桁の高速化を実現します。

トレーニングの詳細

要件

トレーニングには、datasetloss functiontraining argumentsevaluatortrainer のコンポーネントを備えた Sentence Transformers ライブラリを使用します。

モデルのインスピレーション

ターゲットとしたのは2つのモデルです。1つは英語専用の検索モデル、もう1つは多言語の汎用類似度モデルであり、どちらも BERTベースのトークナイザー(bert-base-uncased または bert-base-multilingual-uncased)をラップした StaticEmbedding モジュールと、1024の埋め込み次元を使用して初期化されています。

データセットの選択

英語検索には、gooaqmsmarco (triplet)、squads2orc (title-abstract-pair)、allnli (triplet)、paqtrivia_qamsmarco_10mswim_ir (en)、pubmedqa (triplet-20)、miracl (en-triplet-all)、mldr (en-triplet-all)、mr_tydi (en-triplet-all) を含む30のデータセットが選択されました。多言語類似度については、並列文を持つデータセット(wikititlestatoebatalkseuroparlglobal_voicesjw300musewikimatrixopensubtitles)と、ポジティブペアのデータセット(stackexchange-duplicatesquora-duplicateswikianswers-duplicatesallnlisimple_wikialtlexflickr30k_captionscoco_captionsnli_for_simcsenegation)を組み合わせ、計30のトレーニングデータセットを使用しました。

損失関数

MultipleNegativesRankingLoss が選ばれた理由は、バッチサイズ2048が RTX 3090 に収まり、CachedMultipleNegativesRankingLoss のオーバーヘッドや GISTEmbedLoss におけるガイドモデルによる低速化を回避できるためです。その上に、次元 [32, 64, 128, 256, 512, 1024] で MatryoshkaLoss が適用されました。

トレーニング引数

両モデルで使用された設定:num_train_epochs=1per_device_train_batch_size=2048per_device_eval_batch_size=2048learning_rate=2e-1warmup_ratio=0.1bf16=Truebatch_sampler=BatchSamplers.NO_DUPLICATESmulti_dataset_batch_sampler=MultiDatasetBatchSamplers.PROPORTIONALeval_strategy=stepseval_steps=250 (英語) または 1000 (多言語)、save_strategy=stepssave_stepseval_steps に一致、save_total_limit=2logging_stepseval_steps に一致、logging_first_step=True、および実行ごとの出力ディレクトリ。

評価器

英語検索モデルには、ゼロショット検索評価のために NanoBEIREvaluator を使用しました。多言語モデルは、評価のために MTEB タスク(STS、Classification、Pair Classification)に依存しています。

ハードウェア

トレーニングは、RTX 3090 GPU、i7-13700K CPU、および 32 GB RAM で実行されました。

全体的なトレーニングスクリプト

提供されたスクリプトは、データセットをロードし、StaticEmbedding モデルをインスタンス化し、MatryoshkaLoss で損失を構成し、トレーニング引数を設定し、オプションで評価器を実行し、SentenceTransformerTrainer でトレーニングを行い、最終的なモデルを保存します。英語検索スクリプトは17.8時間かかり、2.6 kWhを消費し、1 kgのCO₂を排出しました。多言語スクリプトは3.1時間かかり、0.5 kWhを消費し、0.2 kgのCO₂を排出しました。

使用方法

両モデルは、モデル名と device="cpu" を指定して SentenceTransformer を介してロードされます。推論は標準的な Sentence Transformers と同一です:model.encode は埋め込みを返し、model.similarity はコサイン類似度を計算します。truncate_dim 引数により、Matryoshka スタイルの次元削減が可能です(例:truncate_dim=256)。これらのモデルは、LangChain、LlamaIndex、Haystack、txtai でそのまま動作します。

パフォーマンス

英語検索

NanoBEIR において、static-retrieval-mrl-en-v1 は NDCG@10 で 0.5032 を達成しました。これは all-mpnet-base-v2 (0.5757) のスコアの 87.4% です。CPU では毎秒 107,419.51 文を処理し、all-mpnet-base-v2 (270.40 文/秒) よりも 397倍高速です。GPU では毎秒 97,171.47 文を処理し、all-mpnet-base-v2 (4043.13 文/秒) よりも 24倍高速です。Matryoshka 評価では、次元を 512 に半分に減らすと、NDCG@10 はわずか 1.47% 低下するだけです (0.5032 → 0.4957)。

多言語類似度

multilingual-e5-small と比較して、static-similarity-mrl-multilingual-v1 は STS で 92.3%、Pair Classification で 95.52%、Classification で 86.52% のスコアを記録しました。これは multilingual-e5-small よりも CPU で約 125倍、GPU で 10倍高速です。Matryoshka 評価では、次元を 256 (4分の1) に削減しても、英語 STS のパフォーマンスの低下はわずか 0.56% であることが示されています。

結論

提示されたレシピでトレーニングされた静的埋め込みモデルは、一般的な Transformer ベースの埋め込みの品質を少なくとも 85% 維持しながら、CPU で 100倍〜400倍、GPU で 10倍〜25倍の高速化を実現します。公開されたモデルにより、精度低下を最小限に抑えた効率的なオンデバイス、ブラウザ内、およびエッジコンピューティングのユースケースが可能になります。

次のステップ

ユーザーは、既存の Sentence Transformer モデルを static-retrieval-mrl-en-v1 または static-similarity-mrl-multilingual-v1 に置き換えるか、タスク固有のデータで独自の静的埋め込みをトレーニングできます。潜在的な改善策には、ハードネガティブマイニング、モデルスーピング、カリキュラム学習、ガイド付きインバッチ・ネガティブ・フィルタリング、シード最適化ランダム初期化、トークナイザーの再トレーニング、CachedMultipleNegativesRankingLoss による勾配キャッシュ、および大規模なエンコーダからのモデル蒸留が含まれます。

Sources