Closed5

「Embedding Gemma」を試す

kun432kun432

公式

https://developers.googleblog.com/en/introducing-embeddinggemma/

冒頭抜粋(翻訳はDeepL)

EmbeddingGemmaのご紹介を嬉しく思います。これは新たなオープンエンベディングモデルであり、そのサイズにおいて最高クラスの性能を発揮します。デバイス上でのAI処理を特に想定して設計された本モデルは、3億800万という高効率なパラメータ設計により、検索拡張生成(RAG)やセマンティック検索といった技術を駆使したアプリケーションを、ハードウェア上で直接実行可能にします。インターネット接続がなくてもどこでも機能する、プライベートで高品質なエンベディングを提供します。

npakaさんの記事がわかりやすい

https://note.com/npaka/n/n9b7fce21ae5a

kun432kun432

モデルは以下の3つ

https://huggingface.co/google/embeddinggemma-300m

Quantization Aware Trainingのモデルもある。unquantizeということは量子化は自分で、ってことなのかも。

https://huggingface.co/google/embeddinggemma-300m-qat-q4_0-unquantized

https://huggingface.co/google/embeddinggemma-300m-qat-q8_0-unquantized

embeddinggemma-300mのモデルカードから抜粋して翻訳(GPT-5、一部Diaも使っている)。

概要

EmbeddingGemmaは、300Mパラメータの、同クラスで最先端のオープン埋め込みモデルで、GoogleによってGemma 3(T5Gemmaによる初期化)およびGeminiモデルの作成に用いられたのと同じ研究・技術を基に構築されています。EmbeddingGemmaはテキストのベクトル表現を生成し、分類、クラスタリング、意味的類似検索など、検索および検索・取得(リトリーバル)タスクに適しています。本モデルは100以上の話し言葉の言語データで学習されています。

小型でオンデバイス志向のため、モバイル、ノートPC、デスクトップなどリソースに制約のある環境でもデプロイ可能で、最先端AIモデルへのアクセスを民主化し、あらゆる人々のイノベーションを後押しします。

入出力

  • 入力:
    • 質問、プロンプト、埋め込み対象の文書などの文字列
    • 最大入力コンテキスト長は2048トークン
  • 出力:
    • 入力テキストデータの数値ベクトル表現
    • 出力埋め込みの次元は768。Matryoshka Representation Learning(MRL)により、より小さい選択肢(512、256、または128)も利用可能。MRLは、768次元の出力埋め込みを希望の次元に切り詰め、再正規化することで、効率的かつ高精度な表現を可能にします。

使用方法

これらのモデル重みはSentence Transformersでの利用を想定しており、バックボーンとしてHugging Face TransformersGemma 3実装を使用します。

モデルデータ

学習データセット

本モデルは、約3,200億トークンに及ぶ多様なテキストソースからなるデータセットで学習されています。主な構成要素は以下のとおりです。

  • Webドキュメント: 多様なWebテキストにより、幅広い文体、話題、語彙に触れられるようにしました。学習データセットには100以上の言語のコンテンツが含まれます。
  • コードおよび技術文書: コードや技術ドキュメントへの曝露により、プログラミング言語や専門的な科学コンテンツの構造・パターンを学習し、コードや技術的な質問への理解を高めます。
  • 合成データおよびタスク特化データ: 合成データにより特定スキルを学習します。情報検索、分類、感情分析などのタスクに合わせて作成したデータを含み、一般的な埋め込み用途での性能を微調整します。

これら多様なデータソースの組み合わせは、多言語に強く、幅広いタスクやデータ形式に対応できる強力な埋め込みモデルの学習に不可欠です。

データ前処理

学習データに施した主なクレンジングおよびフィルタリング手法は以下のとおりです。

  • CSAMフィルタリング: 児童性的虐待資料(CSAM)を除外するため、データ準備工程の複数段階で厳格なフィルタリングを実施しました。
  • 機微情報フィルタリング: Gemmaの事前学習モデルを安全かつ信頼できるものにする一環として、特定の個人情報やその他の機微情報を学習集合から除外するために自動手法を用いました。
  • 追加手法: 当社のポリシーに沿った、コンテンツ品質および安全性に基づくフィルタリング。

モデル開発

ハードウェア

EmbeddingGemmaは最新世代のTensor Processing Unit(TPU)ハードウェア(TPUv5e)で学習されました。詳細はGemma 3モデルカードを参照してください。

ソフトウェア

