알고리즘 파라미터 — ef, M, ef_construction

알고리즘 파라미터 — ef, M, ef_construction

hnswlib을 실제로 튜닝하려면 세 파라미터를 이해하는 게 핵심이에요. ef는 검색 시간·정확도 트레이드오프를, Mef_construction은 인덱스 구성 비용·품질을 조절해요.

출처: https://github.com/nmslib/hnswlib/blob/master/ALGO_PARAMS.md

Search parameters (검색 파라미터)

  • ef — 검색 중 사용하는 최근접 이웃 후보 리스트(dynamic list)의 크기예요. ef가 클수록 정확도는 높아지지만 검색은 느려져요. ef는 조회하는 최근접 이웃 수 k보다 작을 수 없고, k부터 데이터셋 크기 사이의 값이면 돼요.
  • k — 결과로 반환할 최근접 이웃의 수예요. knn_queryk개 최근접 요소의 labels와 distances를 담은 두 개의 numpy 배열을 반환해요. 그래프 문제나 k가 데이터셋 크기보다 클 때처럼 k개를 못 찾으면 예외를 던져요.

Construction parameters (구성 파라미터)

  • M — 새 요소가 추가될 때 만들어지는 양방향 링크의 수예요. 합리적 범위는 2~100이에요. 고차원 데이터셋이거나 높은 recall이 필요하면 큰 M이 좋고, 낮은 차원·낮은 recall에서는 작은 M이 좋아요. 메모리 사용량은 대략 M * 8-10 바이트 per element예요. 예를 들어 dim=4 랜덤 벡터에서는 M 6 근처가 최적이지만, 워드 임베딩처럼 고차원이면 M=48-64가 필요할 수 있어요. 대부분의 경우 M=12-48 범위면 충분해요. 대략 M * ef_construction이 상수라고 보고 efef_construction을 추정하면 돼요.
  • ef_constructionef와 같은 의미지만 인덱스 구성 시간과 인덱스 품질을 조절해요. 클수록 구성은 오래 걸리지만 인덱스 품질이 좋아져요. 어느 시점 이후로는 커져도 품질이 개선되지 않아요. ef = ef_construction으로 M 최근접 이웃 검색 recall을 재서 0.9보다 낮으면 개선 여지가 있다고 보면 돼요.
  • num_elements — 인덱스의 최대 요소 수를 정의해요. 인덱스는 저장/로드(load_index의 파라미터로 새 최대값 지정)로 확장할 수 있어요.

더 알아보기