Proxima CE關於餘弦距離的處理與內積有緊密聯絡,內積在搜尋推薦的情境中應用廣泛,很多演算法需要擷取內積值做進一步的運算。Proxima CE對內積使用做了諸多最佳化,使其能夠靈活應用於各種索引構建演算法情境,如HNSW、SSG、HC、GC、QC及Linear。本文為您介紹內積和餘弦距離的使用方法。
前提條件
已安裝Proxima CE包並準備輸入表,詳情請參見安裝Proxima CE包。
已匯入輸入表資料,具體步驟請參見匯入資料至輸入表。
適用情境
內積使用方法有兩種,分別為MipsSquaredEuclidean和NormalizeConverter。
適用情境 | 使用方法 |
原始向量不可進行歸一化情境 | MipsSquaredEuclidean。 |
原始向量可進行歸一化情境 | MipsSquaredEuclidean和NormalizeConverter均可使用,建議使用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 包,在左側「商務程序——MaxCompute——資源」,右擊剛剛上傳的 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 -- classpath 指定 main 函數入口類
-doc_table doc_table_xx -- 輸入 doc 表
-doc_table_partition 20221111 -- 輸入 doc 表 partition
-query_table query_table_xx -- 輸入 query 表
-query_table_partition 20221111 -- 輸入 query 表 partition
-output_table output_table_xx -- 輸出表
-output_table_partition 20221111 -- 輸出表 partition
-data_type float -- 向量資料類型
-dimension 8 -- 向量維度
-external_volume_name xxx_volume_name -- 使用者提供的建立好的 volume on oss,需要底層 oss 目錄也建立好,否則會運行失敗
-owner_id 123456 -- 使用者提供的用於標識自己的唯一id
-distance_method MipsSquaredEuclidean -- 需要特別指定
-measure_params {"proxima.mips_euclidean.measure.injection_type":0}; -- 選擇性參數使用NormalizeConverter
針對原始向量可進行歸一化的情境,所使用的方法原理是通過對原始的doc或query向量進行L2歸一化,歸一化之後內積與歐式距離關係滿足:
,二者可相互轉化,此時內積可以用於距離計算,因此歸一化後就可以根據需要指定距離參數,從而進行索引構建或檢索。
使用時需要指定-converter參數值為NormalizeConverter(預設是L2歸一化), 再指定-distance_method參數值為inner_product,其他參數根據需要設定即可進行檢索,檢索結果即歸一化後的內積值。
命令樣本
--@resource_reference{"proxima-ce-aliyun-1.0.2.jar"} -- 引用上傳的proxima-ce jar包,在左側“商務程序——MaxCompute——資源”,右擊剛剛上傳的 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 -- classpath 指定 main 函數入口類
-doc_table doc_table_xx -- 輸入 doc 表
-doc_table_partition 20221111 -- 輸入 doc 表 partition
-query_table query_table_xx -- 輸入 query 表
-query_table_partition 20221111 -- 輸入 query 表 partition
-output_table output_table_xx -- 輸出表
-output_table_partition 20221111 -- 輸出表 partition
-data_type float -- 向量資料類型
-dimension 8 -- 向量維度
-external_volume_name xxx_volume_name -- 使用者提供的建立好的 volume on oss,需要底層 oss 目錄也建立好,否則會運行失敗
-owner_id 123456 -- 使用者提供的用於標識自己的唯一id
-converter NormalizeConverter -- 預設的 normalize converter 即可
-distance_method inner_product; -- 需要特別指定餘弦距離使用方法
針對需要使用餘弦距離(Cosine)的情境,由於直接計算Cosine代價較高,Proxima SDK沒有直接實現餘弦距離,但因為對L2歸一化後的向量,餘弦相似性等價於內積值,因此Proxima的方案是對向量歸一化後,改為計算內積或歐式距離,從而提高效能。使用方式如下:
使用內積計算方法中NormalizeConverter的流程進行索引構建和檢索,擷取內積值
score。說明此處
score為輸出表中的欄位。餘弦距離計算方式為:
1-score。餘弦相似性等價於計算的內積值ip(即score),範圍為
(-1,1),但距離一般為正值,因此Proxima做了轉換1- ip,1-ip才是真正的餘弦距離, 範圍為(0,2)。