学習にはJAXおよびML Pathwaysを使用しました。詳細はGemma 3モデルカードを参照してください。

評価

ベンチマーク結果

本モデルはテキスト理解の様々な側面を網羅するため、多種多様なデータセットおよび指標で評価しました。

フル精度チェックポイント

MTEB (Multilingual, v2)

次元 平均(タスク) 平均(タスクタイプ)
768d 61.15 54.31
512d 60.71 53.89
256d 59.68 53.01
128d 58.23 51.77

MTEB (English, v2)

次元 平均(タスク) 平均(タスクタイプ)
768d 68.36 64.15
512d 67.80 63.59
256d 66.89 62.94
128d 65.09 61.56

MTEB (Code, v1)

次元 平均(タスク) 平均(タスクタイプ)
768d 68.76 68.76
512d 68.48 68.48
256d 66.74 66.74
128d 62.96 62.96

QATチェックポイント

MTEB (Multilingual, v2)

量子化設定(次元数) 平均(タスク) 平均(タスクタイプ)
Q4_0 (768d) 60.62 53.61
Q8_0 (768d) 60.93 53.95
Mixed Precision* (768d) 60.69 53.82

MTEB (English, v2)

量子化設定(次元数) 平均(タスク) 平均(タスクタイプ)
Q4_0 (768d) 67.91 63.64
Q8_0 (768d) 68.13 63.85
Mixed Precision* (768d) 67.95 63.83

MTEB (Code, v1)

量子化設定(次元数) 平均(タスク) 平均(タスクタイプ)
Q4_0 (768d) 67.99 67.99
Q8_0 (768d) 68.70 68.70
Mixed Precision* (768d) 68.03 68.03

注記: QATモデルは量子化後に評価されています。

* Mixed Precisionは、埋め込み、フィードフォワード、投影層をint4、アテンションをint8とするチャネル単位の量子化(e4_a8_f4_p4)を指します。

プロンプトの指示

EmbeddingGemmaは、文書検索、質問応答、事実検証などの様々なユースケース、またはクエリ/ドキュメントといった特定の入力タイプに最適化された埋め込みを生成できます。これらのプロンプトは入力文字列の前に付加されます。クエリ用プロンプトはtask: {タスク記述} | query: という形式で、タスク記述はユースケースにより変わり、既定はsearch resultです。ドキュメント用プロンプトはtitle: {title | "none"} | text: という形式で、titleはnone(既定)または実際のタイトルです。タイトルを指定できる場合、ドキュメントプロンプトでの性能向上が見込めますが、手動整形が必要になる場合があります。

ユースケースおよび入力データタイプに応じて、以下のプロンプトを使用してください。これらは、利用するモデリングフレームワークのEmbeddingGemma設定に既に含まれている場合があります。

用途(タスクタイプenum) 説明 推奨プロンプト
Retrieval(Query) ドキュメント検索や情報検索に最適化された埋め込み生成 task: search result | query: {content}
Retrieval(Document) ドキュメント検索用の埋め込み生成(タイトルを入れると精度向上) title: {title | "none"} | text: {content}
Question Answering 質問応答向けのクエリ埋め込み生成 task: question answering | query: {content}
Fact Verification 事実確認向けのクエリ埋め込み生成 task: fact checking | query: {content}
Classification 事前定義ラベルでの分類向けクエリ埋め込み生成 task: classification | query: {content}
Clustering 類似性に基づくクラスタリング向けクエリ埋め込み生成 task: clustering | query: {content}
Semantic Similarity 類似度評価向け(検索用途には非推奨) task: sentence similarity | query: {content}
Code Retrieval 自然言語クエリでコードブロックを検索(コード側は retrieval_document を使用) task: code retrieval | query: {content}

使用方法と制限事項

これらのモデルには、ユーザーが認識しておくべき制限があります。

想定される用途

