[Vector Search] HNSW ์ธ๋ฑ์Šค

๊ด€๋ จ ํฌ์ŠคํŠธ
https://m.blog.naver.com/sssang97/223790220320

HNSW(Hierarchical navigable small world)๋Š” ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ธ๋ฑ์Šค ๊ตฌํ˜„์— ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋‹ค.
2016๋…„์— ๋‚˜์™”๋‹ค.




ํŠน์ง•

๋‹ค๋ฅธ ๋ฒกํ„ฐ ์ธ๋ฑ์Šค ๊ตฌ์กฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทผ์‚ฌ์น˜(ANN) ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ตฌ์กฐ๋ผ์„œ, ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํ•  ์ˆ˜ ์—†๋‹ค.
์†๋„๋ฅผ ์œ„ํ•ด์„œ ์ •ํ™•๋„๋ฅผ ํฌ์ƒํ•œ ๊ตฌ์กฐ๋‹ค.
์ •ํ™•๋„๋Š” ๊ตฌํ˜„์ฒด์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ๋Œ€์ฒด๋กœ 70~90% ์ •๋„๋ฅผ ์˜ค๊ฐ„๋‹ค.

๊ฒ€์ƒ‰์‹œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(log N), ๊ณต๊ฐ„๋ณต์žก๋„๋Š” O(N Log N) ์ •๋„๋‹ค.

์—ญ์‚ฌ์ ์œผ๋กœ๋Š”, Navigable Small World์ด๋ž€ ๊ทธ๋ž˜ํ”„ ๋‹จ์œ„์— Skip list๋ฅผ ๋น„๋กฏํ•œ ์•„์ด๋””์–ด๋ฅผ ์ฒจ๊ฐ€ํ•ด์„œ ๋ฐœ์ „์‹œํ‚จ ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.




NSW (Navigable Small World)

HNSW์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๋ ค๋ฉด ๊ทธ ์ด์ „ ๋‹จ๊ณ„์ธ NSW(Navigable Small World)์— ๋Œ€ํ•ด์„œ๋„ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
์ผ๋‹จ ์ด๋ฆ„์— ๋“ค์–ด์žˆ๋Š” Small World๋ผ๋Š” ์šฉ์–ด ์ž์ฒด๋Š” ๊ธฐ์ˆ ๊ณผ ์—ฐ๊ด€์ด ์—†๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

.png?type=w800) ๊ทธ๋ƒฅ ์ธ๊ฐ„๋“ค๋ผ๋ฆฌ์˜ ์ธ๊ฐ„๊ด€๊ณ„๋ฅผ ๋”ฐ๋ผ๊ฐ€๋‹ค๋ณด๋ฉด, ๋ณดํ†ต ๋Œ€๋ถ€๋ถ„์€ ๊ฑฐ์˜ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค๋Š” ์‚ฌํšŒ ์ด๋ก ์ด์—ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ˆ˜์ค€์—์„œ๋„ ์‚ฌ์‹ค ๋น„์Šทํ•˜๋‹ค.
๋…ธ๋“œ๋ผ๋ฆฌ ์ด๋ž˜์ €๋ž˜ ์—ฐ๊ฒฐ์„ ํ•ด๋†“์œผ๋ฉด, ์‹ค์ œ๋กœ๋„ ์œ ์˜๋ฏธํ•œ ํƒ์ƒ‰ ์†๋„๋ฅผ ๋ณด์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ด๋ ‡๋‹ค.

NSW์—์„œ ํƒ์ƒ‰์„ ํ• ๋•Œ๋Š” entrypoint๋ผ๊ณ  ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.
entrypoint๊ฐ€ ์ผ๋ฐ˜์ ์ธ Tree์˜ root์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

entrypoint์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, ์—ฃ์ง€๋ฅผ ๋”ฐ๋ผ ๊ฒ€์ƒ‰ ๋ฒกํ„ฐ์™€ ๊ฐ€์žฅ ๋น„์Šทํ•œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์„œ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํƒ€๊ณ  ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋‹ค๊ฐ€ ์—ฃ์ง€์— ๋” ๋น„์Šทํ•œ๊ฒŒ ์—†๋‹ค๋ฉด ๊ทธ๊ฒŒ ๊ฐ€์žฅ ๋น„์Šทํ•œ ๋ฒกํ„ฐ๋ผ ํŒ๋‹จํ•˜๊ณ  ์œ„์น˜์—์„œ ์ข…๋ฃŒํ•œ๋‹ค.
์ด ์ข…๋ฃŒ ์ง€์ ์„ local minimum์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ด๋Ÿฌํ•œ ํƒ์ƒ‰ ์ ‘๊ทผ๋ฒ•์„ greedy routing์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.



