본문 바로가기

인공지능

벡터 DB에서 유사도 측정하기: 다양한 접근법과 활용

728x90
반응형

빅데이터 환경에서 데이터 간의 관계를 파악하고 검색하는 능력은 데이터 분석의 핵심입니다. 벡터 데이터베이스는 데이터를 벡터 형태로 저장하고, 벡터 간의 유사도를 계산하여 유사성을 평가하고 탐색합니다. 이번 글에서는 벡터 간 유사도를 측정하는 주요 방법과 각 방법의 특성 및 장단점을 논의하고자 합니다. 이러한 방법을 이해하면, 빅데이터 분석이나 인공지능 응용에서 데이터 유사성을 평가하고 효율적으로 탐색할 수 있는 기반을 마련할 수 있습니다.

반응형

1. L2 거리 (유클리드 거리)

개념 요약: L2 거리는 두 벡터 사이의 직선 거리를 측정하는 방식으로, 벡터의 크기와 방향을 모두 고려합니다. 물리적 거리나 실제 공간에서의 차이를 평가하는 데 적합합니다. 이는 벡터 간의 절대적 거리를 직관적으로 나타내며, 다양한 고차원 데이터에서 유용하게 사용됩니다.
적용 사례: 이미지 임베딩 비교, 객체 간의 물리적 거리 평가, 픽셀 기반 시각적 차이 분석 등 크기와 방향이 중요한 경우에 주로 사용됩니다. 예를 들어, 컴퓨터 비전 분야에서 얼굴 이미지 간의 유사도를 평가할 때 L2 거리는 이미지의 특징 벡터 사이의 물리적 차이를 계산하여 유사도를 평가하는 데 유용합니다.
장점: 고차원 데이터에서도 정확한 물리적 거리를 반영하여 이미지 매칭과 같은 작업에서 유용합니다. 벡터 크기와 방향을 모두 고려하기 때문에 실제 유사성을 정밀하게 판단할 수 있습니다. 또한, 직관적인 거리 개념을 사용하여 다양한 물리적 데이터 간의 비교에 효과적입니다.
단점: 벡터 크기의 차이를 그대로 반영하기 때문에 크기가 다른 벡터들 간의 유사도를 평가할 때 부정확할 수 있습니다. 고차원 공간에서 데이터가 희소할 경우, 거리 계산이 데이터의 유사성을 잘 반영하지 못할 가능성이 있습니다.
코드 예시:

import numpy as np
import faiss

embeddings = np.random.random((10000, 128)).astype('float32')
index = faiss.IndexFlatL2(128)
index.add(embeddings)
query = np.random.random((1, 128)).astype('float32')
D, I = index.search(query, k=5)
print("L2 거리 기반 가장 가까운 이웃:", I)

2. 내적 (Inner Product)

개념 요약: 내적은 두 벡터의 크기와 방향을 모두 반영하여 유사도를 측정합니다. 값이 클수록 유사성이 높음을 의미합니다. 이는 벡터의 방향과 크기를 동시에 평가하여 두 벡터 간의 유사성을 정량적으로 나타낼 수 있는 유용한 방법입니다.
적용 사례: 추천 시스템에서 사용자의 선호도를 바탕으로 아이템을 추천할 때 사용됩니다. 사용자의 임베딩과 아이템의 임베딩 간의 내적을 계산함으로써 사용자가 선호할 가능성이 높은 아이템을 찾아낼 수 있습니다. 내적을 통해 벡터 간의 유사성이 높은 순으로 아이템을 정렬하여 추천 결과를 도출합니다.
장점: 내적을 활용하면 사용자가 특정 아이템을 얼마나 선호하는지 평가할 수 있어 추천 정확도를 높이는 데 기여합니다. 또한, 크기와 방향을 모두 반영하므로 데이터 간의 관련성을 종합적으로 평가할 수 있습니다. 특히, 높은 차원의 임베딩에서 유사한 방향을 가진 벡터를 효과적으로 탐지할 수 있습니다.
단점: 벡터 크기 차이를 민감하게 반영하므로, 크기가 다를 경우 유사도가 왜곡될 수 있습니다. 크기를 정규화하지 않으면, 크기 차이가 유사도 평가에 과도한 영향을 미쳐 결과가 왜곡될 위험이 있습니다.
코드 예시:

import numpy as np
import faiss

data = np.array([
    [1.0, 2.0, 3.0],
    [4.0, 5.0, 6.0],
    [7.0, 8.0, 9.0]
], dtype=np.float32)
query = np.array([[2.0, 3.0, 4.0]], dtype=np.float32)
index_ip = faiss.IndexFlatIP(data.shape[1])
index_ip.add(data)
scores_ip, indices_ip = index_ip.search(query, k=2)
print("내적 기반 유사도 검색 결과:", indices_ip)

3. 코사인 유사도 (Cosine Similarity)