オープンな埋め込みモデルは、産業やドメインを問わず幅広い用途があります。以下は潜在的な用途の一例であり、網羅的ではありません。この一覧は、モデル作成者が学習・開発時に想定した可能なユースケースの文脈情報を提供することを目的としています。

  • 意味的類似性: レコメンデーションや重複検出など、テキストの類似性評価に最適化された埋め込み

  • 分類: 感情分析やスパム検出など、あらかじめ定めたラベルによる分類に最適化された埋め込み

  • クラスタリング: 文書整理、マーケットリサーチ、異常検知など、テキストの類似性に基づくクラスタリングに最適化された埋め込み

  • 検索(リトリーバル)

    • ドキュメント: 記事、書籍、Webページなどをインデックス化して検索する用途に最適化された埋め込み
    • クエリ: カスタム検索など、一般的な検索クエリに最適化された埋め込み
    • コードクエリ: 自然言語クエリに基づくコードブロックの検索(コードサジェストやコード検索など)に最適化された埋め込み
  • 質問応答: 質問応答システムにおける質問用埋め込みで、質問に回答する文書の検索に最適化(例: チャットボックス)

  • 事実検証: 主張の検証用埋め込みで、主張を支持または反証する証拠を含む文書の検索に最適化(例: 自動ファクトチェックシステム)

制限事項

  • 学習データ
    • 学習データの品質と多様性は、モデルの能力に大きく影響します。学習データに偏りや欠落があると、モデルの応答に限界が生じる可能性があります。
    • 学習データセットのカバレッジは、モデルが効果的に扱える主題領域を規定します。
  • 言語の曖昧性とニュアンス
    • 自然言語は本質的に複雑です。モデルは微妙なニュアンス、皮肉、比喩的表現の理解に苦労する場合があります。

倫理的考慮事項とリスク

識別されたリスクと対応策:

  • バイアスの助長: 評価指標や人手レビューを用いた継続的な監視、学習・微調整・その他の用途におけるデバイアス手法の検討が推奨されます。
  • 悪意ある目的での濫用: 技術的制約や開発者・エンドユーザー教育は、埋め込みの悪用抑止に寄与できます。教育リソースや不正使用の報告手段を提供します。Gemmaモデルの禁止用途はGemma禁止使用ポリシーに記載されています。
  • プライバシー侵害: モデルは特定の個人情報やその他の機微情報を除外するためにフィルタリングされたデータで学習されています。開発者は、プライバシー保護の手法を用い、関連するプライバシー規制を順守することが推奨されます。

利点

リリース時点において、このモデル群は、責任あるAI開発のために一から設計された高性能なオープン埋め込みモデル実装を提供します。本書で説明したベンチマーク評価指標を用いた比較では、同等規模の他のオープンモデル代替に対して優れた性能を示しました。

ライセンスはGemmaライセンス

kun432kun432

Colaboratoryで試す。ランタイムはCPUで。

パッケージインストール

!pip install -U sentence-transformers

モデルをロード。Gatedモデルなので、HF側で利用申請の上、トークンが必要になる。

from sentence_transformers import SentenceTransformer

# 🤗 Hub からダウンロード
model = SentenceTransformer("google/embeddinggemma-300m")

推論。モデルカードのコードそのまま

%%time

# クエリとドキュメントを与えて推論を実行
query = "Which planet is known as the Red Planet?"
documents = [
    "Venus is often called Earth's twin because of its similar size and proximity.",
    "Mars, known for its reddish appearance, is often referred to as the Red Planet.",
    "Jupiter, the largest planet in our solar system, has a prominent red spot.",
    "Saturn, famous for its rings, is sometimes mistaken for the Red Planet."
]
query_embeddings = model.encode_query(query)
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings.shape)

# 類似性を計算して順位を決定する
similarities = model.similarity(query_embeddings, document_embeddings)
print(similarities)

デフォルトだと768次元。

出力
(768,) (4, 768)
tensor([[0.4989, 0.7087, 0.5910, 0.5932]])
CPU times: user 669 ms, sys: 23.5 ms, total: 693 ms
Wall time: 805 ms

日本語でも。

query = "どの惑星が赤い惑星として知られていますか?"
documents = [
    "金星は、その大きさと地球への近さから、しばしば地球の双子と呼ばれている。",
    "赤い外観で知られる火星は、しばしば赤い惑星と呼ばれる。",
    "太陽系で最大の惑星である木星には、目立つ赤い斑点がある。",
    "土星はその環で有名だが、時に赤い惑星と間違われることがある。"
]
query_embeddings = model.encode_query(query)
document_embeddings = model.encode_document(documents)

similarities = model.similarity(query_embeddings, document_embeddings)
print(similarities)
出力
tensor([[0.4239, 0.6757, 0.5397, 0.6041]])

ランキングにしてみる。

import torch

