---
# System prepended metadata

title: OverView of ANN Pipeline
tags: [Product Quantizer]

---

# OverView of ANN Pipeline
###### tags: `Product Quantizer`
[ToC]
### ANN是什么？
ANN，全称Approximate Nearest Neighbor，近似最近邻搜索，通常处理的对象是高维度向量。如果对向量不做任何处理，直接暴力算出欧式距离，然后找最大的，就是Nearest Neighbor，是所有ANN算法的上限。但是这么做一是要占据大量的内存来存储这些特征，另外是暴力搜索要计算query和所有gallery之间的高维向量距离，非常耗时。鉴于这两点，一般会对大库搜索进行一些处理进行特征压缩和加速搜索，同时会有一些性能损失，运用这些技术的搜索方法，可以统称为ANN。
### overview
#### 三个要考虑的因素
* 精度
* 速度
* 内存
最终目标是，牺牲最少的搜索精度，以换取尽可能快的搜索速度或者尽可能少的内存占用，或者使三者达到一个更好的trade-off点
#### pipeline
本文以[faiss](https://github.com/facebookresearch/faiss/wiki)部署的基本算法为脉络，讲解ANN的重要部件及其中一些原理

![image alt](https://imgpile.com/images/N6uxrP.png)

图中的实线框代表操作，虚线框代表产生的存储结果，主要包含两个过程：
* **建库**。将所有的gallery特征按照一定的规则进行压缩编码，方便后续的配套搜索方法进行快速搜索
* **搜索**。对于一个特定的query，按照和gallery配套的方法，进行处理，并通过一定方法找到其top 1或top k临近的样本。

有三个重要的模块在设计搜索算法时需要重点考虑：
* **Data Pre-process**。一般配套后面的量化器，都需要对数据进行维度平衡等操作。否则性能会很差,详细见[Data Pre-Process](https://hackmd.io/CJRugKyCQ6mhyE_kfrZGsw),建议先看量化器再看这个。
* **非穷举搜索**。为了在计算距离前过滤掉大部分不可能临近的数据，加速搜索，需要设计一个过滤器，本文以IVF为例进行讲解，和量化器写在一个文件里面。
* **量化器**。量化器是搜索算法的核心，作用是将原来的高维度float特征变成低位的int8或者bit型数据，在极大节省内存的情况下，同时可以用查找表，汉明距离等操作代替float乘累加来加速搜索。本文以经典的PQ（Product Quantizer）来说明，详细见[Product Quantizer](https://hackmd.io/c0kAkuQER-KqMC8COe1Mvg)。
