すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:内積とコサイン距離

最終更新日:Apr 02, 2025

Proxima CE のベクトル検索でコサイン距離が距離として使用される場合、コサイン距離の計算は内積と密接に関連しています。内積は、検索およびレコメンデーションのシナリオで広く使用されています。内積値は、ベクトル検索のアルゴリズム操作で必要です。 Proxima CE では内積の計算が最適化されており、階層型ナビゲーション可能なスモールワールドグラフ (HNSW)、サテライトシステムグラフ (SSG)、階層型クラスタリング (HC)、グラフクラスタリング (GC)、量子化クラスタリング (QC)、線形検索など、さまざまなインデックス作成アルゴリズムのシナリオに適しています。このトピックでは、ベクトルの内積とコサイン距離を計算する方法について説明します。

前提条件

シナリオ

ベクトルの内積を計算するには、MipsSquaredEuclidean または NormalizeConverter を使用できます。

シナリオ

メソッド

元のベクトルを正規化できない

MipsSquaredEuclidean を使用します。

元のベクトルを正規化できる

MipsSquaredEuclidean と NormalizeConverter を使用します。 MipsSquaredEuclidean を使用することをお勧めします。

MipsSquaredEuclidean

元のベクトルを正規化できない場合は、MipsSquaredEuclidean を使用して元のベクトルの次元を変換できます。元のベクトルの次元が変換された後、ベクトル間のユークリッド距離はベクトルの内積と同じになります。

MipsSquaredEuclidean を使用する場合は、-distance_method パラメーターを MipsSquaredEuclidean に設定する必要があります。-measure_params パラメーターを構成して、関連パラメーターを指定することもできます。各パラメーターは単一行の JSON 文字列です。パラメーターの二重引用符 (") はエスケープする必要はありません。各パラメーターの構成ではスペースは使用できません。例:

{"proxima.mips_euclidean.measure.injection_type":0}

パラメーターの詳細については、「IndexMeasure パラメーター」をご参照ください。

サンプルコマンド

説明

以下のサンプルコードで使用されているパラメーター構成の詳細については、「リファレンス:Proxima CE パラメーター」をご参照ください。

--@resource_reference{"proxima-ce-aliyun-1.0.2.jar"}  -- アップロードした Proxima CE の JAR パッケージを参照します。 DataWorks コンソールの DataStudio ページに移動します。 DataStudio ページの左側のナビゲーションウィンドウで、[スケジュールワークフロー] をクリックします。表示されるページの左側で、[ビジネスフロー] > [MaxCompute] > [リソース] を選択します。アップロードした Proxima CE の JAR パッケージを右クリックし、ショートカットメニューから [リソースパスの挿入] を選択して、データをアノテーションとして表示します。
jar -resources proxima-ce-aliyun-1.0.2.jar  -- アップロードした Proxima CE の JAR パッケージ。
-classpath proxima-ce-aliyun-1.0.2.jar com.alibaba.proxima2.ce.ProximaCERunner  -- クラスパスは、main 関数のエントリクラスを指定します。
-doc_table doc_table_xx  -- 入力 doc テーブル。
-doc_table_partition 20221111  -- 入力 doc テーブルのパーティション。
-query_table query_table_xx  -- 入力 query テーブル。
-query_table_partition 20221111  -- 入力 query テーブルのパーティション。
-output_table output_table_xx  -- 出力テーブル。
-output_table_partition 20221111  -- 出力テーブルのパーティション。
-data_type float  -- ベクトルのデータ型。
-dimension 8 -- ベクトルの次元数。
-external_volume_name xxx_volume_name -- ユーザーが提供する OSS 上のボリュームは、事前に基礎となる OSS ディレクトリが作成されている必要があります。そうでない場合、操作は失敗します。
-owner_id 123456  -- ユーザーの ID。
-distance_method MipsSquaredEuclidean -- このパラメーターを設定する必要があります。
-measure_params {"proxima.mips_euclidean.measure.injection_type":0};  -- オプション。

NormalizeConverter

元のベクトルを正規化できる場合は、NormalizeConverter を使用して、入力 doc テーブルまたは query テーブルの元のベクトルに対して L2 正規化を実行できます。 L2 正規化が実行された後、内積とユークリッド距離には次の関係があります:Formula。内積とユークリッド距離間の変換を実行できます。この場合、内積を距離計算に使用できます。 NormalizeConverter を使用して正規化を実行した後、ベクトル検索のビジネス要件に基づいて距離関連のパラメーターを構成して、インデックスを作成したり、検索タスクを実行したりできます。

NormalizeConverter を使用する場合は、-converter パラメーターを NormalizeConverter に設定し、-distance_method パラメーターを inner_product に設定する必要があります。デフォルトでは、L2 正規化が実行されます。ベクトル検索のビジネス要件に基づいて、他のパラメーターを構成できます。検索結果は、ベクトル正規化後の内積です。

サンプルコマンド

--@resource_reference{"proxima-ce-aliyun-1.0.2.jar"}  -- アップロードした Proxima CE の JAR パッケージを参照します。 DataWorks コンソールの DataStudio ページに移動します。 DataStudio ページの左側のナビゲーションウィンドウで、[スケジュールワークフロー] をクリックします。表示されるページの左側で、[ビジネスフロー] > [MaxCompute] > [リソース] を選択します。アップロードした Proxima CE の JAR パッケージを右クリックし、ショートカットメニューから [リソースパスの挿入] を選択して、データをアノテーションとして表示します。
jar -resources proxima-ce-aliyun-1.0.2.jar  -- アップロードした Proxima CE の JAR パッケージ。
-classpath proxima-ce-aliyun-1.0.2.jar com.alibaba.proxima2.ce.ProximaCERunner  -- クラスパスは、main 関数のエントリクラスを指定します。
-doc_table doc_table_xx  -- 入力 doc テーブル。
-doc_table_partition 20221111  -- 入力 doc テーブルのパーティション。
-query_table query_table_xx  -- 入力 query テーブル。
-query_table_partition 20221111  -- 入力 query テーブルのパーティション。
-output_table output_table_xx  -- 出力テーブル。
-output_table_partition 20221111  -- 出力テーブルのパーティション。
-data_type float  -- ベクトルのデータ型。
-dimension 8 -- ベクトルの次元数。
-external_volume_name xxx_volume_name -- ユーザーが提供する OSS 上のボリュームは、事前に基礎となる OSS ディレクトリが作成されている必要があります。そうでない場合、操作は失敗します。
-owner_id 123456  -- ユーザーの ID。
-converter NormalizeConverter  -- デフォルトの正規化コンバーター。
-distance_method inner_product;  -- このパラメーターを設定する必要があります。

コサイン距離

Proxima 用 SDK はコサイン距離の計算をサポートしていません。これは、この操作のコストが高いためです。ベクトルのコサイン類似度は、ベクトルに L2 正規化を実行した後の内積と同じです。したがって、Proxima CE を使用してベクトルを正規化し、ベクトルの内積またはベクトル間のユークリッド距離を計算して、パフォーマンスを向上させることができます。ベクトルのコサイン距離を計算するには、次の手順を実行します。

  1. NormalizeConverter を使用して、score パラメーターで指定された内積を取得します。

    説明

    score は出力テーブルのフィールドです。

  2. 次の式を使用して、ベクトルのコサイン距離を計算します:1 - score

    ベクトルのコサイン類似度は、内積値 (ip) と同じであり、score パラメーターの値と同じです。ベクトルのコサイン類似度の範囲は (-1,1) です。コサイン距離は正の値である必要があり、次の式を使用して取得されます:1 - ip。コサイン距離の範囲は (0,2) です。