hnsw

HNSW (Hierarchical Navigable Small World)

HNSW (Hierarchical Navigable Small World, česky Hierarchický navigovatelný malý svět) je v současnosti jeden z nejpopulárnějších a nejvýkonnějších algoritmů pro přibližné hledání nejbližšího souseda (ANN – Approximate Nearest Neighbor). Ve světě umělé inteligence, strojového učení a vektorových databází slouží jako průmyslový standard pro bleskové vyhledávání podobností v obrovských vícerozměrných datasetech.

Zatímco přesné hledání (k-Nearest Neighbors) vyžaduje porovnání dotazovaného vektoru s každým jednotlivým záznamem v databázi (což je u milionů vektorů extrémně pomalé), HNSW využívá chytrou grafovou strukturu k dosažení sub-milisekundové odezvy při zachování přesnosti často přesahující 99 %.

Základní stavební kameny algoritmu

HNSW kombinuje dva velmi odlišné koncepty z teorie grafů a datových struktur: Navigovatelné sítě malého světa (NSW) a Hierarchii (podobnou Skip Listům).

Teorie „malého světa“ (Small World) vychází ze známého fenoménu šesti stupňů odloučení (každého člověka na planetě lze propojit s kýmkoliv jiným přes maximálně šest známých). V kontextu vektorů to znamená, že body v grafu jsou propojeny primárně se svými nejbližšími sousedy, ale existují zde i záměrná dlouhá spojení (long-range links), která propojují vzdálené shluky dat.

Když v takovém grafu (NSW) hledáte, začnete v náhodném bodě a postupujete přes hrany k bodům, které jsou blíž vašemu cíli. Dlouhá spojení umožňují rychle „přeskočit“ na správnou stranu grafu a krátká spojení pak zajistí jemné dohledání cíle.

2. Hierarchie (Problém čistého NSW)

Samotný NSW má ale problém: jak graf roste, hledání se může zacyklit nebo zpomalit kvůli příliš mnoha hranám (tzv. „hub nodes“ neboli dálniční uzly, které jsou zahlceny dotazy).

Yu. A. Malkov (autor HNSW) tento problém vyřešil přidáním hierarchie. Inspiroval se pravděpodobnostní datovou strukturou zvanou Skip List (seznam s přeskoky). Zkonstruoval graf do několika vrstev (layers).

Struktura vrstev v HNSW

HNSW rozděluje vektory do poschodí:

  • Vrstvy vyšší úrovně (L2, L3…): Obsahují jen velmi málo vektorů. Slouží jako rychlé dálnice pro obrovské skoky napříč celým datovým prostorem.
  • Střední vrstvy (L1): Obsahují více vektorů a slouží k navigaci na úrovni „okresních silnic“.
  • Nultá vrstva (L0): Zcela spodní vrstva. Obsahuje všechny vektory v databázi a jejich hustá lokální propojení.

Rozhodnutí, do jaké vrstvy se nový vektor při vkládání dostane, se určuje náhodně pomocí klesající pravděpodobnosti (exponenciálního rozdělení). Většina bodů skončí pouze v nulté vrstvě, hrstka vyvolených „vystoupá“ až do nejvyšších vrstev.

Jak probíhá vyhledávání?

Hledání v HNSW (tzv. Greedy Routing) připomíná přibližování na mapě:

  1. Vstupní bod (Entry Point): Algoritmus začne v nejvyšší dostupné vrstvě u předem určeného vstupního uzlu.
  2. Hledání v aktuální vrstvě: Prohledá sousedy tohoto uzlu. Pokud najde souseda, který je blíž dotazovanému vektoru, přesune se na něj (hladové hledání / greedy search).
  3. Propad do nižší vrstvy: Pokud v aktuální vrstvě už neexistuje žádný uzel, který by byl k cíli blíž (našlo se lokální minimum pro tuto vrstvu), algoritmus „propadne“ do stejného uzlu v o vrstvu nižším patře.
  4. Opakování až do L0: Tento proces se opakuje, dokud algoritmus nedosáhne vrstvy 0. Zde provede finální detailní dohledání požadovaného počtu (k) nejbližších sousedů.

Parametry pro ladění (Tuning)

Vývojáři používající HNSW (např. v databázích jako je Milvus) mají k dispozici tři klíčové parametry, kterými balancují mezi rychlostí, přesností a spotřebou paměti:

Parametr Zkratka Popis a vliv na výkon
M Počet hran Maximální počet obousměrných spojení (hran), které může mít jeden uzel ke svým sousedům. Vyšší M zlepšuje přesnost pro složité datasety (vysoká dimenze), ale drasticky zvyšuje spotřebu RAM a čas tvorby indexu. Běžné hodnoty jsou 16 až 64.
efConstruction Hloubka hledání při tvorbě Velikost dynamického seznamu kandidátů udržovaného během vkládání nových dat. Vyšší hodnota (např. 200–500) znamená déle trvající stavbu kvalitnějšího grafu, což vede k přesnějšímu vyhledávání.
efSearch Hloubka hledání při dotazu Velikost seznamu kandidátů při vyhledávání. Určuje, jak moc se má prohledávat okolí v nejnižší vrstvě L0. Vyšší efSearch = vyšší přesnost (Recall), ale vyšší latence (dotaz trvá déle). Platí, že efSearch musí být vždy >= žádaný počet výsledků (k).

Výhody a zásadní nevýhody

Proč je HNSW tak oblíbený?

  • Extrémní rychlost (Nízká latence): Díky hierarchii odpadá výpočet mnoha zbytečných vzdáleností. Dotazy trvají zlomky milisekund.
  • Vysoký Recall: Schopnost najít skutečně nejbližší sousedy s přesností blížící se 100 %.
  • Podpora pro aktualizace: Na rozdíl od starších algoritmů (jako jsou stromy kd-trees) HNSW celkem dobře zvládá průběžné přidávání nových dat (streaming).

Problém: Paměťový moloch

Největší slabinou HNSW je spotřeba operační paměti (RAM). Struktura grafu, zejména uložení všech hran v paměti a samotných nepředzpracovaných vektorů, vyžaduje, aby celý index sídlil v RAM. Pokud máte 1 miliardu vektorů (např. o 768 dimenzích), samotná data zaberou zhruba 3 TB a grafová struktura HNSW si vyžádá další obrovskou porci paměti.

To dělá HNSW velmi drahým na provoz v obrovských měřítkách (tzv. hyperscale). Pro řešení tohoto problému vznikly alternativy optimalizované pro SSD disky, jako je například algoritmus DiskANN.

Odkazy a související články

hnsw.txt · Poslední úprava: autor: admin