Proxima CE关于余弦距离的处理与内积有紧密联系,内积在搜索推荐的场景中应用广泛,很多算法需要获取内积值做进一步的运算。Proxima CE对内积使用做了诸多优化,使其能够灵活应用于各种索引构建算法场景,如HNSW、SSG、HC、GC、QC及Linear。本文为您介绍内积和余弦距离的使用方法。
前提条件
已安装Proxima CE包并准备输入表,详情请参见安装Proxima CE包。
已创建doc表和query表,并导入了输入表数据,具体请参见基础向量检索。
适用场景
内积使用方法有两种,分别为MipsSquaredEuclidean和NormalizeConverter。
适用场景 | 使用方法 |
原始向量不可进行归一化场景 | MipsSquaredEuclidean。 |
原始向量可进行归一化场景 | MipsSquaredEuclidean和NormalizeConverter均可使用,建议使用MipsSquaredEuclidean。 |
使用MipsSquaredEuclidean
针对原始向量不可进行归一化的场景,所使用的方法原理是对原始向量进行维度转换,在转换后的空间里,欧式距离等价于原空间的内积。
使用时需要指定-distance_method
参数值为MispSquaredEuclidean,另外可以通过-measure_params
来指定相关参数,参数格式为单行JSON字符串,双引号不需要转义,且中间不能有空格。例如:
{"proxima.mips_euclidean.measure.injection_type":0}
参数详情请参考IndexMeasure参数配置。
命令示例
以下示例中所使用的参数配置详情请参见参考:Proxima CE全量参数说明。
--@resource_reference{"proxima-ce-aliyun-1.0.0.jar"} -- 引用上传的 proxima-ce jar 包,在左侧「业务流程——MaxCompute——资源」,右击刚刚上传的 jar 包,选择「引用资源」即可生成该行注释
jar -resources proxima-ce-aliyun-1.0.0.jar -- 上传的 proxima-ce jar 包
-classpath proxima-ce-aliyun-1.0.0.jar com.alibaba.proxima2.ce.ProximaCERunner -- classpath 指定 main 函数入口类
-doc_table doc_table_xx -- 输入 doc 表
-doc_table_partition 20210706 -- 输入 doc 表 partition
-query_table query_table_xx -- 输入 query 表
-query_table_partition 20210706 -- 输入 query 表 partition
-output_table output_table_xx -- 输出表
-output_table_partition 20210706 -- 输出表 partition
-data_type float -- 向量数据类型
-dimension 8 -- 向量维度
-oss_access_id xxx -- 用户提供的 oss access key id
-oss_access_key xxx -- 用户提供的 oss access key secret
-oss_endpoint xxx -- 用户提供的 oss endpoint
-oss_bucket xxx -- 用户提供的创建好的 oss bucket
-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.0.jar"} -- 引用上传的proxima-ce jar包,在左侧“业务流程——MaxCompute——资源”,右击刚刚上传的 jar 包,选择“引用资源”即可生成该行注释
jar -resources proxima-ce-aliyun-1.0.0.jar -- 上传的proxima-ce jar包
-classpath proxima-ce-aliyun-1.0.0.jar com.alibaba.proxima2.ce.ProximaCERunner -- classpath 指定 main 函数入口类
-doc_table doc_table_xx -- 输入 doc 表
-doc_table_partition 20210706 -- 输入 doc 表 partition
-query_table query_table_xx -- 输入 query 表
-query_table_partition 20210706 -- 输入 query 表 partition
-output_table output_table_xx -- 输出表
-output_table_partition 20210706 -- 输出表 partition
-data_type float -- 向量数据类型
-dimension 8 -- 向量维度
-oss_access_id xxx -- 用户提供的 oss access key id
-oss_access_key xxx -- 用户提供的 oss access key secret
-oss_endpoint xxx -- 用户提供的 oss endpoint
-oss_bucket xxx -- 用户提供的创建好的 oss bucket
-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)
。