query = "中華そばのオススメを教えて。"
documents = [
    "木の温もりあふれるブックカフェで、自家焙煎の深煎りコーヒーと季節のタルトを味わいながら、窓辺から路面電車をのんびり眺められるんだ。",
    "庭にハーブが茂るガーデンカフェでは、ハンドドリップの浅煎りとフレッシュハーブティーが選べて、小鳥のさえずりが BGM 代わりになるよ。",
    "港直送の鯖を炙りしめ鯖にしてくれる専門店、皮目の香ばしさと酢のきりりとした酸味が口いっぱいに広がるんだ。",
    "カウンター割烹の金目鯛の煮付けは、甘辛ダレが骨の隅々まで染みていて、白ご飯が思わずおかわり必至だよね。",
    "昔ながらの屋台ラーメンは鶏ガラの澄んだ醤油スープと細ちぢれ麺が相性抜群で、深夜の胃袋にしみるんだ。",
    "真っ白な豚骨スープに焦がしニンニク油をひと垂らしした濃厚ラーメン、替え玉が無料でつい無限ループしてしまうよ。",
    "スリランカ式の混ぜて食べるプレートカレーでは、15種類のスパイスが複雑に重なって食べ進めるほど香りが花開くんだ。",
    "野菜がごろごろ入った欧風ビーフカレーは、赤ワインとバターのコクが効いたシャバっとルウで後を引くよ。",
    "薪窯ナポリピッツァのマルゲリータは、モッツァレラがびよーんと伸びて焼き立てを頬張る瞬間がたまらない。",
    "4種のチーズをのせたクアトロフォルマッジに蜂蜜を垂らすスタイルが人気で、塩気と甘さのコントラストがクセになるんだ。",
    "しゅわっととろけるバスクチーズケーキ専門店、表面の香ばしい焦げと濃厚クリーミーな中身のギャップが病みつきになるよ。",
    "パリパリの薄皮たい焼きは羽根つきで端っこまで香ばしく、黒あんか白あんか毎回真剣に迷っちゃうんだよね。",
]

query_embeddings = model.encode_query(query)
document_embeddings = model.encode_document(documents)

similarities = model.similarity(query_embeddings, document_embeddings).detach().flatten().cpu() 
similarities_sorted = torch.argsort(similarities, descending=True)

for rank, idx in enumerate(similarities_sorted.tolist(), 1):
    print(f"{rank:>2}. score:{similarities[idx]:.4f}, idx:{idx}, {documents[idx]}")
出力
 1. score:0.5013, idx:4, 昔ながらの屋台ラーメンは鶏ガラの澄んだ醤油スープと細ちぢれ麺が相性抜群で、深夜の胃袋にしみるんだ。
 2. score:0.4980, idx:2, 港直送の鯖を炙りしめ鯖にしてくれる専門店、皮目の香ばしさと酢のきりりとした酸味が口いっぱいに広がるんだ。
 3. score:0.4749, idx:0, 木の温もりあふれるブックカフェで、自家焙煎の深煎りコーヒーと季節のタルトを味わいながら、窓辺から路面電車をのんびり眺められるんだ。
 4. score:0.4737, idx:5, 真っ白な豚骨スープに焦がしニンニク油をひと垂らしした濃厚ラーメン、替え玉が無料でつい無限ループしてしまうよ。
 5. score:0.4620, idx:10, しゅわっととろけるバスクチーズケーキ専門店、表面の香ばしい焦げと濃厚クリーミーな中身のギャップが病みつきになるよ。
 6. score:0.4606, idx:11, パリパリの薄皮たい焼きは羽根つきで端っこまで香ばしく、黒あんか白あんか毎回真剣に迷っちゃうんだよね。
 7. score:0.4529, idx:8, 薪窯ナポリピッツァのマルゲリータは、モッツァレラがびよーんと伸びて焼き立てを頬張る瞬間がたまらない。
 8. score:0.4397, idx:9, 4種のチーズをのせたクアトロフォルマッジに蜂蜜を垂らすスタイルが人気で、塩気と甘さのコントラストがクセになるんだ。
 9. score:0.4325, idx:3, カウンター割烹の金目鯛の煮付けは、甘辛ダレが骨の隅々まで染みていて、白ご飯が思わずおかわり必至だよね。
10. score:0.4273, idx:7, 野菜がごろごろ入った欧風ビーフカレーは、赤ワインとバターのコクが効いたシャバっとルウで後を引くよ。
11. score:0.4231, idx:6, スリランカ式の混ぜて食べるプレートカレーでは、15種類のスパイスが複雑に重なって食べ進めるほど香りが花開くんだ。
12. score:0.4230, idx:1, 庭にハーブが茂るガーデンカフェでは、ハンドドリップの浅煎りとフレッシュハーブティーが選べて、小鳥のさえずりが BGM 代わりになるよ。

