Elasticsearch:标量量化 101 - scalar quantization 101

2023-10-30 00:52

本文主要是介绍Elasticsearch:标量量化 101 - scalar quantization 101,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:BENJAMIN TRENT

什么是标量量化以及它是如何工作的?

大多数嵌入模型输出 float32 向量值。 虽然这提供了最高的保真度,但考虑到向量中实际重要的信息,这是浪费的。 在给定的数据集中,嵌入永远不需要每个单独维度的所有 20 亿个选项。 对于高维向量(例如 386 维及更高维)尤其如此。 量化允许以有损方式对向量进行编码,从而稍微降低保真度并节省大量空间。

桶里的乐趣

标量量化采用每个向量维度并将它们分成一些较小的数据类型。 对于博客的其余部分,我们将假设将 float32 值量化为 int8。 要准确地对值进行分桶,并不像将浮点值四舍五入到最接近的整数那么简单。 许多模型输出的向量的维度连续在 [−1.0,1.0] 范围内。 因此,两个不同的向量值 0.123 和 0.321 都可以向下舍入为 0。最终,向量将仅使用 int8 中 255 个可用存储桶中的 2 个,丢失太多信息。

图 1:量化目标的图示,将从 -1.0 到 1.0 的连续值分桶为离散的 int8 值。

数值转换背后的数学并不太复杂。 由于我们可以计算浮点范围的最小值和最大值,因此我们可以线性移动这些值,然后对中间的值进行存储。

图 2:int8 和 float32 之间转换的方程式。 请注意,这些是有损变换并且不精确。 在下面的示例中,我们仅使用 int8 内的正值。 这与 Lucene 实现一致。

桶里的乐趣

分位数 (quantile) 是包含一定百分比值的分布切片。 所以,举例来说,我们的浮点值可能有 99% 都在 [−0.75, 0.86] 之间,而不是真正的最小值和最大值 [−1.0,1.0] 之间。 任何小于 -0.75 和大于 0.86 的值都被视为异常值。 如果你在尝试量化结果时包含异常值,则最常见值的可用存储桶将会减少。 更少的存储桶意味着更低的准确性,从而导致更大的信息损失。

图 3:99% 置信区间和各个分位数值的图示。 所有值的 99% 都落在 [−0.75,0.86] 范围内。

这一切都很好,但是既然我们知道如何量化值,那么我们如何实际计算两个量化向量之间的距离呢? 它和普通的点积 (dot_product) 一样简单吗?

是时候记住你的代数了

我们仍然缺少一个重要的部分,即如何计算两个量化向量之间的距离。 虽然我们在这个博客中还没有回避数学,但我们即将做更多的事情。 是时候拿出你的铅笔来尝试记住多项式和基本代数了。

dot_product 和 cosine 相似度的基本要求是能够将浮点值相乘并将它们的结果相加。 我们已经知道如何在 float32 和 int8 值之间进行转换,那么我们的转换中的乘法是什么样的呢?

然后我们可以展开这个乘法,为了简化,我们将用 α 代替 (max-min)/127

更有趣的是,这个方程只有一部分需要同时使用两个值。 然而,dot_product 不仅仅是两个浮点数相乘,而是向量每个维度的所有浮点数相乘。 有了向量维度计数 dim,以下所有内容都可以在查询时和存储时预先计算。

并且可以存储为单个浮点值。

可以预先计算并存储为单个浮点值或在查询时计算一次。

可以预先计算并存储为单个浮点值。

所有这一切:

dot_product 所需的唯一计算就是 dotProduct(int8,int8′) 以及一些预先计算的值与结果相结合。

但是,这如何准确呢?

那么,这到底有多准确呢? 我们不会因为量化而丢失信息吗? 是的,我们是,但是量化利用了我们不需要所有信息的事实。 对于学习嵌入模型,各个维度的分布通常不存在肥尾 (fat-tails)。 这意味着它们是本地化的并且相当一致。 此外,通过量化每个维度引入的误差是独立的。 这意味着,对于我们典型的向量运算(如 dot_product)来说,错误被抵消了。

结论

哇,这真是太多了。 但现在你已经很好地掌握了量化的技术优势、其背后的数学原理,以及如何在考虑线性变换的同时计算向量之间的距离。 接下来看看我们如何在 Lucene 中实现这一点,以及其中的一些独特的挑战和优势。

这篇关于Elasticsearch:标量量化 101 - scalar quantization 101的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/304543

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

【docker】基于docker-compose 安装elasticsearch + kibana + ik分词器(8.10.4版本)

记录下,使用 docker-compose 安装 Elasticsearch 和 Kibana,并配置 IK 分词器,你可以按照以下步骤进行。此过程适用于 Elasticsearch 和 Kibana 8.10.4 版本。 安装 首先,在你的工作目录下创建一个 docker-compose.yml 文件,用于配置 Elasticsearch 和 Kibana 的服务。 version:

ElasticSearch底层原理简析

1.ElasticSearch简述 ElastiaSearch(以下简称ES)是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,支持RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。ES设计用于云计算中,能够进行实时搜索,支持PB级搜索,具有稳定,可靠,快速,安装使用方便等

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询数据

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询; 一、首先启动相关服务: 二、新建一个film索引: 三、建立映射: 1、通过Head插件: POST http://192.168.1.111:9200/film/_mapping/dongzuo/ {"properties": {"title": {"type":

ElasticSearch 6.1.1运用代码添加索引及其添加,修改,删除文档

1、新建一个MAVEN项目:ElasticSearchTest 2、修改pom.xml文件内容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or

Windows下安装Elasticsearch,启动报错,解决方法,访问

对于Windows用户,我们推荐使用MSI安装包进行安装。这个安装包使用图形用户界面来引导你进行安装。 首先,从这里https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.msi下载Elasticsearch 6.1.1的MSI安装包。 然后双击下载好的安装包文件启动图形化安装程序,在第一个界面,选

Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen 在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。 从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持

ElasticSearch的DSL查询④(DSL查询、RestClient的DSL查询)

目录 一、DSL查询 1.1 快熟入门 1.2 叶子查询 1.2.1 全文检索查询 1)match查询 2)multi_match查询 1.2.2 精确查询 1)term查询 2)range查询 3)ids查询 1.3 复合查询 1.3.1 bool查询 1.3.2 算分函数查询 1)基本语法: 2)运行流程: 3)示例: 4)执行结果: 1.4 排序 1.5

Mac使用Elasticsearch

下载 Past Releases of Elastic Stack Software | Elastic 解压tar -xzvf elasticsearch-8.15.1-darwin-x86_64.tar.gz  修改配置文件config/elasticsearch.yml xpack.security.enabled: false xpack.security.http.