데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      대용량 벡터 검색 라이브러리, Faiss를 소개합니다.

      박병선(알파를찾아서) 24.05.03
      32,874 10 5
      DEVOTEE 요약
      빅데이터를 다루기 위해서는 텍스트, 이미지, 소리 등의 비정형 데이터를 기계가 이해할 수 있는 연속형 수치인 벡터로 변환하는 인코딩 과정이 필요합니다. 이렇게 생성된 컨텍스트 벡터를 벡터 공간에 효율적으로 투영하고, 유사도 기반 검색을 위해 Faiss라는 라이브러리를 사용할 수 있습니다. Faiss는 Facebook에서 개발한 벡터의 유사도 측정과 클러스터링에 최적화된 라이브러리로, GPU 지원과 C++ 개발로 인해 대용량 데이터 처리에 매우 빠르고 효율적입니다.
      DEVOTEE 추천 블로그

      늘어나는 빅데이터는 대용량 Vector Space로 이어져..

      Text, Image, Sound 등 다양한 비정형 정보원을 데이터로써 다룰 때, 먼저 고민하는 부분은 Machine이 이해할 수 있는 연속형 수치, 즉 Vector로 변환하는 것에 대해서 입니다.

      다양한 Modality에 담겨있는 맥락과 정보를 함축한 Context Vector를 어떻게 잘 만들까 에 대한 고민이죠, 흔히 인코딩이라고 불리는 작업입니다.

      image.png

      좋은 인코딩을 통해 Context Vector들을 하나의 Vector Space에 투영했다면, 그 다음엔 이것을 어떻게 잘 활용할까 에 대한 고민이 뒤따릅니다.

      Embedding 작업이 잘 되었다면 하나의 Vector Space안에서는 맥락이 유사한 Vector들은 가까이 위치하게 됩니다.

      이를 활용해서 유사도 기반의 검색(retrieval) 서비스를 제공할 수 있습니다.

      이때 유사도는 주로 거리 기반의 유클리드 거리(Euclidean distance)와 각도 기반의 코사인 유사도(cosine similarity)를 통해 측정하며,

      흔히 최근접 이웃(K-Nearest Neighbors) 알고리즘을 활용하여 검색시 k개의 유사한 결과를 출력합니다.

      image.png

      [Cosine similarity vs Euclidean distance]


      하지만 점차 늘어나는 대용량 데이터에 따라 Vector Space 내 검색을 위한 연산 비용은 기하급수적으로 늘어날 수 밖에 없습니다.

      이때 고민해 볼 수 있는 라이브러리, Faiss를 소개해 드립니다.


      What is Faiss?

      Faiss는 Facebook에서 개발 및 배포한 밀집 벡터의 유사도 측정과 클러스터링에 효율적인 라이브러리입니다.

      보통 벡터 유사도(vector similarity)를 구할 때는 numpy나 scikit-learn에서 제공해주는 cosine similarity등 을 많이 사용하는데,

      GPU를 지원하며, C++로 개발된 덕분에 Faiss를 사용하면 훨씬 빠르고 강력하게 유사도를 측정할 수 있습니다.

      image.png

      Quick Start


      본 Demo에서는 Google Colab을 활용하였으며,

      설치는 CPU와 GPU에 따라 다음 구분을 통해 install 할 수 있습니다.

      # CPU instance with colab
      #!apt install libomp-dev
      #!pip install faiss
      
      # GPU instance with colab
      !pip install faiss-gpu

      Demo를 위해 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)


      cosine similarity로 유사도 산출하려면..

      코사인 유사도를 통해 유사도를 계산하고자 한다면, 역시 너무나 간단합니다.

      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)


      별도의 사용자 정의 index와 사용하고 싶다면..

      한가지 더 알고 있으면 좋은 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를 살펴보았는데, 도움이 되시길 바라는 마음으로 글을 마칩니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      박병선(알파를찾아서) 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기