UMAP 0.6, 대규모 자료용 새 계산 경로 추가…기존 방식은 기본 유지
UMAP 개발자 Leland McInnes가 다차원 벡터를 낮은 차원의 지도에 배치하는 Python 도구 UMAP 0.6을 공개했습니다. 새 경로는 대규모 자료의 이웃 검색·초기 배치·좌표 최적화를 바꾸는 선택 기능이며, 기본값은 기존 0.5.x 방식입니다. 공식 문서의 arXiv 논문 308만 건 시험에서 새 경로는 64코어·약 500GB 메모리의 단일 머신으로 4분 38초가 걸렸고, 기존 경로 사례는 11분 31초였습니다. 두 실행의 설정은 달랐습니다.
UMAP 개발자 Leland McInnes가 버전 0.6을 공개했습니다. UMAP은 자료를 벡터로 나타낸 뒤, 가까운 자료가 낮은 차원의 지도에서도 이웃하도록 배치하는 Python 도구입니다. 0.6은 대규모 자료에서 이웃 검색과 시작 좌표 계산, 좌표 최적화를 바꾸는 새 계산 경로를 선택 기능으로 추가했습니다.
검색·초기 배치·좌표 최적화를 바꿨습니다
UMAP은 먼저 각 자료와 가까운 자료를 찾아 연결 관계를 그래프로 만들고, 이어 그 관계를 낮은 차원의 좌표에 옮깁니다. 새 경로는 이 세 단계 가운데 특히 이웃 검색과 초기 배치의 계산량을 줄이고, 좌표 최적화에는 병렬 처리와 재현성을 함께 지원하는 방식을 도입했습니다.
UMAP 공식 문서의 대규모 자료 시험은 2026년 6월 arXiv 논문 3,080,258건을 대상으로 했습니다. 논문 제목과 초록을 F2LLM-v2 8B 모델로 각각 4096차원 벡터로 바꾼 뒤, UMAP이 이를 2차원 좌표에 배치했습니다. 시험은 CPU 코어 64개와 약 500GB 메모리를 갖춘 단일 머신에서 진행됐습니다. Numba가 코드를 처음 컴파일하는 시간은 작은 자료를 미리 실행해 제외했습니다.
문서가 제시한 전체 실행 시간은 새 경로 4분 38초, UMAP 0.5 기본 경로 11분 31초입니다. 새 경로는 random_state=42와 repulsion_strength=8을 사용했고, 기존 경로는 시드 없이 기본 설정으로 실행했습니다. 따라서 두 시간은 같은 자료를 대상으로 한 각 경로의 예시 실행 결과이며 설정은 서로 달랐습니다.
이웃 검색 단계에서 새 경로는 탐색 트리 수와 후보 목록을 줄였습니다. 3,080,258개 벡터에서 이웃 15개를 찾는 데 기존 설정은 6분 40초, 새 설정은 1분 48초가 걸렸습니다. 대신 검색 결과의 포착률은 조금 낮아졌습니다. 무작위로 뽑은 논문 1,000편에 대해 원래 벡터 공간의 최근접 이웃 15개를 정확히 구해 기준으로 삼았을 때, 기존 설정은 그 이웃의 99.7%를 찾았고 새 설정은 98.7%를 찾았습니다. 이는 표본에서 기준 이웃을 얼마나 찾아냈는지를 나타내는 수치입니다.
시작 좌표를 정하는 초기화 방식도 달라졌습니다. 기존 스펙트럼 초기화는 큰 그래프 전체를 대상으로 계산해 배치를 정합니다. 새 재귀 초기화는 그래프를 반복해서 대략 4분의 1 크기로 줄이고, 작은 그래프부터 배치한 뒤 좌표를 다음 단계의 더 큰 그래프로 옮겨 짧게 최적화합니다. 이 과정을 원래 크기까지 반복해 시작 좌표를 만듭니다. 큰 그래프 전체의 구조를 한꺼번에 계산하는 대신, 작은 그래프의 배치를 점차 확장하는 방식입니다.
좌표 최적화기에는 Adam과 momentum이 추가됐습니다. 기존 최적화기는 계산된 힘을 좌표에 바로 적용했습니다. 여러 코어가 동시에 좌표를 바꾸면 갱신 순서가 달라질 수 있어, 같은 시드로 결과를 재현하는 실행은 한 스레드에서 이뤄졌습니다. 새 최적화기는 점마다 받은 힘을 모아 적용합니다. 이에 따라 같은 자료·설정·시드를 사용하면 결과를 재현하면서 여러 코어로 계산할 수 있습니다.
높은 반발력에서는 결과의 모양과 이웃 보존이 달라집니다
UMAP은 그래프에서 가까운 점을 끌어당기는 힘과, 표본으로 뽑은 다른 점을 밀어내는 힘을 함께 사용합니다. repulsion_strength를 높이면 각 영역 안에서 점이 더 퍼져 가까운 이웃 관계가 많이 남을 수 있지만, 큰 군집 사이의 분리는 약해질 수 있습니다. 기존 최적화기는 높은 반발력에서 군집이 여러 조각으로 찢어지는 경향을 보였고, 새 최적화기는 반발력의 상한을 부드럽게 조정하고 점별 힘의 균형을 맞춰 이를 줄였습니다.
문서는 반발력 8에서 두 경로를 비교했습니다. 무작위 표본 1만 편을 대상으로 원래 4096차원 공간의 이웃이 2차원 배치에 남는 비율을 계산했을 때, 15개 이웃 기준으로 기존 경로가 12.0%, 새 경로가 10.6%였습니다. 150개 이웃 기준으로는 기존 경로가 20.5%, 새 경로가 20.8%였습니다. arXiv 분류 영역별 분리도를 나타내는 실루엣 점수는 각각 0.12와 0.15였습니다. 따라서 가장 가까운 이웃 15개를 보존하는 수치는 기존 경로가 높았고, 더 큰 범위의 이웃과 분류 영역 분리 지표는 새 경로가 조금 높았습니다. 문서의 시각화에서는 기존 경로의 군집이 가는 조각과 실처럼 흩어진 반면, 새 경로는 해당 영역을 연결된 배치로 유지했습니다.
새 경로에는 대규모 자료에서 반발 표본을 고르는 hard-negative 샘플링도 들어갔습니다. 무작위로 뽑은 비이웃 점은 300만 자료 지도에서 대개 현재 점과 멀리 떨어져 있어, 좌표에 미치는 영향이 작습니다. 새 방식은 매 epoch마다 지도를 임의 방향으로 투영해 점을 정렬하고, 각 점 주변의 20만 점 후보 창에서 반발 표본을 뽑습니다. 가까운 점일수록 반발력이 크기 때문에 UMAP은 전체 힘의 균형에 맞춰 이 힘을 조정합니다. 자료가 20만 점보다 작으면 후보 창에 모든 점이 들어가 표본은 기존의 균일 무작위 방식으로 뽑힙니다.
이 샘플링은 계산 시간을 더 씁니다. 300만 자료 시험에서 반발력 8일 때 최적화 시간은 hard-negative 샘플링을 끄면 1분 40초, 켜면 2분 18초였습니다. 문서는 이 추가 시간에 대한 결과로 더 세밀한 배치 구조와 높은 반발력에서의 이웃 보존 개선을 제시했습니다.
UMAP 0.6은 새 경로로 결과가 달라질 수 있어 기존 동작을 기본으로 유지하는 전환 버전입니다. compatibility_layout을 설정하지 않으면 0.5.x 계산 경로가 사용되고, 향후 기본 경로 변경을 알리는 경고가 표시됩니다. compatibility_layout=False를 지정하면 재귀 초기화와 새 최적화기를 쓰는 경로로 전환합니다. McInnes는 향후 릴리스에서 재귀 초기화와 Adam 최적화기를 기본값으로 삼을 계획이라고 밝혔습니다. 배포판 이름은 umap-learn이며 pip와 conda-forge로 설치할 수 있습니다.
참고 자료
- UMAP 0.6: new initialization, new optimizers and faster performance [P]
- UMAP 0.6: new initialization, new optimizers and faster performance [P] : r/MachineLearning
- Embedding Very Large Datasets — umap 0.6.0 documentation
- Release Notes — umap 0.6.0 documentation
- Choosing a UMAP Layout Optimizer — umap 0.6.0 documentation