Elasticsearch:將最大內積引入 Lucene

作者:Benjamin Trent

目前,Lucene 限制 dot_product (點積)?只能在標準化向量上使用。 歸一化迫使所有向量幅度等于一。 雖然在許多情況下這是可以接受的,但它可能會導致某些數據集的相關性問題。 一個典型的例子是 Cohere 構建的嵌入(embeddings)。 它們的向量使用幅度來提供更多相關信息。

那么,為什么不允許點積中存在非歸一化向量,從而實現最大內積呢? 有什么大不了的?

負值和 Lucene 優化

Lucene要求分數非負,因此在析取 (disjunctive query) 查詢中多匹配一個子句只能使分數更高,而不是更低。 這實際上對于動態修剪優化(例如 block-max WAND)非常重要,如果某些子句可能產生負分數,則其效率會大大降低。 此要求如何影響非標準化向量?

在歸一化情況下,所有向量都在單位球面上。 這允許通過簡單的縮放來處理負分數。

圖 1:二維單位球體(例如單位圓)中的兩個相反的二維向量。 在這里計算點積時,最糟糕的情況是 -1 = [1, 0] * [-1, 0]。 Lucene 通過向結果加 1 來解決這一問題。

當向量保持其大小時,可能值的范圍是未知的。

圖 2:計算這些向量的點積時 [2, 2] \* [-5, -5] = -20

為了允許 Lucene 將 blockMax WAND 與非標準化向量結合使用,我們必須縮放分數。 這是一個相當簡單的解決方案。 Lucene 將使用簡單的分段函數縮放非標準化向量:

if (dotProduct < 0) {return 1 / (1 + -1 * dotProduct);
}
return dotProduct + 1;

現在,所有負分數都在 0 -1 之間,所有正分數都在 1 以上。這仍然可以確保較高的值意味著更好的匹配并消除負分數。 很簡單,但這不是最后的障礙。

三角形問題

最大內積不遵循與簡單歐幾里得空間相同的規則。 三角不等式的簡單假設知識被拋棄。 不直觀的是,向量不再最接近其自身。 這可能會令人不安。 Lucene 的向量底層索引結構是分層可導航小世界 (HNSW)。 這是基于圖的算法,它可能依賴于歐幾里得空間假設。 或者在非歐幾里得空間中探索圖會太慢嗎?

一些研究表明,快速搜索需要轉換到歐幾里得空間。 其他人則經歷了更新向量存儲以強制轉換為歐幾里得空間的麻煩。

這導致我們停下來深入挖掘一些數據。 關鍵問題是:HNSW 是否通過最大內積搜索提供良好的召回率和延遲? 雖然 HNSW 最初的論文和其他已發表的研究表明確實如此,但我們需要進行盡職調查。

我們進行的實驗很簡單。 所有的實驗都是在真實數據集或稍微修改的真實數據集上進行的。 這對于基準測試至關重要,因為現代神經網絡創建符合特定特征的向量(請參閱本文第 7.8 節中的討論)。 我們測量了非標準化向量的延遲(以毫秒為單位)與召回率。 將數字與具有相同測量值但采用歐幾里德空間變換的數字進行比較。 在每種情況下,向量都被索引到 Lucene 的 HNSW 實現中,并且我們測量了 1000 次查詢迭代。 每個數據集考慮了三種單獨的情況:按大小順序插入的數據(從小到大)、按隨機順序插入的數據以及按相反順序插入的數據(從大到小)。

以下是 Cohere 真實數據集的一些結果:

圖 3:以下是嵌入維基百科文章的 Cohere 多語言模型的結果。 可在 HuggingFace 上找到。 前 10 萬份文檔已建立索引并進行了測試。

圖 4:這是 Cohere 在維基百科上的英語和日語嵌入的混合。 這兩個數據集都可以在 HuggingFace 上找到。

我們還針對一些合成數據集進行了測試,以確保我們的嚴謹性。 我們使用 e5-small-v2 創建了一個數據集,并通過不同的統計分布縮放了向量的大小。 為了簡潔起見,我將僅顯示兩個分布。

圖 5: 幅度? Pareto distribution?。 pareto distribution 具有“肥尾”,這意味著分布的一部分的幅度比其他部分大得多。

圖 6:幅度的伽馬分布。 這種分布可能具有很高的方差,并使其在我們的實驗中獨一無二。

在我們所有的實驗中,唯一需要進行轉換的是使用伽瑪分布創建的合成數據集。 即使這樣,向量也必須以相反的順序插入,首先是最大幅度,以證明變換的合理性。 這些都是例外情況。