๋‹จ์ 

ํ•˜์ง€๋งŒ, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํƒ์ƒ‰์„ ์ค‘๋‹จํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ๊ทธ๊ฒŒ ๊ฐ€์žฅ ๋น„์Šทํ•œ ๋ฒกํ„ฐ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค. ํ™•๋ฅ ์ ์œผ๋กœ ๋น„์Šทํ•  ํ™•๋ฅ ์ด ๋†’์€ ๊ฒƒ์ด๊ณ , ๊ทผ์‚ฌ์น˜์— ๋ถˆ๊ณผํ•˜๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ผ๋ฐ˜์ ์ธ NSW ๊ตฌํ˜„์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ข…๋ฃŒ ์ง€์ , local minimum์ด ์‹ค์ œ ๊ฐ’๊ณผ ๋™๋–จ์–ด์ ธ์žˆ์„ ํ™•๋ฅ ์ด ๋†’๋‹ค. local minimum์ด ์• ๋งคํ•œ ์ง€์ ์—์„œ ์žกํ˜€์„œ ๋„ˆ๋ฌด ์ผ์ฐ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ early stopping์ด๋ผ๊ณ  ํ•œ๋‹ค.

entrypoint๋ฅผ ์—ฌ๋Ÿฌ ์ง€์ ์œผ๋กœ ์žก์•„์„œ ๋บ‘๋บ‘์ด๋ฅผ ๋งŽ์ด ๋Œ๋ฆฌ๋ฉด ๋‚˜์•„์งˆ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ•œ๊ณ„๋Š” ์กด์žฌํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์ธ ๋ฒกํ„ฐ ์ธ๋ฑ์Šค์—์„œ๋Š” NSW์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ฐœ์„ ๋œ ๋ฒ„์ „์ธ HNSW์„ ์‚ฌ์šฉํ•œ๋‹ค.




Skip List

HNSW๋Š” Skip List์˜ ํ™•๋ฅ  ๊ธฐ๋ฐ˜ ๊ณ„์ธต ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•๋ก ์„ ์‘์šฉํ•ด์„œ early stopping๊ณผ ๊ฐ™์€ ์ €์กฐํ•œ ์ •ํ™•๋„ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค. Skip List์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://blog.naver.com/sssang97/223801577003
๋‹ค๋งŒ ์ด๊ฑด ์•„์ด๋””์–ด๋งŒ ํ™œ์šฉํ•œ๊ฑฐ๊ณ  ์ง์ ‘์ ์ธ ๊ด€๋ จ์ด ์žˆ๋Š”๊ฑด ์•„๋‹ˆ๋‹ค




HNSW์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

HNSW๋Š” NSW์™€ ์ ‘๊ทผ๋ฐฉ์‹์ด ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€๋Š” ์•Š๋‹ค.
๋‹ค๋งŒ Hierarchical(๊ณ„์ธตํ˜•)์ด๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์€ ๊ฒƒ์ฒ˜๋Ÿผ, ๊ฐ๊ฐ์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

