알고리즘 파라미터 — ef, M, ef_construction
알고리즘 파라미터 — ef, M, ef_construction
hnswlib을 실제로 튜닝하려면 세 파라미터를 이해하는 게 핵심이에요. ef는 검색 시간·정확도 트레이드오프를, M과 ef_construction은 인덱스 구성 비용·품질을 조절해요.
출처: https://github.com/nmslib/hnswlib/blob/master/ALGO_PARAMS.md
Search parameters (검색 파라미터)
ef— 검색 중 사용하는 최근접 이웃 후보 리스트(dynamic list)의 크기예요.ef가 클수록 정확도는 높아지지만 검색은 느려져요.ef는 조회하는 최근접 이웃 수k보다 작을 수 없고,k부터 데이터셋 크기 사이의 값이면 돼요.k— 결과로 반환할 최근접 이웃의 수예요.knn_query는k개 최근접 요소의 labels와 distances를 담은 두 개의 numpy 배열을 반환해요. 그래프 문제나k가 데이터셋 크기보다 클 때처럼k개를 못 찾으면 예외를 던져요.
Construction parameters (구성 파라미터)
M— 새 요소가 추가될 때 만들어지는 양방향 링크의 수예요. 합리적 범위는 2~100이에요. 고차원 데이터셋이거나 높은 recall이 필요하면 큰M이 좋고, 낮은 차원·낮은 recall에서는 작은M이 좋아요. 메모리 사용량은 대략M * 8-10바이트 per element예요. 예를 들어dim=4랜덤 벡터에서는M6 근처가 최적이지만, 워드 임베딩처럼 고차원이면M=48-64가 필요할 수 있어요. 대부분의 경우M=12-48범위면 충분해요. 대략M * ef_construction이 상수라고 보고ef와ef_construction을 추정하면 돼요.ef_construction—ef와 같은 의미지만 인덱스 구성 시간과 인덱스 품질을 조절해요. 클수록 구성은 오래 걸리지만 인덱스 품질이 좋아져요. 어느 시점 이후로는 커져도 품질이 개선되지 않아요.ef = ef_construction으로 M 최근접 이웃 검색 recall을 재서 0.9보다 낮으면 개선 여지가 있다고 보면 돼요.num_elements— 인덱스의 최대 요소 수를 정의해요. 인덱스는 저장/로드(load_index의 파라미터로 새 최대값 지정)로 확장할 수 있어요.
더 알아보기
- https://github.com/nmslib/hnswlib/blob/master/ALGO_PARAMS.md — 알고리즘 파라미터
- https://github.com/nmslib/hnswlib — hnswlib 저장소