日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

ann搜索算法(Approximate Nearest Neighbor)

發(fā)布時(shí)間:2023/12/29 综合教程 60 生活家
生活随笔 收集整理的這篇文章主要介紹了 ann搜索算法(Approximate Nearest Neighbor) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ANN的方法分為三大類:基于樹的方法、哈希方法、矢量量化方法。brute-force搜索的方式是在全空間進(jìn)行搜索,為了加快查找的速度,幾乎所有的ANN方法都是通過對(duì)全空間分割,將其分割成很多小的子空間,在搜索的時(shí)候,通過某種方式,快速鎖定在某一(幾)子空間,然后在該(幾個(gè))子空間里做遍歷

1、基于樹的方法

1.1 kd樹

1.2Annoy

Annoy是一個(gè)以樹為數(shù)據(jù)結(jié)構(gòu)的近似最近鄰搜索庫(kù),并用在Spotify的推薦系統(tǒng)中。Annoy的核心是不斷用選取的兩個(gè)質(zhì)心的法平面對(duì)空間進(jìn)行分割,最終將每一個(gè)區(qū)分的子空間里面的樣本數(shù)據(jù)限制在K以內(nèi)。對(duì)于待插入的樣本$x_i$,從根節(jié)點(diǎn)依次使用法向量跟$x_i$做內(nèi)積運(yùn)算,從而判斷使用法平面的哪一邊(左子樹or右子樹)。對(duì)于查詢向量$q_i$,采用同樣的方式(在樹結(jié)構(gòu)上體現(xiàn)為從根節(jié)點(diǎn)向葉子節(jié)點(diǎn)遞歸遍歷),即可定位到跟$q_i$在同一個(gè)子空間或者鄰近的子空間的樣本,這些樣本即為$q_i$近鄰。為了提高查詢的召回,Annoy采用建立多棵樹的方式。

2、哈希方法

3、矢量量化方法

矢量量化方法,即vector quantization,其具體定義為:將一個(gè)向量空間中的點(diǎn)用其中的一個(gè)有限子集來進(jìn)行編碼的過程。在矢量量化編碼中,關(guān)鍵是碼本的建立和碼字搜索算法。比如常見的聚類算法,就是一種矢量量化方法。而在ANN近似最近鄰搜索中,向量量化方法又以乘積量化(PQ, Product Quantization)最為典型。

PQ乘積量化的核心思想還是聚類,或者說具體應(yīng)用到ANN近似最近鄰搜索上,K-Means是PQ乘積量化子空間數(shù)目為1的特例。PQ乘積量化生成碼本和量化的過程可以用如下圖示來說明:

在訓(xùn)練階段,針對(duì)N個(gè)訓(xùn)練樣本,假設(shè)樣本維度為128維,我們將其切分為4個(gè)子空間,則每一個(gè)子空間的維度為32維,然后我們?cè)诿恳粋€(gè)子空間中,對(duì)子向量采用K-Means對(duì)其進(jìn)行聚類(圖中示意聚成256類),這樣每一個(gè)子空間都能得到一個(gè)碼本。這樣訓(xùn)練樣本的每個(gè)子段,都可以用子空間的聚類中心來近似,對(duì)應(yīng)的編碼即為類中心的ID。如圖所示,通過這樣一種編碼方式,訓(xùn)練樣本僅使用的很短的一個(gè)編碼得以表示,從而達(dá)到量化的目的。對(duì)于待編碼的樣本,將它進(jìn)行相同的切分,然后在各個(gè)子空間里逐一找到距離它們最近的類中心,然后用類中心的id來表示它們,即完成了待編碼樣本的編碼。

在查詢階段,PQ同樣在計(jì)算查詢樣本與dataset中各個(gè)樣本的距離,只不過這種距離的計(jì)算轉(zhuǎn)化為間接近似的方法而獲得。PQ乘積量化方法在計(jì)算距離的時(shí)候,有兩種距離計(jì)算方式,一種是對(duì)稱距離,另外一種是非對(duì)稱距離。非對(duì)稱距離的損失小(也就是更接近真實(shí)距離),實(shí)際中也經(jīng)常采用這種距離計(jì)算方式。下面過程示意的是查詢樣本來到時(shí),以非對(duì)稱距離的方式(紅框標(biāo)識(shí)出來的部分)計(jì)算到dataset樣本間的計(jì)算示意:

