23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Text, Image, Sound 등 다양한 비정형 정보원을 데이터로써 다룰 때, 먼저 고민하는 부분은 Machine이 이해할 수 있는 연속형 수치, 즉 Vector로 변환하는 것에 대해서 입니다.
다양한 Modality에 담겨있는 맥락과 정보를 함축한 Context Vector를 어떻게 잘 만들까 에 대한 고민이죠, 흔히 인코딩이라고 불리는 작업입니다.
좋은 인코딩을 통해 Context Vector들을 하나의 Vector Space에 투영했다면, 그 다음엔 이것을 어떻게 잘 활용할까 에 대한 고민이 뒤따릅니다.
Embedding 작업이 잘 되었다면 하나의 Vector Space안에서는 맥락이 유사한 Vector들은 가까이 위치하게 됩니다.
이를 활용해서 유사도 기반의 검색(retrieval) 서비스를 제공할 수 있습니다.
이때 유사도는 주로 거리 기반의 유클리드 거리(Euclidean distance)와 각도 기반의 코사인 유사도(cosine similarity)를 통해 측정하며,
흔히 최근접 이웃(K-Nearest Neighbors) 알고리즘을 활용하여 검색시 k개의 유사한 결과를 출력합니다.
[Cosine similarity vs Euclidean distance]
하지만 점차 늘어나는 대용량 데이터에 따라 Vector Space 내 검색을 위한 연산 비용은 기하급수적으로 늘어날 수 밖에 없습니다.
이때 고민해 볼 수 있는 라이브러리, Faiss를 소개해 드립니다.
Faiss는 Facebook에서 개발 및 배포한 밀집 벡터의 유사도 측정과 클러스터링에 효율적인 라이브러리입니다.
보통 벡터 유사도(vector similarity)를 구할 때는 numpy나 scikit-learn에서 제공해주는 cosine similarity등 을 많이 사용하는데,
GPU를 지원하며, C++로 개발된 덕분에 Faiss를 사용하면 훨씬 빠르고 강력하게 유사도를 측정할 수 있습니다.
본 Demo에서는 Google Colab을 활용하였으며,
설치는 CPU와 GPU에 따라 다음 구분을 통해 install 할 수 있습니다.
# CPU instance with colab
#!apt install libomp-dev
#!pip install faiss
# GPU instance with colab
!pip install faiss-gpuDemo를 위해 200*300의 가상의 Vector space를 만들어보죠.
np.random.seed(10)
vector_data = np.random.rand(200, 300).astype('float32') 사용법은 너무나 쉽습니다.
Vector space의 차원수를 넘겨주면서, IndexFlatL2 해주면 L2, 즉 유클리드 거리를 기반으로 Indexing을 하겠다는 설정입니다.
이후 데이터를 add해주면 indexing이 이루어 집니다.
vector_dimension = vector_data.shape[1]
index = faiss.IndexFlatL2(vector_dimension)
index.add(vector_data)이후 검색할 search vector를 지정하고, 가장 가까운 10개를 찾아줘라는 의미인 k=10과 함께 index.search 구문을 실행하면
검색 결과가 distance엔 거리 계산값이 indices엔 index가 담겨 반환됩니다.
# set search vector
search_vector = vector_data[8].reshape(1,-1)
# search
k = 10 # 유사도 검색할 k
distance, indices = index.search(search_vector.reshape(1,-1),k)코사인 유사도를 통해 유사도를 계산하고자 한다면, 역시 너무나 간단합니다.
IndexFlatL2 대신 IndexFlatIP 을 활용하면 되는데, 여기서 IP는 짐작하시다시피 코사인 유사도와 밀접한 Inner Product, 내적을 의미합니다.
원할한 코사인 유사도 산출을 위해서 data를 add해 주기전 normalize 해주는 것 정도 유의하면 간편하게 활용할 수 있습니다.
vector_dimension = vector_data.shape[1]
index = faiss.IndexFlatIP(vector_dimension)
faiss.normalize_L2(vector_data)
index.add(vector_data)한가지 더 알고 있으면 좋은 tip은 보통 Vector Space를 다룰 때 lookup table을 두는 경우가 많은데,
원본 데이터의 각종 카테고리, 코드 등 부가 정보와 생성한 Vector와의 매핑을 위해서이죠.
그럼 이렇게 유사도 기반 Indexing을 할 때에도 원래의 데이터를 찾아가기 위한 index를 함께 넘겨주면 활용에 있어 풍부해 질 것입니다.
아래처럼 ids 에 넘겨줄 index list를 주고, 이를 add_with_ids 구문과 함께 indexing하면 됩니다.
그러면 검색 결과로 내가 부여한 index가 반환 되게 되어 자유도 높게 작업을 진행할 수 있습니다.
# FAISS의 Index로 넘겨주기 위한 object
ids = ...
# 사용자정의 Index와 함께 사용..
vector_dimension = vector_data.shape[1]
index = faiss.IndexFlatL2(vector_dimension)
index = faiss.IndexIDMap2(index)
index.add_with_ids(x=vector_data, ids=ids)간략하게 유사도 기반의 대용량 벡터 검색 라이브러리 Faiss를 살펴보았는데, 도움이 되시길 바라는 마음으로 글을 마칩니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.