如果你想了解所有實驗以及整個過程中的所有錯誤和改進,請參閱 Lucene Github 問題,其中包含所有詳細信息(以及過程中的錯誤)。 這是一個開放式研究和開發的項目!

結論

這是一個相當長的旅程,需要進行多次調查才能確保 Lucene 能夠支持最大內積。 我們相信數據不言自明。 無需進行重大轉換或對 Lucene 進行重大更改。 所有這些工作將很快解鎖 Elasticsearch 的最大內積支持,并允許 Cohere 提供的模型成為 Elastic Stack 中的一等公民。

注:最大內積已經在 8.11 中進行了支持!

原文:Bringing Maximum-Inner-Product into Lucene — Elastic Search Labs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161566.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 Lhotse 高效管理音頻數據集

Lhotse 是一個旨在使語音和音頻數據準備更具靈活性和可訪問性的 Python 庫&#xff0c;它與 k2 一起&#xff0c;構成了下一代 Kaldi 語音處理庫的一部分。 主要目標&#xff1a; 1. 以 Python 為中心的設計吸引更廣泛的社區參與語音處理任務。 2. 為有經驗的 Kaldi 用戶提供…

SpringBoot——啟動類的原理

優質博文&#xff1a;IT-BLOG-CN SpringBoot啟動類上使用SpringBootApplication注解&#xff0c;該注解是一個組合注解&#xff0c;包含多個其它注解。和類定義SpringApplication.run要揭開SpringBoot的神秘面紗&#xff0c;我們要從這兩位開始就可以了。 SpringBootApplicati…

Spring實例化對象

默認proxyBeanMethods true&#xff0c;這種方法是用的代理模式創建對象&#xff0c;每次創建都是同一個對象&#xff0c;如果改為false每次都是不同的對象 FactoryBean的使用 定義的類A&#xff0c;造出來一個類B&#xff0c;可以在創造bean之前做一些自己的個性化操作

MFS分布式文件系統

目錄 集群部署 Master Servers ?Chunkservers ?編輯Clients Storage Classes LABEL mfs高可用 pacemaker高可用 ?編輯ISCSI 添加集群資源 主機 ip 角色 server1 192.168.81.11 Master Servers server2 192.168.81.12 Chunkservers server3 192.168.81.13 Chunkserver…

【產品安全平臺】上海道寧與Cybellum將整個產品安全工作流程整合到一個專用平臺中,保持構建的互聯產品的網絡安全和網絡合規性

Cybellum將 整個產品安全工作流程 整合到一個專用平臺中 使設備制造商能夠 保持他們構建的互聯產品的 網絡安全和網絡合規性 產品安全性對 每個人來說都不一樣 每個行業的系統、工作流程和 法規都存在根本差異 因此&#xff0c;Cybellum量身定制了 Cybellum的平臺和技…

為何內存不夠用?微服務改造啟動多個Spring Boot的陷阱與解決方案

在生產環境中我們會遇到一些問題&#xff0c;此文主要記錄并復盤一下當時項目中的實際問題及解決過程。 背景簡述 最初系統上線后都比較正常風平浪靜的。在系統運行了一段時間后&#xff0c;業務量上升后&#xff0c;生產上發現java應用內存占用過高&#xff0c;服務器總共64…

打印出一個底部有n個*的漏斗c語言

題目描述 打印出一個底部有n個*的漏斗 輸入 第一行輸入一個T;表示有T組測試數據 下面每一行都有一個n表示漏斗底部*的個數 n保證是奇數 輸出 輸出打印結果 兩個測試答案之間要用換行分割 /*printf("這是第%d行 我要打印%d個* \n",Num,i); */ *********** *…

愛創科技總裁謝朝暉榮獲“推動醫藥健康產業高質量發展人物”

中國醫藥市場規模已經成為全球第二大醫藥市場&#xff0c;僅次于美國。近年來&#xff0c;隨著中國經濟的持續增長和人民生活水平的提高&#xff0c;醫藥市場需求不斷擴大。政府對醫療衛生事業的投入也在不斷加大&#xff0c;為醫藥行業的發展創造了良好的政策環境。為推動醫藥…

SparkSession介紹

一、 介紹 SparkSession是Spark 2.0中引入的新概念&#xff0c;它是Spark SQL、DataFrame和Dataset API的入口點&#xff0c;是Spark編程的統一API&#xff0c;也可看作是讀取數據的統一入口&#xff1b;它將以前的SparkContext、SQLContext和HiveContext組合在一起&#xff0…

