이 페이지에서는 Spanner에서 제공하는 벡터 거리 함수 중에서 선택하여 벡터 임베딩 간의 유사성을 측정하는 방법을 설명합니다.
Spanner 데이터에서 임베딩을 생성한 후에는 벡터 거리 함수를 사용하여 유사성 검색을 수행할 수 있습니다. 다음 표에서는 Spanner의 벡터 거리 함수에 대해 설명합니다.
함수 | 설명 | 수식 | 유사성 증가와의 관계 |
---|---|---|---|
내적 | 해당 벡터 크기의 곱을 곱한 각도 \(\theta\) 의 코사인 값을 계산합니다. | \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) | 증가 |
코사인 거리 | 코사인 거리 함수는 1(cosine_distance() = 1 - cosine similarity )에서 코사인 유사성을 뺍니다. 코사인 유사성은 두 벡터 간 각도 \(\theta\) 의 코사인을 측정합니다.
|
1 - \(\frac{a^T b}{|a| \cdot |b|}\) | 감소 |
유클리드 거리 | 두 벡터 간의 직선 거리를 측정합니다. | \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) | 감소 |
유사성 측정 선택
모든 벡터 임베딩이 정규화되었는지 여부에 따라 유사성을 찾는 데 사용할 유사성 측정을 결정할 수 있습니다. 정규화된 벡터 임베딩의 크기(길이)는 정확히 1.0입니다.
또한 모델이 어떤 거리 함수로 학습되었는지 알고 있다면 해당 거리 함수를 사용하여 벡터 임베딩 간의 유사성을 측정할 수 있습니다.
정규화된 데이터
모든 벡터 임베딩이 정규화된 데이터 세트가 있다면, 세 함수 모두 동일한 시맨틱 검색 결과를 제공합니다. 기본적으로 각 함수는 서로 다른 값을 반환하지만 해당 값은 동일한 방식으로 정렬됩니다. 임베딩이 정규화될 때는 일반적으로 DOT_PRODUCT()
가 가장 계산 효율적이지만 대부분의 경우 그 차이는 무시할 수 있을 정도입니다. 하지만 애플리케이션이 성능에 매우 민감한 경우 DOT_PRODUCT()
가 성능 조정에 도움이 될 수 있습니다.
비정규화된 데이터
벡터 임베딩이 정규화되지 않은 데이터 세트가 있는 경우 함수로서 내적에서 거리를 측정하지 않기 때문에 DOT_PRODUCT()
를 거리 함수로 사용하는 것은 수학적으로 올바르지 않습니다. 임베딩이 생성된 방법과 원하는 검색 유형에 따라 COSINE_DISTANCE()
또는 EUCLIDEAN_DISTANCE()
함수에서 다른 함수보다 주관적으로 더 나은 검색 결과를 생성할 수 있습니다.
사용 사례에 가장 적합한 방식을 결정하려면 COSINE_DISTANCE()
또는 EUCLIDEAN_DISTANCE()
를 실험해야 할 수 있습니다.
데이터가 정규화되었는지 또는 비정규화되었는지 확실하지 않음
데이터가 정규화되었는지 여부가 확실하지 않고 DOT_PRODUCT()
를 사용하려는 경우 대신 COSINE_DISTANCE()
를 사용하는 것이 좋습니다.
COSINE_DISTANCE()
는 정규화가 내장된 DOT_PRODUCT()
와 같습니다.
COSINE_DISTANCE()
를 사용하여 측정한 유사성의 범위는 -1
~1
입니다. 결과가 0
에 가까우면 벡터가 매우 유사하다는 것을 나타냅니다.
다음 단계
- k-최근접 이웃을 찾아 벡터 검색을 수행하는 방법 자세히 알아보기
- Vertex AI 벡터 검색으로 임베딩 내보내기 방법 알아보기
- GoogleSQL
COSINE_DISTANCE()
,EUCLIDEAN_DISTANCE()
, 및DOT_PRODUCT()
함수 자세히 알아보기 - PostgreSQL
spanner.cosine_distance()
,spanner.euclidean_distance(), and spanner.dot_product()
함수 자세히 알아보기