Note - ICML24 - Approximate Nearest Neighbor Search with Window Filters

DMoRanSky發表於2024-10-10

他這個好像保證一個界的 window / range filter
Github: RangeFilteredANN

adversarially 對抗生成,75x (75倍)快於?召回率差不多

![[Pasted image 20241007142744.png]]

那我看的上一篇是啥?雖然可能也 trivial,沒事了。
貢獻:很多區間搜尋方法(他這裡叫 window search) (① 模組化基於樹的框架 [我猜是線段樹。。] modular tree-based framework(使用 Vamana ANNS 演算法的特定例項化) and 標籤空間劃分方法 a labelspace partitioning approach. [討論最優劃分方法])

感覺恨我理解意義上的通法很像,還會很bsaic嗎??

https://www.aimodels.fyi/papers/arxiv/approximate-nearest-neighbor-search-window-filters

這是ai生成的,擱著擱著。
他說不能支援動態的?

![[Pasted image 20241007144508.png]]
KD 樹篩選舉行
平凡做法

  1. prefiltering 前篩
  2. postfiltering 後篩
    他們好像就是線段樹。

Def

\((D, l)\) 一組資料 \(D\) 是空間 (\(R^{10}\)\(l(x)\)\(x\) 這個點的屬性)
可以定義篩資料是 \(D_{(a,b)}\)
\(c\)-近似,不超過最小的 \(c\) 倍返回一個(而且在區間裡)

演算法

樸素 baseline

\(β-WST\) : Window Search Tree

\(\beta\) 份,但最後 \(<\beta\) 就不分了。
他就是 \(\beta\) (k) 叉線段樹。。真的有用嗎,(為啥我覺得不如正常二叉)
\(A(D)\) 建立一個新節點,然後存兒子和 每個兒子sz()

4.2 查詢線段樹

就直接線段樹分成 log 個節點查。

4.3 附加查詢方法

OptimizedPostfiltering

找一個最大的區間後篩(我還以為是分治的,就最後掃嗎,太蠢了》。。。最大的擴充套件區間也最多是兩倍,就每次找 K 近的如果沒有就倍增 (*2) 找,感覺有點笨的

ThreeSplit

找到最小的包含他區間然後執行兩次 OptimizedPostfilering,沒明白。。

SuperPostfiltering

任意資料結構

5. Theoretical Analysis

不想看了,感覺就線段樹啊。。log

6. 實驗

2.20GHz Intel Xeon machine with 40 cores and two-way hyper-threading, 100 MiB L3 cache, and 504 GB of RAM.

80 hyper-threads, query -> 16 threads.

separate 2.10GHz Intel Xeon machine with 96 cores and two way hyper-threading, 132 MiB L3 cache, and 1.47 TB of RAM

還返回了前十個的召回率。

Filter Fraction: \(1/2^i\) 這種意思
Data:沒細看
查詢方法超參:大部分都是正常線段樹 \(\beta = 2\)
![[Pasted image 20241009233107.png]]
看起來都是他的 Super Postfiltering 要好點,不太明白,就正常高線段樹很菜?
![[Pasted image 20241009233432.png]]

這裡看起來又是普通線段樹好了?

總結

emm 感覺也沒有啥創新 idea,就是複合了個 k 叉線段樹上去(他說的主要貢獻就是比暴力快 75倍,這很正常吧就因為暴力 \(O(n)\) 線段樹 \(\log n\),確實該這麼快。。)(prefiltering)然後他的後篩相當於不是 log 哥區間了燒著一點
...

疑問:

  1. 他一開始說 c 近似,後面好像又跟 c 沒關係了就是下找的?

不過 ICML 這種簡短風格感覺比 SIGMOD 要舒服一點。(雖然可能是我理論和附錄 skip 了 ...

可能的提升?

  • 還是上一篇同樣的,如果裡面這個 ANN 結構支援可持久化儲存字首插入資訊,這樣就可以分治精準變成兩個區間的查詢。這樣 \(\log\) 個就變成 \(2\) 個,速度應該還會快,但不知道他用的這個 Vamana 行不行,但我感覺我魔改一下 HNSW 應該會科學點(感覺挺有道理變快的。【相當於線段樹其實不慢,但在第一個圖裡面比分治 *k的post亂搞慢一兩杯左右,但感覺這個沒保證的。。】

相關文章