結構體與指針_sizeof_static_extern_函數指針數組_函數指針_回調函數

一、結構體與指針 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #define up_to_down(uuu) (downdemo_t *)(uuu->beg) #define __plc__ typedef struct updemo_s{uint8_t *head;uint8_t *beg;uint8_t *end; }updemo_t; typedef struct do…

陪玩圈子系統APP小程序H5,詳細介紹,源碼交付,支持二開!

陪玩圈子系統&#xff0c;頁面展示&#xff0c;源碼交付&#xff0c;支持二開&#xff01; 陪玩后端下載地址&#xff1a;電競開黑陪玩系統小程序&#xff0c;APP&#xff0c;H5: 本系統是集齊開黑&#xff0c;陪玩&#xff0c;陪聊于一體的專業APP&#xff0c;小程序&#xff…

2:kotlin集合(Collections)

集合有助于數據分組&#xff0c;方便后續操作 集合類型說明Lists有序的可重復的集合Sets無序的不可重復的集合Maps鍵值對映射集合&#xff0c;鍵唯一&#xff0c;且一個鍵只能映射到一個值 每個集合類型都可以是可變的或者只讀的 List List按照添加的順序存儲內容&#xff…

Linux進程通信——共享內存

概念 共享內存&#xff08;Shared Memory&#xff09;&#xff0c;指兩個或多個進程共享一個給定的存儲區。 特點 共享內存是最快的一種 IPC&#xff0c;因為進程是直接對內存進行存取。 因為多個進程可以同時操作&#xff0c;所以需要進行同步。 信號量共享內存通常結合在一…

Open3D (C++) 計算兩點云之間的最小距離

目錄 一、 算法原理二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲與GPT。 一、 算法原理 Open3D中ComputePointCloudDistance函數提供了計算從源點云到目標點云的距離的方法,計算點云的距離。也…

python數據結構與算法-05_棧

棧 棧這個詞實際上在計算機科學里使用很多&#xff0c;除了數據結構外&#xff0c;還有內存里的棧區 &#xff08;和堆對應&#xff09;&#xff0c;熟悉 C 系語言的話應該不會陌生。 上一章我們講到了先進先出 queue&#xff0c;其實用 python 的內置類型 collections.deque …

【C語法學習】26 - strcmp()函數

文章目錄 1 函數原型2 參數3 返回值4 比較機制5 示例5.1 示例1 1 函數原型 strcmp()&#xff1a;比較str1指向的字符串和str2指向的字符串&#xff0c;函數原型如下&#xff1a; int strcmp(const char *str1, const char *str2);2 參數 strcmp()函數有兩個參數str1和str2&a…

HCIP-四、MUX-vlanSuper-vlan+端口安全

四、MUX-vlan&Super-vlan端口安全 MUX-vlan實驗拓撲實驗需求及解法1. 在SW1/2/3分別創建vlan10 20 30 402. SW1/2/3之間使用trunk鏈路&#xff0c;僅允許vlan10 20 30 40 通過。3. SW與PC/Server之間使用access鏈路。4. ping驗證&#xff1a; Super-vlan端口安全實驗拓撲實…

【騰訊云云上實驗室-向量數據庫】騰訊云開創新時代,發布全新向量數據庫Tencent Cloud VectorDB

前言 隨著人工智能、數據挖掘等技術的飛速發展&#xff0c;海量數據的存儲和分析越來越成為重要的研究方向。在海量數據中找到具有相似性或相關性的數據對于實現精準推薦、搜索等應用至關重要。傳統關系型數據庫存在一些缺陷&#xff0c;例如存儲效率低、查詢耗時長等問題&…

CentOS使用docker安裝OpenGauss數據庫

1.搜索OpenGauss docker search opengauss 2.選擇其中一個源拉取 docker pull docker.io/enmotech/opengauss 3.運行OpenGauss docker run --name opengauss --privilegedtrue --restartalways -d -e GS_USERNAMEpostgres -e GS_PASSWORDmyGauss2023 -p 5432:5432 docker.…

黑馬React18: ReactRouter

黑馬React: ReactRouter Date: November 21, 2023 Sum: React路由基礎、路由導航、導航傳參、嵌套路由配置 路由快速上手 1. 什么是前端路由 一個路徑 path 對應一個組件 component 當我們在瀏覽器中訪問一個 path 的時候&#xff0c;path 對應的組件會在頁面中進行渲染 2. …