query와 passage의 similarity search를 근사(approximation)시키는 법
1. scalar quantization
벡터를 압축하여 하나의 벡터가 원래보다 더 적은 용량을 차지하도록 compression하는 기술
당연하지만 압축량이 커질수록 요구되는 메모리공간은 작아지지만 그만큼 정보손실도 커진다
일반적으로 벡터 내 수치는 float32로 저장함
SQ8은 4byte float32를 1byte int8이나 float8???로 저장하는 방식(quantization이면 int8이 더 어울리긴해)
그러면서 한 값의 저장용량을 1/4로 줄인다
강의에서는 4byte float32를 1byte unsigned int8로 압축한다고 나와있네
각 수치가 4byte에서 1byte로 줄어들면서 크기가 줄어든것을 볼수 있음
보통 inner product에서 float32까지 필요한 경우는 많지 않아서
1byte로 approximation해서 계산해도 거의 대부분 정확해서 SQ8로 approximation을 많이 한다.
2. pruning - inverted file
vector space 상 벡터들을 정해진 cluster로 소속시켜 군집화를 일으킴
clustering된 vector space에 query가 들어오면 query와 가까운 군집들을 찾음
그러면 가까운 군집들의 내부에 있는 모든 passage vector들과만 inner product search를 수행함
먼 cluster의 점들은 top k내에 들어갈리가 없으니 cluster가 잘 되어있으면 query보다 먼 cluster는 굳이 볼 필요가 없다
예를 들어 100만개의 passage vector가 있고 1000개로 clustering되어 있으면 들어온 query가 10개 cluster와 가까운 경우
원래는 100만개 passage 모두와 inner product를 해봐야하지만 10개 cluster 내부의 vector들과만 inner product를 하여 approximation할 수 있다는 것
cluster내 vector수가 모두 동일하면 속도는 거의 100배차이겠지
네모로 된 query가 들어오면 가까운 군집(그림에서는 3곳)의 vector들과만 inner product를 통해 similarity를 검사함
3. 구체적인 IVF 방법
주어진 passage embedding vector space에서 k-means clustering을 수행함
만약 새로운 document vector가 들어오면 cluster에 소속시키면 된다
cluster한 것이 pruning처럼 전체 공간을 quantization하는 느낌임
위에서 passage vector들은 indexing되어 저장된다고 했잖아
각 cluster내에 passage vector들이 index로 연결되어 있는데 이것을 inverted file이라고 부름
이제 query가 들어오면 query와 가까운 cluster를 찾는다
cluster와 query의 사이 거리는 보통 cluster의 centroid와의 거리를 의미함
가까운 centroid를 적절하게 찾았으면 그 centroid와 연결된 inverted list 내의 passage vector들과만
inner product search를 하여 query와 가장 연관된 top k similar passage들을 찾는다
search space가 상당히 줄어들어 검색 속도가 상당히 증가함
'딥러닝 > Machine Reading Comprehension' 카테고리의 다른 글
Open domain question answering 개요 (0) | 2024.03.29 |
---|---|
passage의 indexing을 도와주는 FAISS 라이브러리 소개 (0) | 2024.03.21 |
질문과 관련있는 지문을 찾는 Maximum Inner Product Search (0) | 2024.03.20 |
BERT와 BART 비교하면서 간단하게 알아보기(+greedy, beam, exhaustive search) (0) | 2024.03.06 |
generation based MRC 모델링 방법 간단하게 알아보기 (0) | 2024.03.05 |