Elasticsearch:标量量化 101 - scalar quantization 101

news2024/11/26 12:28:41

作者: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 中实现这一点,以及其中的一些独特的挑战和优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信公众号集成文心一言API

要将微信公众号集成文心一言API,并使用Python语言和Flask技术实现,可以按照以下步骤进行操作: 安装必要的依赖项:首先,确保你的开发环境中已安装了Python和Flask库。你可以使用pip命令来安装它们,例如&…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第六套区块链系统部署与运维

第六套区块链系统部署与运维题目 环境 : ubuntu20 fisco : 2.8.0 子任务1-2-1: 搭建区块链系统并验证 题意: P2P起始端口 30500 channel起始端口 20500 JSONRPC 8945 使用Docker配置 使用 build_chain.sh 文件 进行生成节点文件 root@192-168-19-133:/yijiu/mode6# bas…

MySQL数据库#4

外键(表与表之间的关系) 什么是外键: 外键是指关系数据库中一个表中的字段,它与另一个表的主键相关联,用于建立两个表之间的关联关系。外键可以用来确保数据的完整性,通过检查关联表的主键来限制对于某个表的操作。当对主表进行操…

批量去除pdf每一页相同未知的同样的内容

例如我想去除每一页右下角的www.alevelcollege.com ①打开acrobat pro ②编辑文件和图像 ③ctrlF输入字符串www.alevelcollege.com替换为空 ④鼠标点击替换 ⑤回车键按下不放,会自动翻页,直到翻页到最后一页。

Spring Cloud Alibaba 教程 | Nacos 篇

Spring Cloud Alibaba 教程 | Nacos 篇 ​ 写在前面的话&#xff1a; 本笔记在参考网上视频以及博客的基础上&#xff0c;只做个人学习笔记&#xff0c;如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01; 1、使用nacos做服务的注册和发现 1、父工程项目pom <!…

三十九、【进阶】MySQL索引失效情况1

1、在索引列上进行运算操作 &#xff08;1&#xff09;基础表格 phone字段&#xff0c;存在一个单列索引。 &#xff08;2&#xff09;在索引列上进行运算操作 可以看到&#xff0c;在对phone字段进行运算操作之后&#xff0c;查询方式会变为“全表扫描”&#xff0c;导致索引…

【JAVA学习笔记】 51 - 日期类

项目代码 一、第一代日期类 1.Date: 精确到亳秒&#xff0c;代表特定的瞬间 2.SimpleDateFormat:格式和解析日期的类 3.SimpleDateFormat格式化和解析日期的具体类。它允许进行格式化(日期> 文本)、解析(文本->日期)和规范化 public class Date01 {public static voi…

C# Socket通信从入门到精通(5)——单个同步TCP服务器C#代码实现

前言: 我们在开发TCP通信程序时,除了开发TCP客户端程序,有时候我们也需要开发TCP服务器程序,这在实际项目中是经常会遇到的,所以说掌握TCP服务器程序的开发是一项必备的技能,尤其在上位机软件开发领域,掌握TCP服务器程序的开发是走向高级工程师的必经之路,也是面试必考…

山西电力市场日前价格预测【2023-10-30】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-30&#xff09;山西电力市场全天平均日前电价为309.35元/MWh。其中&#xff0c;最高日前电价为400.33元/MWh&#xff0c;预计出现在18:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

Qt实现卡牌对对碰游戏

效果 闲来无事&#xff0c;实现一个对对碰游戏&#xff0c;卡牌样式是火影动漫。 先上效果&#xff1a; 卡牌对对碰_火影主题 玩法 启动游戏&#xff0c;进入第一关卡&#xff0c;所有卡牌都为未翻开状态&#xff0c;即背面朝上&#xff1b;点击卡牌&#xff0c;则将卡牌翻开…

06、SpringCloud -- 订单详情界面实现

目录 订单详情界面实现需求:代码前端后端controllerservicemapperdomain效果:订单详情界面实现 需求: 现在的订单详情界面是这样的。需要获取订单的数据对这个详情页面进行渲染 代码 前端 后端 controller

C语言基础简述(一)

目录 1. 标准输入输出库 2. 定义变量 3. 关于基本数据类型 3.1 计算机如何存储数据 3.2 基本数据类型 3.2.1 数值类型 3.2.1.1 整数类型 3.2.1.2 浮点数类型 3.2.2 字符类型 3.2.2.1 ASCII表 4. 进制数之间的转换 4.1 十进制整数和二进制之间的相互转换 5. C语言运…

ArcGIS Maps SDK for JS:隐藏地图边框

文章目录 1 问题描述2 解决方案 1 问题描述 近期&#xff0c;将ArcGIS Api for JS v4.16更新到了ArcGIS Maps SDK for JS v4.27&#xff0c;原本去除地图的css代码失效了。 v4.26及以前版本 &#xff0c;需要用.esri-view-surface--inset-outline:focus::after 控制边框属性。…

Photoshop(PS)2021版 安装教程(图文教程超详细)

软件&#xff1a;PS版本&#xff1a;2021语言&#xff1a;简体中文大小&#xff1a;2.26G安装环境&#xff1a;Win11/Win10&#xff08;1809以上版本&#xff09;硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff0c;不支持7代以下CPU&#xff09;下载通道①百度网盘丨64位…

python随手小练11(南农作业题)

题目1&#xff1a; 计算阶乘的和 可以看出如下形式&#xff1a;12!3!...15! 12(13(14...(15(1)))) 具体操作&#xff1a; x int(input("输入数字&#xff1a;")) res 1 for i in range(x, 1 , -1):res (1 (i * res)) print("阶乘的和为&#xff1a;"…

【SoC基础】通信种类(串口与并口、)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

生活日用品经营小程序商城的作用是什么

生活日用品如牙膏牙刷、护手霜等小产品是人们生活所需&#xff0c;传统客户会通过线下超市商场购买&#xff0c;但现在的消费者往往会选择线上渠道购买&#xff0c;省时省力坐在家里等货上门即可。 因此对商家来说&#xff0c;需要打通线上渠道才能获得更多生意&#xff0c;提…

微信小程序学习(03)

什么是生命周期函数 生命周期函数&#xff1a;是由小程序框架提供的内置函数&#xff0c;会伴随着生命周期&#xff0c;自动按次序执行。 生命周期函数的作用&#xff1a;允许程序员在特定的时间点&#xff0c;执行某些特定的操作。例如&#xff0c;页面刚加载的时候&#xff0…

Hexo + NexT 博客评论系统(Valine)配置小记

这几天刚配置了船新的 Hexo 博客&#xff0c;然后看到使用的 NexT 主题支持很多评论系统。我尝试配置了一下&#xff0c;发现里面坑太多了&#xff0c;真的挺费周章。于是想水一篇分享一下~ 1. 为什么不是…… NexT 主题一共支持如下的几个评论系统&#xff1a; 其中我觉得最…

测试时间函数

clock():测试时间函数 测试程序开始运行(即从main开始)到执行当前行需要的时间值,单位毫秒.需要引用time.h 例如&#xff1a;需要需要测试输出0~100需要的时间可以用如下代码&#xff1a; #include<stdio.h> #include<time.h>//单位是毫秒 int main() {clock_t c1…