Embeddings
埋め込み表現は、類似したテキスト、画像、アイテムを近くに配置する学習済みベクトルです。埋め込み表現の生成、比較、大規模な検索について解説します。
埋め込みとは、単語、画像、製品、ユーザーなどの項目を表す、学習済みの数値ベクトルです。意味や内容が似ている項目は、ベクトル空間で近くに配置されます。このベクトル空間での距離を類似度の尺度として使うことで、ソフトウェアは生のピクセルや文字列ではなくベクトルを比較して、検索、クラスタリング、推薦、分類を行えます。埋め込みはニューラルネットワーク内部の処理表現としても使われます。大規模言語モデル (LLM)は最初のトランスフォーマー層の前に各トークンを埋め込みに変換し、ビジョンモデルはバックボーンを通して画像を特徴ベクトルに変換します。検索に使う埋め込みは通常、数百から数千の次元を持ち、生の入力の値の数よりも大幅に少なくなります。
埋め込みの生成方法#
埋め込みは、次の2種類の学習済みコンポーネントから得られます。
- ルックアップテーブル: トークン、商品ID、ユーザーIDなどの離散的な項目では、埋め込みレイヤーが項目ごとに学習可能な行を1つ保存し、項目を検索するとその行を返します。PyTorchの
nn.Embeddingは、このようなテーブルです。行の値はランダムに初期化され、モデルの他の部分とともにバックプロパゲーションによって更新されるため、学習タスクで似た役割を果たす項目は、似たベクトルへと近づいていきます。 - エンコーダー: 画像、音声、自由形式のテキストでは、ネットワークが入力全体を1つのベクトルに変換します。多くの場合、CNNの特徴マップをプーリングするか、Transformerの出力トークンを読み取ります。分類などのタスクで学習したエンコーダーは、副産物として有用な埋め込みを生成します。また、コントラスト学習で学習したエンコーダーは、埋め込み空間を直接形成します。CLIPは、画像とそのキャプションを1つの共有空間に配置することで、これを実現します。
2013年にGoogleのTomas Mikolov氏らが発表したWord2vecは、このような学習がどれほどの構造を捉えるかを示しました。単語ベクトルでは、vector("King") − vector("Man") + vector("Woman")がvector("Queen")に最も近くなります。また、公開されたGoogle Newsの事前学習済みベクトルには、300次元で300万語とフレーズが収録されています。
埋め込みの比較#
コサイン類似度は2つのベクトルの方向を比較し、値は−1から1の範囲になります。内積はベクトルの長さも考慮し、ユークリッド距離はベクトル間の直線距離を測定します。多くのシステムでは埋め込みを単位長に正規化するため、コサイン類似度と内積が同じになり、ユークリッド距離と同じ順序で近傍を順位付けできます。YOLO26モデルは、embed()を通じて画像埋め込みを生成します。この処理では予測ヘッドをスキップし、モデルの最後から2番目のレイヤーの出力を平均プーリングして、画像ごとに1つのベクトルを返します。
import torch.nn.functional as F
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# Load a YOLO26 classification model trained on ImageNet
model = YOLO("yolo26n-cls.pt")
# embed() returns one pooled feature vector per image instead of predictions
bus, zidane = model.embed([ASSETS / "bus.jpg", ASSETS / "zidane.jpg"])
print(f"Embedding length: {bus.shape[0]}")
# Higher cosine similarity means the model sees more similar content
print(f"Cosine similarity: {F.cosine_similarity(bus, zidane, dim=0).item():.3f}")YOLO26n-clsの埋め込みは256次元ベクトルで、バックボーンの末尾にあるアテンションブロックのプーリング出力です。2行目には、同梱されたサンプル写真2枚のコサイン類似度が表示されます。同じ比較をコレクション全体の保存済み埋め込みに対して実行することで、画像類似検索の結果を順位付けできます。
大規模な埋め込み検索#
数百万個の保存済みベクトルとクエリを1つずつ比較するには時間がかかりすぎるため、ベクトルデータベースは近似最近傍インデックスを構築します。たとえば、グラフベースのHNSWインデックスや転置ファイルインデックスを使い、コレクションのごく一部だけを調べながら近い一致を見つけます。コレクションは一度だけ埋め込みに変換し、各クエリは検索時に同じエンコーダーで埋め込みに変換します。テキストで画像を検索する場合は、対応するテキストエンコーダーを使用します。
精度と同じくらい、ストレージも設計を左右します。Matryoshka表現学習は、先頭の次元だけでも機能する埋め込みを学習するため、ベクトルを切り詰めて容量を節約できます。ベクトル量子化では、各ベクトルを数バイトに圧縮します。ハイブリッド検索は、埋め込みの類似度とキーワードマッチングを組み合わせます。
用途#
- セマンティック検索と検索拡張生成(RAG): テキスト埋め込みは意味に基づいて文章を検索するため、「自動車保険の請求」に関するクエリから「自動車保険契約」と記載された文書も見つけられます。RAGは、検索した文章をコンテキストとしてLLMに渡します。
- レコメンデーションシステム: ユーザーとアイテムを同じ空間に埋め込み、ユーザーのベクトルに最も近いアイテムを推薦候補にします。
- ゼロショット分類: 画像とテキストの共有空間を持つモデルは、画像の埋め込みと、テキストで表現したクラス名の埋め込みを比較して画像を分類します。
- 物体再識別: 外観の埋め込みを使い、カメラ間やトラッキングの中断を挟んで、同じ人物や車両を対応付けます。
- データセットの探索: t-SNEまたはUMAPを使って埋め込みを2次元に投影すると、データセット内のクラスター、ほぼ重複するデータ、外れ値を確認できます。Ultralytics Platformのデータセットでは、Clusteringパネルがこれを表示します。
埋め込みと関連用語の違い#
- 潜在空間: 埋め込みが存在するベクトル空間です。「潜在表現」と「埋め込み」は、しばしば同義語として使われます。
- 特徴抽出: 生データを特徴量に変換するあらゆる処理です。埋め込みは、ベクトル間の距離が意味を持つように学習された特徴ベクトルです。
- トークン化: テキストをトークンに分割し、それぞれを整数IDに変換します。その後、埋め込みレイヤーが各IDをベクトルに変換します。
- One-hotエンコーディング: 語彙内の項目iを、位置iだけが1で他がすべて0のベクトルで表します。そのため、どの項目同士も同じ距離になり、このエンコーディングには類似性の情報が含まれません。one-hotベクトルに埋め込みテーブルの重み行列を乗算すると、ちょうど1行が選択されます。埋め込み検索は、この乗算を実行せずに同じ結果を返します。










