二值量化 - Andrey Vasnetsov | 向量空间讲座
Demetrios Brinkmann
·2024年1月9日

本页内容
“当我们真正用OpenAI模型尝试二值量化时,一切都改变了。”
– Andrey Vasnetsov
有没有想过为什么向量索引需要量化?Andrey Vasnetsov解释了在近邻图(proximity graphs)中搜索的复杂性和挑战。二值量化可以减少存储大小并将速度提升30倍,但并非所有模型都兼容。
Andrey的职业生涯大部分时间都担任机器学习工程师。他偏爱实践而非理论,偏爱能工作的演示而非arXiv论文。他目前在向量相似度搜索引擎Qdrant担任CTO,Qdrant可用于语义搜索、文本、图像甚至视频的相似度匹配以及推荐。
在 Spotify、Apple Podcast、Podcast addicts、Castbox上收听本期节目。您还可以在 YouTube上观看本期节目。
主要收获
在Qdrant首次推出的向量空间讲座中,Qdrant的CTO Andrey Vasnetsov亲自解释了过采样如何在实时搜索中优化精度,提升准确性,且无需改变存储的数据结构。
在本期节目中,Andrey分享了关于二值量化及其对向量空间技术的深远影响的宝贵见解。
从本期节目中学习的5个要点
- 量化的必要性及其有助于克服的复杂挑战。
- 二值量化对处理速度和存储空间缩减的变革性影响。
- 详细探讨过采样及其在查询搜索中的实时精度控制。
- 理解二值量化的简单性和有效性,尤其是与更复杂的量化方法相比时。
- 二值量化在未来模型中的持续研究和潜在影响。
趣味事实:二值量化可以比传统量化方法提供超过30倍的处理速度,这是向量空间技术的一项革命性进步。
节目笔记
00:00 HNSW向量索引概述。
03:57 大尺寸向量需要高效存储。
07:49 过采样在实时搜索中控制精度。
12:21 使用点积比较向量。
15:20 模型实验,OpenAI兼容性良好。
18:29 Qdrant架构不支持移除原始向量。
更多来自Andrey的引言
“在Qdrant内部,我们使用所谓的HNSW向量索引,它本质上是一个近邻图。你可以把它想象成许多顶点,每个顶点代表一个向量,顶点之间的链接代表最近的邻居。”
– Andrey Vasnetsov
“主要思想是将向量的浮点元素转换为二进制表示。所以,取决于原始元素是正数还是负数,它可能是零或一。”
– Andrey Vasnetsov
“我们尝试了大多数流行的开源模型,不幸的是,它们与二值量化的兼容性不如OpenAI。”
– Andrey Vasnetsov
文字记录
Demetrios:好的,欢迎各位。这是首次向量空间讲座的开端,谁能比Qdrant的CTO Andrey V.更适合开启它呢?很高兴介绍您,并聆听您要谈论的二值量化。我有一些问题想问您,我知道聊天中也出现了一些问题。有趣的是,我们昨天在Discord上录制了直播。但Discord的问题在于,你不能相信那里的录音。所以我们只获得了音频,为了让在YouTube上观看的各位能更直观,我们决定在这里再次录制。因此,Andrey,我将引导您回答一些问题。我有一个问题想问每一位听众,那就是如果您想做一次演讲,并想展示您如何使用Qdrant,如何构建了一个RAG,或者您在AI领域或生态系统或技术栈中克服了哪些不同的特性或挑战,请随时联系我,我将安排您在这里展示您的成果,您可以为向量空间讲座做一次演讲。废话不多说,我们开始吧,Andrey,我们正在讨论二值量化,但也许让我们退一步。为什么我们需要任何量化?为什么不直接使用原始向量呢?
Andrey Vasnetsov:是的。大家好,Demetrios您好。这是个好问题,我认为要回答它,我首先需要简要概述一下向量索引是什么,它是如何工作的以及它带来的挑战。因此,在Qdrant内部,我们使用所谓的HNSW向量索引,它本质上是一个近邻图。你可以把它想象成许多顶点,每个顶点代表一个向量,顶点之间的链接代表最近的邻居。所以为了在图上搜索,你实际需要做的是一个贪心的深度优先搜索,你可以通过贪心搜索过程的波束大小来调整搜索的精度。但索引的这种结构本身就有其挑战,首先是索引构建的复杂性。
Andrey Vasnetsov:将一个向量插入索引的复杂性与在图上搜索一个向量一样复杂。而且图的结构总体上也有其局限性。它需要大量的随机读,你可以朝任何方向前进。搜索过程将采取哪条路径,很难提前预测。所以不像传统数据库中的传统索引,比如二叉树,比如倒排索引,我们可以几乎将所有东西序列化。在HNSW中,总是随机读,而且实际上总是顺序读,因为你需要以顺序的方式从一个顶点到另一个顶点。这实际上对向量的底层存储提出了非常严格的要求。
Andrey Vasnetsov:它必须具有非常低的延迟,并且必须支持这种随机分散。所以基本上,只有我们将所有向量存储在非常快的固态硬盘上,或者使用实际的RAM来存储所有东西,我们才能高效地做到这一点。而且现在RAM不便宜,特别是考虑到向量的大小随着模型的每个新版本而增加。例如,OpenAI模型的维度已经超过1000。所以你可以想象,一个向量已经是6KB的数据,无论你的文本有多长,而且随着新模型的进步等等,它变得越来越昂贵。所以为了真正应对这个问题,为了弥补数据需求的增长,我们建议做的,以及我们已经用不同的量化技术做过的,是我们将向量压缩到量化向量存储中,这通常对于内存表示更加紧凑。例如,在前一个版本中,我们有标量量化和乘积量化,可以将向量的大小压缩多达64倍。我们只在快速存储中保留这些压缩向量。
Andrey Vasnetsov:我们检索它们并获得候选列表,稍后将使用原始向量重新评分。这里的好处是,这个重新排序或重新评分过程实际上不需要任何类型的顺序或随机访问数据,因为我们已经知道所有需要重新评分的ID,我们可以利用例如异步I/O从磁盘高效地读取它们,甚至利用非常便宜的网络挂载磁盘的优势。这就是量化的主要好处。
Demetrios:我有一些后续问题,其中一个很简单,我想知道如果我们使用这个二值量化,并且如果我们使用不是GPT的较小模型,这是否会有双重好处?
Andrey Vasnetsov:是的。并非所有模型都像OpenAI一样大,但我们在这个领域看到的趋势,不同模型的发展趋势表明,它们将随着时间的推移变得越来越大。仅仅因为我们想在向量内部存储更多信息,我们想要更大的上下文,我们想要更详细的信息,更详细的分离等等。这个趋势是显而易见的,如果五年前向量的常用大小是100维度,现在常用大小是700维度,所以它基本上是。
Demetrios:为未来做准备,同时优化当下?
Andrey Vasnetsov:是的。
Demetrios:好的,您在这里提到了过采样。您能再详细说明一下,向我解释那是什么吗?
Andrey Vasnetsov:是的,过采样是我们用来在实时、查询时控制搜索精度的一种特殊技术。事情是这样的,我们可以在内部从量化存储中检索比我们实际需要的更多的向量。当我们使用原始向量进行重新评分时,我们会赋予更精确的分数。因此,从这个过选择中,我们可以只挑选那些对用户真正有益的向量。这就是我们如何在不重建索引、不改变存储数据结构中任何参数的情况下,基本控制准确性。但我们可以通过改变搜索查询本身的一个参数,实时做到这一点。
Demetrios:我明白了,好的,这就是量化。现在让我们深入探讨二值量化及其工作原理。
Andrey Vasnetsov:好的,二值量化实际上非常简单。主要思想是将向量的浮点元素转换为二进制表示。所以,取决于原始元素是正数还是负数,它可能是零或一。通过这样做,我们可以用汉明距离近似点积或余弦相似度,无论您使用什么指标来比较向量,汉明距离计算起来非常简单。它只需要CPU上两个最优化过的指令,就是Pixor和Popcount。不需要复杂的浮点子处理器,您只需要那两个。它适用于您拥有的任何寄存器,而且速度非常快。
Andrey Vasnetsov:它使用非常少的CPU周期来实际产生结果。这就是为什么二值量化比常规乘积快30倍以上。它实际上解决了复杂索引构建的问题,因为这种点积计算是HNSW计算需求的主要来源。
Demetrios:所以如果我理解正确,它基本上是将左边的所有这些数字(可以是小数)进行处理?
Andrey Vasnetsov:在左边您可以看到原始向量,它将其转换为二进制表示。当然,在这个过程中它会损失很多精度。但是因为首先我们有非常大的向量,其次我们有过采样特性,我们可以弥补这种精度损失,并且在速度和存储大小方面仍然获得好处。
Demetrios:所以如果我理解正确,它基本上是说,二值量化本身可能不是您想要的最好的东西。但是由于您有这些其他特性可以帮助抵消精度的损失,您可以从二值量化中获得速度,并从这些其他特性中获得精度。
Andrey Vasnetsov:是的。所以速度提升是如此巨大,以至于过采样有多少并不重要,我们仍然会从中受益。
Demetrios:是的。那速度快多少?您说快了,多少?超过30倍?
Andrey Vasnetsov:超过30倍,有些基准测试显示快了大约40倍。
Demetrios:哇。是的,那太大了。然后在这里底部您有点积与汉明距离的对比。然后是。是的,汉明。抱歉,我在您的幻灯片上发明词语了。您能解释一下那里发生了什么吗?
Andrey Vasnetsov:好的,点积是我们在比较一对向量时通常使用的度量。它基本上与余弦相似度相同,只是上面做了归一化。所以,在内部,余弦和点积实际上都只做点积,这是我们常用的度量。为了执行这个操作,我们首先需要将每个元素对与另一个向量的相同元素相乘,然后将所有这些乘法结果加起来得到一个数字。这就是我们的分数。而在二值量化中,在二进制向量中,我们做异或运算,然后计算一的个数。所以基本上,汉明距离是在这个二进制空间中点积的近似值。
Demetrios:太好了。好的,那看起来足够简单了,对吧?为什么您现在才在远比这复杂的乘积量化之后实现它?
Andrey Vasnetsov:这确实是个好问题。答案是二值量化看起来太简单了,好得令人难以置信。我们是这么想的,我们用开源模型尝试了不同的东西,效果不是很好。但是当我们真正用OpenAI模型尝试二值量化时,一切都改变了。结果发现OpenAI模型与这种类型的量化兼容性非常好。不幸的是,并非所有模型都像OpenAI一样具有良好的兼容性。老实说,对我们来说,目前还不完全清楚是什么让模型兼容而什么不兼容。我们确实知道它与维度数量相关,但这并不是唯一的因素。
Andrey Vasnetsov:所以存在一些秘密武器,我们应该找到它,这应该能让模型与二值量化兼容。我认为这实际上是这个领域的未来,因为汉明距离的优势,二值量化的优势是如此巨大,以至于将这些技巧纳入模型的学习过程中,使其更兼容是很有意义的。
Demetrios:您提到OpenAI的模型显然与二值量化配合得很好,但也有一些模型配合得不好,哪些模型的表现不太好?
Andrey Vasnetsov:所以现在我们正在尝试不同的模型。我们尝试了大多数流行的开源模型,不幸的是,它们与二值量化的兼容性不如OpenAI。我们还尝试了其他封闭源代码的模型,例如Cohere AI,它的兼容性与OpenAI在同一水平上,但它们的维度更高。所以不是1500,而是4000。现在还不清楚是否只有维度决定了模型的兼容性。或者训练过程中还有其他东西,但有一些开源模型正在接近OpenAI的1000维度,但在这种压缩兼容性方面,它们远不如OpenAI好。
Demetrios:所以希望社区能帮助我们弄清楚这一点。为什么它与这些封闭源代码的模型配合得非常好,而与开源模型却不行?也许我们遗漏了什么。
Andrey Vasnetsov:并非所有封闭源代码模型都兼容,有些表现与开源模型类似,但少数几个表现很好。
Demetrios:有意思。好的,那么是否有计划实现其他量化方法,比如四位量化,甚至将两个浮点数压缩到一个位中?
Andrey Vasnetsov:好的,我们选择量化方法主要取决于我们可以应用的可用CPU指令来执行这些计算。对于二值量化,它是直接且非常简单的。这就是为什么我们如此喜欢二值量化。例如,对于四位量化,使用哪种操作还不太明确。是否将转换为四位然后应用四位乘法是否高效还不清楚。这需要额外的研究,而且我不能说我们有立即这样做的计划,因为二值量化领域目前尚未被100%探索透彻,我们认为它比目前已解锁的潜力更大。
Demetrios:是的,在二值量化领域还有一些唾手可得的成果,所以先解决这些问题,然后再转向四位和所有那些有趣的东西。我给您的最后一个问题是,我们是否可以移除原始向量,只保留量化后的向量,以节省磁盘空间?
Andrey Vasnetsov:好的。所以不幸的是,Qdrant的架构并非为此类行为设计,也不期望如此,有几个原因。首先,移除原始向量会影响一些功能,比如过采样,比如段构建。实际上,移除那些原始向量只会与某些类型的量化兼容,例如,它不会与标量量化兼容,因为在这种情况下,我们将无法重建索引来维护系统。为了保持API的一致性、引擎的一致性,我们决定始终强制存储原始向量。但好消息是,您始终可以将原始向量保存在磁盘存储中。这非常便宜。通常比RAM便宜十倍甚至更多,而且它已经在价格方面为您带来了巨大的优势。这就是答案,太好了。
Demetrios:好的,伙计,我想这就是本期节目的全部内容了,感觉结束得很完美。正如我之前提到的,如果有人想来我们的向量空间讲座做演讲,我们希望每两周一次,如果能找到足够多的人,也许每周一次。所以这是对您的公开邀请,如果您来做演讲,我保证会送您一些周边产品。这是我的承诺。如果您在收听之后有任何问题,请到Qdrant Discord频道问我或Andrey任何您在听这个关于二值量化的讲座时可能有的问题。我们稍后会再联系。
Demetrios:再见,祝您愉快。保重。
再见,祝您愉快。保重。