このページでは、ベクトル エンベディング間の類似度を測定するために、Spanner に用意されているベクトル距離関数の中から選択する方法について説明します。
Spanner データからエンベディングを生成したら、ベクトル距離関数を使用して類似検索を実行できます。次の表に、Spanner のベクトル距離関数を示します。
| 関数 | 説明 | 数式 | 類似度の増加との関係 |
|---|---|---|---|
| ドット積 | 角度 \(\theta\) のコサインに、対応するベクトルの大きさを掛けます。 | \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) | 増加 |
| コサイン距離 | コサイン距離関数は、1 からコサイン類似度を減算します(cosine_distance() = 1 - cosine similarity)。コサイン類似度は、2 つのベクトル間の角度 \(\theta\) のコサインを測定します。 |
1 - \(\frac{a^T b}{|a| \cdot |b|}\) | 減少 |
| ユークリッド距離 | 2 つのベクトル間の直線距離を測定します。 | \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) | 減少 |
類似性測度の選択
すべてのベクトル エンベディングが正規化されているかどうかによって、類似性を見つけるために使用する類似性測度を決定できます。正規化されたベクトル エンベディングの強度(長さ)は正確に 1.0 です。
また、モデルのトレーニングに使用された距離関数がわかっている場合は、その距離関数を使用してベクトル エンベディング間の類似度を測定します。
正規化されたデータ
すべてのベクトル エンベディングが正規化されたデータセットがある場合、3 つの関数はすべて同じセマンティック検索の結果を提供します。基本的に、各関数から異なる値が返されますが、値の並べ替え方法は同じです。エンべディングが正規化されている場合、通常は DOT_PRODUCT() が最も計算効率が優れていますが、ほとんどの場合、その差はごくわずかです。ただし、アプリケーションのパフォーマンスが非常に重要である場合は、DOT_PRODUCT() がパフォーマンス チューニングに役立つ場合があります。
正規化されていないデータ
ベクトル エンベディングが正規化されていないデータセットがある場合、関数としてのドット積は距離を測定しないため、DOT_PRODUCT() を距離関数として使用するのは数学的には正しいものではありません。エンベディングの生成方法と優先する検索タイプに応じて、COSINE_DISTANCE() または EUCLIDEAN_DISTANCE() 関数は、もう一方の関数よりも主観的に優れた検索結果を生成します。COSINE_DISTANCE() または EUCLIDEAN_DISTANCE() を試して、ユースケースにどちらが最適かを判断しなければならない場合があります。
データが正規化されているかどうか不明
データが正規化されているかどうかが不明な場合に DOT_PRODUCT() を使用する場合は、代わりに COSINE_DISTANCE() を使用することをおすすめします。COSINE_DISTANCE() は、正規化が組み込まれた DOT_PRODUCT() に似ています。COSINE_DISTANCE() を使用して測定された類似度は 0~2 の範囲です。結果が 0 に近い場合は、ベクトルが非常に類似していることを示しています。
次のステップ
- K 最近傍探索を行ってベクトル検索を行う方法について学習する。
- Vertex AI ベクトル検索にエンベディングをエクスポートする方法をご覧ください。
- GoogleSQL の
COSINE_DISTANCE()関数、EUCLIDEAN_DISTANCE()関数、DOT_PRODUCT()関数の詳細をご覧ください。 - PostgreSQL の
spanner.cosine_distance()関数、spanner.euclidean_distance(), and spanner.dot_product()関数の詳細をご覧ください。