๊ฐ์
HNSW(Hierarchical Navigable Small World)๋ ๊ณ ์ฐจ์ ๋ฒกํฐ ๊ณต๊ฐ์์ ๊ทผ์ฌ ์ต๊ทผ์ ์ด์(Approximate Nearest Neighbor, ANN) ๊ฒ์์ ์ํํ๋ ๊ทธ๋ํ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ณ์ธต์ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ๋ก๊ทธ ๋ณต์ก๋์ ๊ฒ์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ๋น ๋ฅธ ๊ฒ์ ์๋์ ๋์ ์ฌํ์จ(recall)๋ก ํ๋ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ธ๋ฑ์ฑ ๋ฐฉ์ ์ค ํ๋๋ค.
๋ฐฐ๊ฒฝ๊ณผ ์ญ์ฌ
- HNSW๋ 2016๋ Yury Malkov์ Dmitry Yashunin์ด ๋ ผ๋ฌธ โEfficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphsโ์์ ๋ฐํํ๋ค.
- NSW(Navigable Small World) ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ๋ฅ ์ ์คํต ๋ฆฌ์คํธ(Probabilistic Skip List)์ ๊ฐ๋ ์ ๊ฒฐํฉํ์ฌ ๊ฐ๋ฐ๋์๋ค.
- Pinecone, Milvus, Weaviate, Vespa ๋ฑ ์ฃผ์ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฑํํ๊ณ ์๋ค.
- ์ค๊ฐ ํฌ๊ธฐ์ ๋ฒกํฐ ๋ฐ์ดํฐ์ ์์ ํนํ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ด๋ฉฐ, ๋ค์ํ ๋๋ฉ์ธ(์๋ฒ ๋ฉ ๊ฒ์, ์ถ์ฒ ์์คํ , ์ด๋ฏธ์ง ๊ฒ์ ๋ฑ)์์ ํ์ฉ๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ
๊ณ์ธต์ ๊ทธ๋ํ
HNSW๋ ์ฌ๋ฌ ๊ณ์ธต(layer)์ผ๋ก ๊ตฌ์ฑ๋ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค:
- ์ต์์ ๊ณ์ธต: ๊ฐ์ฅ ์ ์ ๋ ธ๋, ๊ฐ์ฅ ๊ธด ์ฐ๊ฒฐ(long-range links)
- ์ค๊ฐ ๊ณ์ธต: ์ ์ง์ ์ผ๋ก ๋ ธ๋ ์ ์ฆ๊ฐ
- ์ตํ์ ๊ณ์ธต: ๋ชจ๋ ๋ ธ๋ ํฌํจ, ๊ฐ์ฅ ์งง์ ์ฐ๊ฒฐ(short-range links)
๊ฐ ๋ ธ๋๋ ๋ฒกํฐ ํ๋๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ณ์ธต ๊ฐ ์ฐ๊ฒฐ์ ํตํด ๋น ๋ฅธ ํ์ ๊ฒฝ๋ก๋ฅผ ํ์ฑํ๋ค.
Small World ์์ฑ
- Small World ๋คํธ์ํฌ: ๋์ ํด๋ฌ์คํฐ๋ง ๊ณ์์ ์งง์ ํ๊ท ๊ฒฝ๋ก ๊ธธ์ด๋ฅผ ๊ฐ์ง ๋คํธ์ํฌ
- ์์ ๋คํธ์ํฌ์ โ6๋จ๊ณ ๋ถ๋ฆฌ ์ด๋ก โ๊ณผ ์ ์ฌํ ์๋ฆฌ
- ๊ธด ๊ฑฐ๋ฆฌ์ โ๋ฐ๋ก๊ฐ๊ธฐโ ์ฐ๊ฒฐ๊ณผ ์งง์ ๊ฑฐ๋ฆฌ์ ์ง์ญ ์ฐ๊ฒฐ์ ๋์์ ํ์ฉ
๊ฒ์ ์๊ณ ๋ฆฌ์ฆ
1. ์ง์ ์ ์ ํ
์ต์์ ๊ณ์ธต์ ์ง์ ์ (entry node)์์ ๊ฒ์ ์์
2. ํ์์ ๊ฒ์ (Greedy Search)
๊ฐ ๊ณ์ธต์์:
- ํ์ฌ ๋ ธ๋์ ์ด์ ์ค ์ฟผ๋ฆฌ ๋ฒกํฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋ ์ ํ
- ๋ ๊ฐ๊น์ด ๋ ธ๋๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณต
- ์ง์ญ ์ต์๊ฐ(local minimum)์ ๋๋ฌํ๋ฉด ๋ค์ ๊ณ์ธต์ผ๋ก ์ด๋
3. ๊ณ์ธต ํ๊ฐ
- ์์ ๊ณ์ธต: ๊ธด ์ฐ๊ฒฐ๋ก ๋น ๋ฅด๊ฒ ๋๋ต์ ์ธ ์์ญ ํ์
- ํ์ ๊ณ์ธต: ์งง์ ์ฐ๊ฒฐ๋ก ์ ๋ฐํ ์ต๊ทผ์ ์ด์ ํ์
4. ์ต์ข ๊ฒฐ๊ณผ
์ตํ์ ๊ณ์ธต์์ k๊ฐ์ ์ต๊ทผ์ ์ด์ ๋ฐํ
์ฃผ์ ํ๋ผ๋ฏธํฐ
M (์ฐ๊ฒฐ ์)
- ๊ฐ ๋ ธ๋๊ฐ ๊ฐ์ง ์ ์๋ ์ต๋ ์๋ฐฉํฅ ์ฐ๊ฒฐ ์
- ๋์์๋ก: ๋ ๋์ ์ฌํ์จ, ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
- ์ผ๋ฐ์ ๋ฒ์: 12~48
- ๊ธฐ๋ณธ๊ฐ: 16
efConstruction (๊ตฌ์ถ ์ ํ์ ํฌ๊ธฐ)
- ๊ทธ๋ํ ๊ตฌ์ถ ์ค ํ๋ณด ์ด์ ํ์ ๋ฒ์
- ๋์์๋ก: ๋ ๋์ ๊ทธ๋ํ ํ์ง, ๋ ๊ธด ๊ตฌ์ถ ์๊ฐ
- ์ผ๋ฐ์ ๋ฒ์: 100~500
efSearch (๊ฒ์ ์ ํ์ ํฌ๊ธฐ)
- ๊ฒ์ ์ค ํ์ํ ํ๋ณด ๋ ธ๋ ์
- ๋์์๋ก: ๋ ๋์ ์ฌํ์จ, ๋ ๊ธด ๊ฒ์ ์๊ฐ
- ๋์ ์ผ๋ก ์กฐ์ ๊ฐ๋ฅ
๋ณต์ก๋ ๋ถ์
์ฐ์ฐ | ์๊ฐ ๋ณต์ก๋ | ๊ณต๊ฐ ๋ณต์ก๋ |
---|---|---|
์ฝ์ | ||
๊ฒ์ | ||
์ญ์ | - |
- : ๋ฐ์ดํฐ์ ํฌ๊ธฐ
- : ์ฐ๊ฒฐ ์ ํ๋ผ๋ฏธํฐ
HNSW์ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ ๋น๊ต
์๊ณ ๋ฆฌ์ฆ | ๊ฒ์ ์๋ | ์ฌํ์จ | ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ | ๊ตฌ์ถ ์๊ฐ |
---|---|---|---|---|
HNSW | ๋งค์ฐ ๋น ๋ฆ | ๋์ | ๋์ | ๋ณดํต |
IVF (Inverted File) | ๋น ๋ฆ | ๋ณดํต | ๋ฎ์ | ๋น ๋ฆ |
NSW | ๋น ๋ฆ | ๋์ | ๋์ | ๋น ๋ฆ |
LSH (Locality Sensitive Hashing) | ๋ณดํต | ๋ณดํต | ๋ฎ์ | ๋งค์ฐ ๋น ๋ฆ |
Brute Force | ๋๋ฆผ | ์๋ฒฝ | ๋งค์ฐ ๋ฎ์ | ์์ |
์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ๋ก๊ทธ ๋ณต์ก๋์ ๋น ๋ฅธ ๊ฒ์ ์ฑ๋ฅ
- ๋์ ์ฌํ์จ (95~99% ์ด์ ๊ฐ๋ฅ)
- ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์์๋ ์ฑ๋ฅ ์ ์ง
- ๋์ ์ฝ์ /์ญ์ ์ง์
- ํ๋ผ๋ฏธํฐ ํ๋์ ํตํ ์ฑ๋ฅ-๋ฉ๋ชจ๋ฆฌ ํธ๋ ์ด๋์คํ ์กฐ์
๋จ์
- ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ (๊ฐ ๋ ธ๋๋น ๊ฐ์ ์ฐ๊ฒฐ ์ ์ฅ)
- ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ
- ๊ตฌ์ถ ์๊ฐ์ด ์๋์ ์ผ๋ก ๊ธธ ์ ์์
- ์์ ํ ์ ํ๋๋ฅผ ๋ณด์ฅํ์ง ์์ (๊ทผ์ฌ ์๊ณ ๋ฆฌ์ฆ)
์ต์ ํ ๋ฐ ๋ณํ
์์ถ ๊ธฐ๋ฒ
- Quantization: ๋ฒกํฐ๋ฅผ ์์ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ ๊ฐ
- Product Quantization (PQ): ๋ฒกํฐ๋ฅผ ์๋ธ๋ฒกํฐ๋ก ๋ถํ ํ์ฌ ์์ถ
- DiskANN: ๋์คํฌ ๊ธฐ๋ฐ ์ ์ฅ์ผ๋ก ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ง์
ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ
- HNSW + IVF: 1์ฐจ ํด๋ฌ์คํฐ๋ง ํ HNSW ์ ์ฉ
- HNSW + PQ: ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ๊ฒ์ ์ฑ๋ฅ ๊ท ํ
๊ตฌํ ์ ๊ณ ๋ ค ์ฌํญ
๋ฒกํฐ ์ ๊ทํ
- ์ฝ์ฌ์ธ ์ ์ฌ๋ ์ฌ์ฉ ์ ๋ฒกํฐ ์ ๊ทํ ๊ถ์ฅ
- L2 ๊ฑฐ๋ฆฌ ์ฌ์ฉ ์ ์ ๊ทํ ๋ถํ์
ํ๋ผ๋ฏธํฐ ํ๋ ์ ๋ต
-
M ์ ํ: ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ๊ณ ๋ ค
- ์๊ท๋ชจ (<100K): M=16
- ์ค๊ท๋ชจ (100K~1M): M=32
- ๋๊ท๋ชจ (>1M): M=48+
-
efConstruction: ๊ทธ๋ํ ํ์ง ์ฐ์ ์ ๋๊ฒ ์ค์
- ๋น ๋ฅธ ๊ตฌ์ถ: 100~200
- ๊ท ํ: 200~400
- ์ต๊ณ ํ์ง: 400~800
-
efSearch: ์ค์๊ฐ ์กฐ์ ๊ฐ๋ฅ
- ๋น ๋ฅธ ๊ฒ์: k * 1~2
- ๊ท ํ: k * 10~20
- ๋์ ์ฌํ์จ: k * 50~100
๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ ์ ํ
- L2 (Euclidean): ์ ๋ ๊ฑฐ๋ฆฌ ์ค์ ์
- IP (Inner Product): ๋ด์ ๊ธฐ๋ฐ ์ ์ฌ๋
- Cosine: ๋ฐฉํฅ ์ ์ฌ๋ (์ ๊ทํ๋ IP)
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- ์ธ๋ฉ๋ชจ๋ฆฌ vs. ๋์คํฌ ๊ธฐ๋ฐ ์ ์ฅ์ ์ ํ
- ๋ฒกํฐ ์์ถ ๊ธฐ๋ฒ ์ ์ฉ (PQ, Scalar Quantization)
- ๋ฐฐ์น ์ฝ์ ์ผ๋ก ๊ตฌ์ถ ํจ์จ์ฑ ํฅ์
๋ชจ๋ํฐ๋ง ์งํ
- ์ฌํ์จ(Recall): ์ ํ๋ ์ธก์
- QPS(Queries Per Second): ์ฒ๋ฆฌ๋
- P99 ๋ ์ดํด์: ์๋ต ์๊ฐ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ๋ฆฌ์์ค ํจ์จ์ฑ
ํ์ฉ ์ฌ๋ก
์๋งจํฑ ๊ฒ์
- ํ ์คํธ ์๋ฒ ๋ฉ ๊ธฐ๋ฐ ๋ฌธ์ ๊ฒ์
- ์ง์-์๋ต ์์คํ
- BM25์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์
์ถ์ฒ ์์คํ
- ์์ดํ ์ ์ฌ๋ ๊ธฐ๋ฐ ์ถ์ฒ
- ์ฌ์ฉ์ ์๋ฒ ๋ฉ ๋งค์นญ
์ด๋ฏธ์ง/๋น๋์ค ๊ฒ์
- ์๊ฐ์ ์ ์ฌ๋ ๊ฒ์
- ์ผ๊ตด ์ธ์
- ์ค๋ณต ๊ฐ์ง
๋ฉํฐ๋ชจ๋ฌ ๊ฒ์
- ํ ์คํธ-์ด๋ฏธ์ง ํฌ๋ก์ค ๊ฒ์
- CLIP ๋ฑ ๋ฉํฐ๋ชจ๋ฌ ์๋ฒ ๋ฉ ํ์ฉ
์ฐธ๊ณ ์๋ฃ
๋ ผ๋ฌธ ๋ฐ ํ์ ์๋ฃ
- Malkov, Y. A., & Yashunin, D. A. (2016). โEfficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphsโ - arXiv:1603.09320 - HNSW ์๋ ผ๋ฌธ
- Malkov, Y., Ponomarenko, A., et al. (2014). โApproximate nearest neighbor algorithm based on navigable small world graphsโ - Information Systems - NSW ์๊ณ ๋ฆฌ์ฆ ๋ ผ๋ฌธ
๊ธฐ์ ๋ฌธ์ ๋ฐ ํํ ๋ฆฌ์ผ
- Pinecone: HNSW Tutorial - HNSW ์๋ ์๋ฆฌ ๋ฐ FAISS ๊ตฌํ
- Milvus Blog: Understanding HNSW - HNSW ์ฌ์ธต ๋ถ์
- Weaviate: HNSW Index - ์ค๋ฌด ์ ์ฉ ๊ฐ์ด๋