.png?type=w800) ๋‹ค๋งŒ ์ € ๋…ธ๋“œ๊ฐ€ ํ• ๋‹น๋  ๊ณ„์ธต(layer)๋Š” ๋”ฑํžˆ ์ •ํ•ด์ง„ ๊ทœ์น™ ์—†์ด ๋žœ๋ค์œผ๋กœ ์ •ํ•ด์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋†’์€ ๊ณ„์ธต์— ๋…ธ๋“œ๊ฐ€ ํ• ๋‹น๋  ํ™•๋ฅ ์€ ๊ฐˆ์ˆ˜๋ก ๋‚ฎ์•„์ง„๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๊ณ„์ธต 2์— ํ• ๋‹น๋  ํ™•๋ฅ ์ด ๊ณ„์ธต 0์— ํ• ๋‹น๋  ํ™•๋ฅ ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ์€ ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๊ณ„์ธต์ด ๋‚ฎ์•„์งˆ์ˆ˜๋ก ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋Š”, Tree์™€ ๋น„์Šทํ•œ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„ํฌ๋˜๋„๋ก ์œ ๋„ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๊ฒ€์ƒ‰ entrypoint๋Š” ์ตœ์ƒ์œ„ ๊ณ„์ธต์—๋งŒ ์žก๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.
์ตœ์ƒ์œ„ ๊ณ„์ธต์—์„œ ๋น„์Šทํ•œ๊ฒŒ ์žˆ์œผ๋ฉด ์ด๋™ํ•˜๊ณ , ๋น„์Šทํ•œ๊ฒŒ ์—†์–ด์„œ local minimum์— ๋„๋‹ฌํ•˜๋ฉด, ๊ทธ ํ•˜์œ„ ๊ณ„์ธต์— ์žˆ์œผ๋ฉด ๋‚ด๋ ค๊ฐ„๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์„œ ์ตœํ•˜์œ„ ๊ณ„์ธต์—์„œ local minimum์— ๋„๋‹ฌํ•˜๋ฉด ๊ทธ๊ฒŒ ๊ฒ€์ƒ‰์˜ ๋์ด๋‹ค.

์ด๋Ÿฐ ๊ท ํ˜•์žกํžŒ ํƒ์ƒ‰ ๊ตฌ์กฐ ๋•๋ถ„์— ์ข€ ๋” ๊ณ ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๊ณ , ์ •ํ™•๋„๋ฅผ NSW๋ณด๋‹ค๋Š” ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.




HNSW ๊ด€๋ จ ์šฉ์–ด

HNSW ๊ตฌํ˜„์ฒด์—์„œ๋Š” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋“ค์ด ์žˆ๋‹ค.
์ธ๋ฑ์Šค ์ƒ์„ฑ์‹œ์—๋Š” ๋ณดํ†ต ๋‹ค์Œ 2๊ฐ€์ง€ ์˜ต์…˜์ด ์กด์žฌํ•œ๋‹ค.

๊ฒ€์ƒ‰์‹œ์—๋Š” ๋ณดํ†ต ๋‹ค์Œ 2๊ฐ€์ง€ ์˜ต์…˜์ด ์กด์žฌํ•œ๋‹ค.




ํ•„ํ„ฐ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒกํ„ฐ ์ธ๋ฑ์Šค๋Š” ์‚ฌ์ „ ํ•„ํ„ฐ๋ง์„ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ์•Œ๋ ค์ ธ์žˆ์ง€๋งŒ, ๋ณ€ํ˜•์„ ์ข€ ๊ฐ€ํ•˜๋ฉด ๋ถˆ์™„์ „ํ•˜๊ฒŒ๋‚˜๋งˆ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๊ธด ํ•˜๋‹ค.
๊ทธ๋ž˜์„œ elasticsearch, qdrant, milvus ๋“ฑ ์ƒ๋‹น์ˆ˜์˜ HNSW ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ค์€ ๋ฒกํ„ฐ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰์— ํ•„ํ„ฐ๋ง์„ ๊ฑฐ๋Š” ๊ฒƒ์„ ์ง€์›ํ•œ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ qdrant์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ ๊ธ€์„ ์ฐธ์กฐํ•œ๋‹ค.
https://blog.naver.com/sssang97/223845582216




์‚ฌ์šฉ ์‚ฌ๋ก€

pgvector, elasticsearch, qdrant, milvus ๋“ฑ ๋งŽ์€ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ HNSW์„ ๊ธฐ๋ณธ ๋ฒกํ„ฐ ์ธ๋ฑ์Šค๋กœ ์ œ๊ณตํ•œ๋‹ค.



์ฐธ์กฐ
https://velog.io/@eenzeenee/neural-search-HNSW-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%84%A4%EB%AA%85
https://en.m.wikipedia.org/wiki/Hierarchical_navigable_small_world
https://qdrant.tech/articles/vector-search-filtering/
https://qdrant.tech/documentation/concepts/indexing/
https://pangyoalto.com/faiss-1-hnsw/
https://jerry-ai.com/30
https://www.pinecone.io/learn/series/faiss/hnsw/