内积和余弦距离

Proxima CE关于余弦距离的处理与内积有紧密联系,内积在搜索推荐的场景中应用广泛,很多算法需要获取内积值做进一步的运算。Proxima CE对内积使用做了诸多优化,使其能够灵活应用于各种索引构建算法场景,如HNSW、SSG、HC、GC、QC及Linear。本文为您介绍内积和余弦距离的使用方法。

前提条件

适用场景

内积使用方法有两种,分别为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的方案是对向量归一化后,改为计算内积或欧式距离,从而提高性能。使用方式如下:

  1. 使用内积计算方法中NormalizeConverter的流程进行索引构建和检索,获取内积值score

    说明

    此处score为输出表中的字段。

  2. 余弦距离计算方式为:1-score

    余弦相似性等价于计算的内积值ip(即score),范围为(-1,1),但距离一般为正值,因此Proxima做了转换1- ip1-ip才是真正的余弦距离, 范围为(0,2)