47. 정리: Approximate k-Nearest Neighbor Search
• 아이템을 벡터로 표현하면 아이템 간 거리를 계산할 수 있음
• 아이템 간 거리 계산을 통해 가장 가까운 이웃을 찾을 수 있음
• 거리를 계산해야 할 대상이 너무 많으면 근사해서 빠르게 찾을 수 있음
• 대략 90%의 정확도로 100배 빠르게 찾을 수 있음
49. Annoy nmslib
장점
• MMAP 지원
• 쓰기 쉬움
• HNSW 알고리즘 지원
단점 • 성능이 아쉬움
• MMAP 미지원
• 불편한 interface
• 복잡한 설치과정
50. Annoy
• https://github.com/spotify/annoy
• Random projection + Tree
• 장점
• 적은 수의 hyper parameter
• Read-only MMaped data structure 지원
• 다수의 프로세스가 모델 파일을 공유할 수 있음
• 사용하기 쉬움
• 단점
• 최신 라이브러리들에 비해 떨어지는 성능(속도, 정확도)
64. TOROS N2
• https://github.com/kakao/n2
• 장점
• HNSW 알고리즘 지원
• MMAP 지원
• 빠른 Index Build 속도 (nmslib 대비 55% 빠름)
• 설치 & 사용 간편
• Python, Go binding
• 단점
• Search 속도는 nmslib이 빠름 (빌드 속도와 trade-off 가능)
67. nmslib (2017) nmslib(2018) n2(2017)
장점 • HNSW 알고리즘 지원
• HNSW 구현체 중 가
장 빠른 Search 속도
• HNSW 알고리즘 지원
• 빠른 Build 속도
• MMAP 지원
• 설치/인터페이스 간편
단점
• MMAP 미지원
• 불편한 interface
• 복잡한 설치과정
• MMAP 미지원
그 사이에 nmslib도 많이 좋아졌어요
69. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016.
Yu. A. Malkov, A. Ponomarenko, V. Krylov. Approximate nearest neighbor algorithm based on navigable small world graphs. 2014
HNSW (Hierarchical Navigable Small World graphs)
Navigable Small World graph (NSW)
Hierarchical NSW (HNSW)
71. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
• 노드 밀집도 증가
• 노드간 거리 감소
72. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
• 각 노드에 연결되는 엣지
최대 개수가 제한됨
> 로그 스케일 복잡도를 보장해줌
73. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
• 각 노드의 레벨은 Index build
타이밍에 랜덤으로 결정됨
• Layer=0에는 모든 노드가 존재
• 그 중 일부가 상위 레벨에도 존재
74. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
Level = 2 인 노드
Level = 1, 0 에도 노드가 존재함
75. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
Level = 1 인 노드
Level = 0 에도 노드가 존재함
76. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
Enter point
• Graph Traverse는
최상위 레이어에 있는
Enter point부터 시작
77. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
Query Vector
여기서부터 Traverse 시작
78. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
현재 Layer에서
Query vector와 가장 인접한
노드까지 이동
79. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
아래 Layer로 이동
80. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
현재 Layer에서
Query vector와 가장 인접한
노드까지 이동
81. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
아래 Layer로 이동
82. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
현재 Layer에서
Query vector와 가장 인접한
노드까지 이동
83. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
서울
부산
자갈치 시장
84. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
서울
부산
자갈치 시장
85. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
서울
부산
자갈치 시장
86. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small
World graphs. 2016. https://arxiv.org/abs/1603.09320
Layer = 0
Layer = 1
Layer = 2
서울
부산
자갈치 시장
97. 정리: TOROS N2
• https://github.com/kakao/n2
• 장점
• HNSW 알고리즘 지원
• 빠른 Index Build 속도 (nmslib 대비 55% 빠름)
• MMAP 지원
• 설치 & 사용 간편
• Python, Go binding
• Future work
• Search 속도 개선
• Build 할 때 메모리 더블링 이슈 해결
• 항상 k개 결과 보장하도록 개선