KNN(K-Nearest Neighbors, K-최근접 이웃)은 기계 학습과 정보 검색, 벡터 DB 등 다양한 분야에서 자주 사용되는 가장 직관적인 분류 및 검색 알고리즘 중 하나입니다. 이름 그대로 "K개의 가장 가까운 이웃"을 찾아내는 것이 핵심입니다.
KNN은 다음과 같은 아이디어에 기반합니다:
이때의 핵심은 "가깝다"는 것이 무엇인가를 정의하는 거리 측정 방식입니다.
KNN에서 두 데이터 간의 거리를 측정하는 방식은 문제의 성격에 따라 달라질 수 있습니다. 대표적인 거리(또는 유사도) 측정 방식은 다음과 같습니다:
거리 또는 유사도 방식 | 설명 |
---|---|
유클리드 거리 | 가장 기본적인 거리로, 두 점 사이의 직선 거리 |
코사인 유사도 | 두 벡터가 이루는 각도를 기준으로 유사도 계산 (특히 고차원에서 유용) |
내적(dot product) | 두 벡터의 방향성과 크기를 함께 고려 |
망할망정 거리(Manhattan distance) | 축을 따라 이동한 거리의 합 (택시 거리라고도 불림) |
벡터 DB에서는 보통 코사인 유사도나 유클리드 거리가 많이 사용됩니다. 사용자의 검색 쿼리를 벡터로 변환하고, 전체 데이터 중에서 이 쿼리 벡터와 가장 가까운 벡터를 찾아내는 데 활용됩니다.
벡터 데이터베이스 검색
예를 들어 문장을 임베딩하여 벡터로 바꾸고, 유사한 문장을 찾고 싶다면? → 쿼리 벡터와 가장 가까운 벡터를 찾아주는 KNN을 사용합니다.
추천 시스템
사용자와 유사한 취향을 가진 K명의 다른 사용자를 찾아 그들이 좋아한 아이템을 추천합니다.
이미지 검색
쿼리 이미지와 임베딩 공간에서 가까운 이미지들을 K개 골라냅니다.
지도 학습 (분류)
어떤 입력 데이터를 주고, 주변의 K개 라벨을 확인한 후, 다수결로 라벨을 결정합니다.
장점 | 단점 |
---|---|
구현이 매우 단순하다 | 데이터가 많을수록 검색 속도가 느려질 수 있다 |
훈련 과정이 없다 (Lazy Learning) | 고차원에서는 성능이 떨어질 수 있다 (차원의 저주) |
다양한 유사도 함수를 적용할 수 있다 | 메모리를 많이 차지한다 |
이러한 단점 때문에 벡터 DB에서는 일반적인 KNN이 아니라, 더 빠른 근사 KNN(Approximate KNN, aKNN) 알고리즘들이 사용됩니다. 예: HNSW, IVF, PQ 등
KNN은 매우 단순하지만, 그만큼 강력한 직관을 제공합니다. 벡터 DB가 하는 일도 결국은 같은 원리입니다. 사용자의 검색이나 질문을 벡터로 바꾸고, 이 벡터와 가장 가까운 벡터들을 찾아내는 작업. 그것이 바로 KNN의 응용입니다.