次元数を減らしてみる。truncate_dim=N を付与すれば良いみたい。

query_embeddings = model.encode_query(query, truncate_dim=256)
document_embeddings = model.encode_document(documents, truncate_dim=256)
print(query_embeddings.shape, document_embeddings.shape)

similarities = model.similarity(query_embeddings, document_embeddings).detach().flatten().cpu() 
similarities_sorted = torch.argsort(similarities, descending=True)

for rank, idx in enumerate(similarities_sorted.tolist(), 1):
    print(f"{rank:>2}. score:{similarities[idx]:.4f}, idx:{idx}, {documents[idx]}")
出力
(256,) (12, 256)
 1. score:0.6485, idx:2, 港直送の鯖を炙りしめ鯖にしてくれる専門店、皮目の香ばしさと酢のきりりとした酸味が口いっぱいに広がるんだ。
 2. score:0.6349, idx:5, 真っ白な豚骨スープに焦がしニンニク油をひと垂らしした濃厚ラーメン、替え玉が無料でつい無限ループしてしまうよ。
 3. score:0.6330, idx:4, 昔ながらの屋台ラーメンは鶏ガラの澄んだ醤油スープと細ちぢれ麺が相性抜群で、深夜の胃袋にしみるんだ。
 4. score:0.6263, idx:10, しゅわっととろけるバスクチーズケーキ専門店、表面の香ばしい焦げと濃厚クリーミーな中身のギャップが病みつきになるよ。
 5. score:0.6130, idx:11, パリパリの薄皮たい焼きは羽根つきで端っこまで香ばしく、黒あんか白あんか毎回真剣に迷っちゃうんだよね。
 6. score:0.6124, idx:8, 薪窯ナポリピッツァのマルゲリータは、モッツァレラがびよーんと伸びて焼き立てを頬張る瞬間がたまらない。
 7. score:0.5943, idx:6, スリランカ式の混ぜて食べるプレートカレーでは、15種類のスパイスが複雑に重なって食べ進めるほど香りが花開くんだ。
 8. score:0.5921, idx:9, 4種のチーズをのせたクアトロフォルマッジに蜂蜜を垂らすスタイルが人気で、塩気と甘さのコントラストがクセになるんだ。
 9. score:0.5897, idx:0, 木の温もりあふれるブックカフェで、自家焙煎の深煎りコーヒーと季節のタルトを味わいながら、窓辺から路面電車をのんびり眺められるんだ。
10. score:0.5761, idx:7, 野菜がごろごろ入った欧風ビーフカレーは、赤ワインとバターのコクが効いたシャバっとルウで後を引くよ。
11. score:0.5733, idx:1, 庭にハーブが茂るガーデンカフェでは、ハンドドリップの浅煎りとフレッシュハーブティーが選べて、小鳥のさえずりが BGM 代わりになるよ。
12. score:0.5422, idx:3, カウンター割烹の金目鯛の煮付けは、甘辛ダレが骨の隅々まで染みていて、白ご飯が思わずおかわり必至だよね。

少し順位が変わっているのがわかる。

kun432kun432

QATモデルも試してみる。llama.cppを使う。せっかくなのでRPi4Bで。

llama.cppのビルド

git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
cmake -B build
cmake --build build --config Release

llama.cpp公式の量子化済みモデルはここにある。Q4_0で。

https://huggingface.co/ggml-org/embeddinggemma-300M-qat-q4_0-GGUF

llama-serverを起動

./build/bin/llama-server \
    -hf ggml-org/embeddinggemma-300M-qat-q4_0-GGUF \
    --embeddings

curlで確認

curl -s -X POST \
    "http://localhost:8080/embedding" \
    -H "Content-Type: application/json" \
    -d '{"input": "中華そばのオススメを教えて。"}' \
    | jq -r .
出力
[
  {
    "index": 0,
    "embedding": [
      [
        0.015231691300868988,
        0.04141731560230255,
        -0.027156468480825424,
        0.05304545909166336,
        -0.033894360065460205,
        (snip)
        0.001146463444456458,
        0.009237105026841164,
        0.04414373263716698,
        0.013885578140616417,
        -0.015416877344250679
      ]
    ]
  }
]
kun432kun432

厳密にはプロンプトをちゃんと設定したほうが良さそう。

このスクラップは8日前にクローズされました