본문 바로가기

ML/LLM

벡터 표현과 HNSW

구현에 대해서는 다음 포스팅을 참조하세요 : https://uiandwe.tistory.com/1398

 

1. 벡터화 과정

일반적으로 텍스트 데이터를 벡터로 만드는 과정은 다음과 같습니다.

 

1.  원천 데이터터에서 철자를 교정하고 불필요한 문자를 제거합니다. (소문자 변환, 토큰화, 특수문자 제거, 불용어 제거, 형태소 분석)

2. 전처리 후 텍스트에서 단어 임베팅 값을 추출합니다. (다차원 공간의 특정 위치에 단어를 매핑합니다.)

3. 임베팅 값은 벡터로 변환할수 있습니다. 벡터 차원의 특정한 특징에  중요도나 관련성을 반영합니다.

 

위의 과정을 통해 백터를 가지고 HNSW 알고리즘을 통해 벡터 사이의 근사값을 계산할 수 있습니다.

 

2. HNSW

https://arxiv.org/pdf/1603.09320

 

고차원 공간에서 HNSW 알고리즘을 활용하면 해당 텍스트를 기반으로 유사한 텍스트를 빠르게 찾는데 도움이 됩니다.

HNSW는 텍스트의 벡터에 대응하는 각 노드가 계층적 그래프를 구성합니다. 그래프는 작은 영역으로 구성되어, 고차원 공간에서의 검색을 수행합니다.

그래프 계층의 각 계층에서 그래프 노드 집합이 어떻게 연결되는지 보여주는 그림입니다. 그래프 노드는 nodeid가 직접 조회를 제공하는 벡터 데이터 구조에 저장됩니다. 문서당 여러 벡터를 인덱싱할 때, 텐서 필드 속성에서 벡터에 고유하게 액세스하기 위해 그래프 노드당 추가 메타데이터가 저장됩니다.

 

 

위의 그림에서 레이어별로 각각의 노드는 Small World를 구성합니다.  Small World 네트워크에서 대부분의 노드는 서로 이웃이 아니며, 적은 이동으로 다른 노드에 도달하게 됩니다.

고차원 공간에서 가장 가까운 이웃을 검색하는 전통적인 방법은 국소최소값에 갇힐수 있습니다. (Gradient Descent에서의 최소값 갱신 문제와 같습니다.)

HSNW는 그래프에 여러 레이러를 유지함으로써 이를 극복합니다. 검색시 HSNW는  적은 최상위 레이어에서 시작하여 보다 넓은 영역을 커버하면서 내려가며 정밀화를 통해 깊은 레이어에 도달합니다.

 

알고리즘은 이웃 노드 중에서 질의 노드와 더 가까운 노드가 없으면 검색이 멈춥니다. 이때 현재 탐색중인 레이어를 기준으로 가장 가까운(대략 가까운) 노드를 찾은 것으로 간주합니다.

 

이제 근처를 노드를 찾았으니, 가장 가까운 이웃을 검색하면 됩니다.

 

3. 거리측정법

- 유클리드 거리: 두 점 사이의 길이

- 내적 :  두 벡터 사이의 관계를 나타내는 산술 연산. 크기와 방향의 관계를 나타낸다.

- 코사인 유사도 : 두 벡터 간의 유사도를 측정하는 지표로, 각도에 기반합니다. 벡터의 크기가 아니라 방향(각도)에 초점.

 

벡터들의 방향과 크기는 데이터 세트 내 단어 간의 관계를 통해 실제 텍스트와 연관됩니다. 텍스트 벡터의 방향은 고차원 벡터 공간에서 텍스트 시맨틱의 방향성을 나타냅니다. 유사한 방향의 벡터는 의미가 유사한 텍스트를 나타내며, 비슷한 문맥이나 의미를 공유합니다. 즉 서로 관련있는 두 텍스트는 벡터 사이의 각도가 작습니다.

 

 

 

 

 

참조

https://blog.vespa.ai/semantic-search-with-multi-vector-indexing/

https://discuss.pytorch.kr/t/what-is-vector-similarity-search/2475