はじめに
openclip-gemmaを使うと、EmbeddingGemma 2をCLIPと同じような画像・テキスト埋め込みの流れで利用できます。今回は新たに、Matryoshka表現(MRL)の出力次元を指定できるようにしました。
MRLでは、用途に応じて埋め込みの次元数を選べます。たとえば、精度を優先して768次元を使う、ベクトルの保存量を減らすため256次元にする、といった選択ができます。
前回はXM3600を使った画像・テキスト検索を扱いました。今回は別のベンチマークとして、CIFAR-10/100のゼロショット画像分類を使い、CLIP系モデルとの精度差と、EmbeddingGemma 2の次元を小さくしたときの変化を見ます。
今回のベンチマークの結果は下記のリポジトリで確認できます。他のデータセットもあるので興味ある方はぜひ見てください。
https://github.com/kotadymo/vision-language-benchmarks
ベンチマーク条件
| 項目 | 条件 |
|---|---|
| データセット | CIFAR-10 / CIFAR-100 の公式test split、各10,000枚 |
| タスク | クラス名のテキストと画像を照合するゼロショット分類 |
| プロンプト | P0(CLIP Benchmark互換の18テンプレート) |
| MRL次元 | 768 / 512 / 256 / 128 |
| 精度 | FP32 |
| GPU | NVIDIA RTX 4070 Ti SUPER |
| EmbeddingGemma 2 |
openclip-gemma==0.4.0、google/embeddinggemma-2
|
EmbeddingGemma 2にはモデル指定のClassificationタスクプロンプトも適用しています。Top-1は正解クラスが1位になった割合、Top-5は正解クラスが上位5件以内に入った割合です。モデル間で生の類似度やlogit値を比べるのではなく、分類正解率を比較します。
MRLの各次元は、768次元の出力を後から切り詰めたものではありません。truncate_dimを指定して、各次元で独立に推論した全データセットの測定値です。
image_features = model.encode_image(image_batch, truncate_dim=256)
text_features = model.encode_text(text_tokens, truncate_dim=256)
データセットとゼロショット分類タスク
CIFAR-10/100は、32×32ピクセルのカラー画像を10クラスまたは100クラスに分類したデータセットです。公式test splitはどちらも10,000枚です。下図にはCIFAR-10のtest splitから、airplane、automobile、birdの各クラスで最初に現れる実画像を1枚ずつ掲載しています(indexは0始まり)。
32×32ピクセルなのでぼやけてしまっています。この画像を分類できるのはすごいですね。
ゼロショット分類では、CIFARの画像を使った追加学習は行わず、各画像とクラス名のテキストを照合します。今回のP0では、各クラス名を18種類のテンプレート(例:a photo of a {class}.)に当てはめてテキスト特徴を作ります。各クラスについて18個の特徴を正規化して平均し、クラスの代表ベクトルにします。EmbeddingGemma 2では、テキスト埋め込み時にモデル指定のClassificationタスクプロンプトも使います。
画像特徴とクラス代表ベクトルのコサイン類似度を計算し、類似度の高い順にクラスを並べます。正解ラベルが1位ならTop-1、上位5件以内ならTop-5で正解と数え、test split全件での割合を正解率として報告します。図の3枚はtest splitの例で、精度はこの3枚だけでなく全10,000枚を使って計算しています。
CLIP系モデルとの比較
下表はP0・FP32でのTop-1 / Top-5正解率(%)です。比較モデルは過去の検証結果、EmbeddingGemma 2の768次元は今回のMRLベンチマークから掲載しています。
| モデル | CIFAR-10 Top-1 / Top-5 | CIFAR-100 Top-1 / Top-5 |
|---|---|---|
| OpenAI CLIP ViT-B/32 | 89.83 / 99.61 | 64.20 / 88.73 |
| OpenCLIP ViT-B/32 LAION-2B | 93.56 / 99.81 | 75.56 / 93.87 |
| Multilingual OpenCLIP ViT-B/32 | 93.64 / 99.88 | 76.55 / 94.99 |
| SigLIP 2 Base/16 | 93.62 / 99.85 | 73.68 / 91.89 |
| OpenCLIP ViT-L/14 LAION-2B | 96.61 / 99.85 | 83.34 / 96.63 |
| EmbeddingGemma 2(768D) | 94.66 / 99.84 | 76.08 / 92.92 |
CIFAR-10では、EmbeddingGemma 2の768次元はOpenCLIP ViT-B/32 LAION-2BよりTop-1で+1.10ポイント高く、Multilingual OpenCLIPより+1.02ポイント高い結果でした。一方、大きなViT-L/14には1.95ポイント届きません。
CIFAR-100では、768次元のEmbeddingGemma 2はOpenCLIP ViT-B/32 LAION-2Bを+0.52ポイント上回り、Multilingual OpenCLIPとの差は-0.47ポイントでした。ViT-L/14との差は-7.26ポイントです。モデル規模や学習データは異なるため、これは各チェックポイントの実測値を並べた比較であり、同一サイズのモデル同士の比較ではありません。
マトリョーシカ表現Lで次元を小さくしたとき
FP32のベクトル1件あたりのサイズは「次元数 × 4 byte」です。MRLの精度とサイズの変化をまとめます。括弧内はTop-1の768次元からの差(ポイント)です。
| 次元 | ベクトルサイズ | 削減率 | CIFAR-10 Top-1 / Top-5(ΔTop-1) | CIFAR-100 Top-1 / Top-5(ΔTop-1) |
|---|---|---|---|---|
| 768D | 3,072 byte | 0% | 94.66 / 99.84(+0.00) | 76.08 / 92.92(+0.00) |
| 512D | 2,048 byte | 33.3% | 94.28 / 99.78(-0.38) | 75.57 / 92.68(-0.51) |
| 256D | 1,024 byte | 66.7% | 93.82 / 99.74(-0.84) | 74.98 / 92.33(-1.10) |
| 128D | 512 byte | 83.3% | 90.35 / 99.62(-4.31) | 66.74 / 87.44(-9.34) |
256次元では、ベクトルサイズを768次元の3分の1にしながら、Top-1の低下はCIFAR-10で0.84ポイント、CIFAR-100で1.10ポイントでした。保存容量やベクトル検索インデックスを小さくしたい場合、精度とのバランスを取りやすい設定です。
128次元ではベクトルサイズを6分の1にできますが、とくに100クラスのCIFAR-100で精度低下が大きくなります。小さくすれば常に最適というわけではなく、データや用途に合わせた選択が必要です。
なお、今回の測定では次元を変えても画像推論速度はおよそ10.2 images/sで大きく変わりませんでした。MRLの主な利点は埋め込みベクトルやインデックスの省スペース化であり、画像encoderの推論時間を大幅に短縮するものではありません。
まとめ
EmbeddingGemma 2はCIFAR-10/100の768次元P0で、OpenCLIP ViT-B/32クラスに近い、または上回るTop-1正解率を示しました。さらにopenclip-gemmaのnative MRL対応により、同じモデルで出力次元を選べます。
今回の値では、256次元はベクトルサイズを3分の1に抑えつつ、768次元からのTop-1低下が約1ポイントでした。大規模なベクトル検索で容量を優先する場合は256次元、精度を優先する場合は768次元、というように用途に合わせて使い分けられます。128次元ではCIFAR-100の低下が目立つため、採用前に対象タスクでの評価をおすすめします。
ライセンス・出典
- CIFAR-10 / CIFAR-100: 公式データセットページ。公式ページの案内に従い、技術報告(Alex Krizhevsky, Learning Multiple Layers of Features from Tiny Images, 2009)を
- 画像例: CIFAR-10公式test splitから取得した実画像(
airplaneindex 3、automobileindex 6、birdindex 25)