개념 요약: 코사인 유사도는 두 벡터의 각도를 사용해 유사도를 측정하며, 벡터의 크기는 무시합니다. 방향이 같을수록 값이 1에 가까워집니다. 이는 크기보다는 벡터의 방향에 중점을 두는 유사도 측정 방식입니다.
적용 사례: 텍스트 임베딩 비교, 문서 간 의미적 유사도 분석 등 방향만을 평가하는 데 유용합니다. 자연어 처리(NLP) 분야에서 두 문장이나 단어의 임베딩이 얼마나 유사한 의미를 가지는지 평가할 때 코사인 유사도가 자주 사용됩니다. 이는 단어의 의미적 유사성을 효과적으로 반영하여 정보 검색이나 텍스트 분류에 유용합니다.
장점: 크기와 무관하게 의미적 유사성을 비교할 수 있어 문서 검색 등에서 효과적입니다. 벡터 크기에 영향을 받지 않고 방향만을 고려하므로, 크기가 다른 벡터들 간에도 의미적인 유사도를 측정할 수 있습니다. 특히, 고차원 데이터에서도 각도 기반의 유사성 평가를 통해 효과적인 결과를 도출할 수 있습니다.
단점: 벡터 크기를 무시하므로 크기가 중요한 경우에는 부정확할 수 있습니다. 예를 들어, 특정 특징의 강도가 중요한 경우에는 코사인 유사도만으로는 충분한 정보를 제공하지 못할 수 있습니다.
코드 예시:

import numpy as np
import faiss

embeddings = np.random.random((10000, 128)).astype('float32')
faiss.normalize_L2(embeddings)
index = faiss.IndexFlatIP(128)
index.add(embeddings)
query = np.random.random((1, 128)).astype('float32')
faiss.normalize_L2(query)
D, I = index.search(query, k=5)
print("코사인 유사도 검색 결과:", I)

4. 자카드 유사도 (Jaccard Similarity)

개념 요약: 자카드 유사도는 두 집합 간 공통 요소의 비율을 측정하는 방식으로, 이진 벡터나 범주형 데이터에서 사용됩니다. 이는 집합 기반 데이터에서 각 데이터가 얼마나 비슷한지를 평가하는 데 적합합니다.
적용 사례: 태그 기반 검색, 고객 관심사 분석, 이진 속성 데이터 비교 등에 유용합니다. 예를 들어, 소셜 네트워크에서 사용자의 관심사 태그가 얼마나 일치하는지 평가할 때 자카드 유사도를 사용할 수 있습니다. 또한, 제품 추천 시스템에서 사용자가 좋아하는 제품과 유사한 특성을 가진 다른 제품을 추천할 때도 자카드 유사도가 사용될 수 있습니다.
장점: 이진 속성 데이터에서 공통 항목을 빠르게 비교할 수 있습니다. 각 항목 간의 교집합과 합집합을 통해 유사성을 계산하기 때문에 데이터의 특징을 간단히 비교할 수 있습니다. 계산이 직관적이고 이해하기 쉬워 범주형 데이터 비교에서 자주 사용됩니다.
단점: 교집합이 적을 경우 유사도가 낮게 나오며, 희소한 데이터에서는 유사도가 과소평가될 수 있습니다. 특히 데이터의 희소성이 높을 때는 합집합이 커져 유사도가 지나치게 낮아질 수 있는 한계가 있습니다.
코드 예시:

import numpy as np
import faiss

binary_embeddings = np.random.randint(2, size=(10000, 128)).astype('uint8')
index = faiss.IndexBinaryFlat(128)
index.add(binary_embeddings)
query = np.random.randint(2, size=(1, 128)).astype('uint8')
D, I = index.search(query, k=5)
jaccard_similarity = 1 - D / 128
print("자카드 유사도:", jaccard_similarity)
print("인덱스:", I)

유사도 측정 방식 요약 표

유사도 측정 방식정의적용 사례설명

내적 (Inner Product)두 벡터 간 내적 계산추천 시스템벡터의 크기와 방향이 유사할수록 높은 값
L2 거리두 벡터 간의 거리 계산이미지 매칭절대적 거리를 측정
코사인 유사도두 벡터 간 각도 계산문서 유사도 분석방향만 고려하여 유사성 측정
자카드 유사도두 집합의 공통 요소 비율태그 기반 비교집합적 유사성 평가

728x90

결론

벡터 간 유사도 측정은 각 방법마다 특유의 장점이 있습니다. 내적은 추천 시스템에서 사용자의 선호도를 평가하는 데 유용하며, L2 거리는 이미지 매칭과 같은 물리적 유사도 평가에 적합합니다. 코사인 유사도는 문서나 텍스트의 의미적 유사성을 분석하는 데 효과적이며, 자카드 유사도는 이진 데이터 비교에서 유용합니다. 이러한 유사도 측정 방법을 적절히 사용하면 데이터 분석의 정확성을 높일 수 있으며, 각 데이터의 특성을 효과적으로 반영한 결과를 도출할 수 있습니다. 최적의 유사도 측정 방식을 선택함으로써, 다양한 도메인에서 효율적이고 신뢰성 높은 데이터 분석을 수행할 수 있습니다.

728x90
반응형