具體地,查詢向量來到時(shí),按訓(xùn)練樣本生成碼本的過程,將其同樣分成相同的子段,然后在每個(gè)子空間中,計(jì)算子段到該子空間中所有聚類中心得距離,如圖中所示,可以得到4*256個(gè)距離,這里為便于后面的理解說明,小白菜就把這些算好的距離稱作距離池。在計(jì)算庫(kù)中某個(gè)樣本到查詢向量的距離時(shí),比如編碼為(124, 56, 132, 222)這個(gè)樣本到查詢向量的距離時(shí),我們分別到距離池中取各個(gè)子段對(duì)應(yīng)的距離即可,比如編碼為124這個(gè)子段,在第1個(gè)算出的256個(gè)距離里面把編號(hào)為124的那個(gè)距離取出來就可,所有子段對(duì)應(yīng)的距離取出來后,將這些子段的距離求和相加,即得到該樣本到查詢樣本間的非對(duì)稱距離。所有距離算好后,排序后即得到我們最終想要的結(jié)果。

從上面這個(gè)過程可以很清楚地看出PQ乘積量化能夠加速索引的原理:即將全樣本的距離計(jì)算,轉(zhuǎn)化為到子空間類中心的距離計(jì)算。比如上面所舉的例子,原本brute-force search的方式計(jì)算距離的次數(shù)隨樣本數(shù)目N成線性增長(zhǎng),但是經(jīng)過PQ編碼后,對(duì)于耗時(shí)的距離計(jì)算,只要計(jì)算4*256次,幾乎可以忽略此時(shí)間的消耗。另外,從上圖也可以看出,對(duì)特征進(jìn)行編碼后,可以用一個(gè)相對(duì)比較短的編碼來表示樣本,自然對(duì)于內(nèi)存的消耗要大大小于brute-force search的方式。

在某些特殊的場(chǎng)合,我們總是希望獲得精確的距離,而不是近似的距離,并且我們總是喜歡獲取向量間的余弦相似度(余弦相似度距離范圍在[-1,1]之間,便于設(shè)置固定的閾值),針對(duì)這種場(chǎng)景,可以針對(duì)PQ乘積量化得到的前top@K做一個(gè)brute-force search的排序。

倒排乘積量化

倒排PQ乘積量化(IVFPQ)是PQ乘積量化的更進(jìn)一步加速版。其加速的本質(zhì)逃不開小白菜在最前面強(qiáng)調(diào)的是加速原理:brute-force搜索的方式是在全空間進(jìn)行搜索,為了加快查找的速度,幾乎所有的ANN方法都是通過對(duì)全空間分割,將其分割成很多小的子空間,在搜索的時(shí)候,通過某種方式,快速鎖定在某一(幾)子空間,然后在該(幾個(gè))子空間里做遍歷。在上一小節(jié)可以看出,PQ乘積量化計(jì)算距離的時(shí)候,距離雖然已經(jīng)預(yù)先算好了,但是對(duì)于每個(gè)樣本到查詢樣本的距離,還是得老老實(shí)實(shí)挨個(gè)去求和相加計(jì)算距離。但是,實(shí)際上我們感興趣的是那些跟查詢樣本相近的樣本(小白菜稱這樣的區(qū)域?yàn)楦信d趣區(qū)域),也就是說老老實(shí)實(shí)挨個(gè)相加其實(shí)做了很多的無用功,如果能夠通過某種手段快速將全局遍歷鎖定為感興趣區(qū)域,則可以舍去不必要的全局計(jì)算以及排序。倒排PQ乘積量化的”倒排“,正是這樣一種思想的體現(xiàn),在具體實(shí)施手段上,采用的是通過聚類的方式實(shí)現(xiàn)感興趣區(qū)域的快速定位,在倒排PQ乘積量化中,聚類可以說應(yīng)用得淋漓盡致。

倒排PQ乘積量化整個(gè)過程如下圖所示:

在PQ乘積量化之前,增加了一個(gè)粗量化過程。具體地,先對(duì)N個(gè)訓(xùn)練樣本采用K-Means進(jìn)行聚類,這里聚類的數(shù)目一般設(shè)置得不應(yīng)過大,一般設(shè)置為1024差不多,這種可以以比較快的速度完成聚類過程。得到了聚類中心后,針對(duì)每一個(gè)樣本x_i,找到其距離最近的類中心c_i后,兩者相減得到樣本x_i的殘差向量(x_i-c_i),后面剩下的過程,就是針對(duì)(x_i-c_i)的PQ乘積量化過程,此過程不再贅述。

在查詢的時(shí)候,通過相同的粗量化,可以快速定位到查詢向量屬于哪個(gè)c_i(即在哪一個(gè)感興趣區(qū)域),然后在該感興趣區(qū)域按上面所述的PQ乘積量化距離計(jì)算方式計(jì)算距離。

參考:

https://yongyuan.name/blog/ann-search.html

總結(jié)

以上是生活随笔為你收集整理的ann搜索算法(Approximate Nearest Neighbor)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。