Faiss 입문
6566 단어 머 신 러 닝 여행
다 중 탐지 기반 의 파 티 션 기반 방법 을 사용 합 니 다.
특징 공간 은 ncells 의 셀 로 나 뉜 다.해시 함수 (k 평균치 의 경우 검색 에 가장 가 까 운 질량 심 에 대한 배분) 로 인해 데이터 베 이 스 는 이 단원 들 중 하나 에 배분 되 고 ncells 역방향 목록 으로 형 성 된 역방향 파일 구조 에 저 장 됩 니 다.조회 할 때 nprobe 개의 역방향 목록 을 선택 하여 이 목록 에 분 배 된 모든 데이터 베 이 스 를 비교 합 니 다. 일부 데이터 베 이 스 는 조회 와 비교 합 니 다. 첫 번 째 유사 값 으로 이 비율 은 nprobe / ncells 입 니 다. 그러나 이 유사 치 는 보통 과소평가 되 고 역방향 목록 의 길이 가 같 지 않 기 때 문 입 니 다.주어진 검색 의 최근 이웃 의 셀 을 선택 하지 않 으 면 실패 사례 가 표 시 됩 니 다.
C + + 에서 상응하는 인덱스 는 인덱스 인덱스 인덱스 IVFFlat 입 니 다.
구조 함 수 는 색인 을 매개 변수 로 반전 목록 에 값 을 부여 합 니 다.이 색인 에서 검색 하고 되 돌아 오 는 벡터 id (s) 는 방문 해 야 할 역방향 목록 입 니 다.
주의: 경험 에 따 르 면 n 은 색인 되 어야 할 점 의 수량 을 표시 합 니 다. 일반적으로 적당 한 질량 의 수량 을 확정 하 는 방법 은 '질량 의 지출 (순수한 kmeans: ncentroids * d 라면)' 과 '반전 목록 을 분석 할 때 실 행 된 정확 한 거리 계산 수량 입 니 다.(kprobe / ncells * n * C 의 순서에 따라 상수 C 는 목록 의 불 균형 분 포 를 고려 하고 질량 심 비 처 리 를 사용 할 때 하나의 벡터 가 비교적 효과 적 인 사실 을 고려 했다. 예 를 들 어 C = 10) '간 에 균형 을 찾 았 다.
이 로 인해 많은 질량 의 수량 이 ncentroids = C * sqrt (n) 를 따 르 게 되 었 다.
메모: 엔진 덮개 아래 에서 IndexIVFKmeans 와 IndexIVFSphericalKmeans 는 대상 이 아니 라 정확하게 설 정 된 IndexIVFFlat 대상 의 함 수 를 되 돌려 줍 니 다.
경고: 구역 구분 방법 은 차원 의 저 주 를 받 기 쉽다. 진정한 고 차원 데이터 에 대해 좋 은 리 콜 을 실현 하려 면 매우 많은 프로 브 가 필요 하 다.
tar -xvf OpenBLAS-0.3.2.tar.gz
cd OpenBLAS-0.3.2
make
make PREFIX=/usr/local/ install
yum install lapack-devel.x86_64 -y
./configure -with-blas="-L/usr/local/lib -lopenblas -llapack -lgfortran -lpthread" --without-cuda
make && make install
3. 핵심 API 설명
faiss::MultiIndexQuantizer coarse_quantizer (d, nhash, nbits_subq);
faiss::IndexIVFFlat index (&coarse_quantizer, d, ncentroids, metric);
faiss::IndexIVFPQ index (&coarse_quantizer, d, ncentroids, bytes_per_code, 8);
std::vector trainvecs (nt * d);
index.train (nt, trainvecs.data());
std::vector database (nb * d);
std::vector ids (nb);
index.add (nb, database.data());
index.add_with_ids (end - begin, database.data() + d * begin, ids.data() + begin);
std::vector queries;
std::vector<:index::idx_t> nns (k * nq);
std::vector dis (k * nq);
index.search (nq, queries.data(), k, dis.data(), nns.data());
faiss::write_index(&index, "/tmp/populated_index.faissindex");
faiss::Index * idx = faiss::read_index("/tmp/trained_index.faissindex");
3. 색인 선택
"OPQx y,..., PQx" Qx 는 하나의 product quantizer 를 통 해 압축 벡터 를 x 바이트 로 표시 합 니 다. x 는 보통 < = 64, 비교적 큰 값 에 대해 서 는 SQ 가 정확 하고 빠 릅 니 다. OPQ 는 벡터 의 선형 변환 으로 압축 하기 쉽 습 니 다. y 는 하나의 차원 입 니 다. (1) y 는 x 의 배수 (필수) (2) y < = d, d 는 입력 벡터 의 차원 (최고) (3) y < = 4 * x (최고) 입 니 다.
4. 데이터 세트 와 색인 선택
5. Faiss ID 맵
기본적으로 Faiss 는 색인 에 추 가 된 벡터 할당 순서 id 입 니 다. 이 페이지 는 임의의 ID 로 변경 하 는 방법 을 소개 합 니 다.
일부 Index 클래스 는 add with ids 방법 을 실 현 했 습 니 다. 벡터 외 에 64 비트 벡터 id 를 제공 할 수 있 습 니 다. 검색 할 때 클래스 는 초기 벡터 가 아 닌 저 장 된 id 를 되 돌려 줍 니 다.
IndexIDMap: 이 색인 은 다른 색인 을 봉인 하고 추가 하고 검색 할 때 ID 를 변환 합 니 다. 맵 이 있 는 시 계 를 유지 합 니 다.
index = faiss.IndexFlatL2(xb.shape[1])
ids = np.arange(xb.shape[0])
index.add_with_ids(xb, ids) # this will crash, because IndexFlatL2 does not support add_with_ids
index2 = faiss.IndexIDMap(index)
index2.add_with_ids(xb, ids) # works, the vectors are stored in the underlying index
IndexIVF 의 ID: IndexIVF 하위 클래스 는 항상 벡터 ID 를 저장 합 니 다. 따라서 IndexIDMap 의 추가 표 는 공간 을 낭비 합 니 다. IndexIVF 자체 가 add with ids 를 제공 합 니 다.
참고 문서:
https://waltyou.github.io/Faiss-Introduce/ https://waltyou.github.io/Faiss-Indexs/#%E6%8C%91%E4%B8%80%E4%B8%AA%E5%90%88%E9%80%82%E7%9A%84-index
https://github.com/facebookresearch/faiss/wiki/Faiss-indexes