在深度学习蓬勃发展的今天,一切物体皆可变成向量。图片可以变成一个向量,一个人的兴趣也可以表示成一个向量,一段语音也可以编码成一个向量。既然一切皆可成为向量,那么,通过一个东西找到相似的东西这个问题,都可以转化为通过一个向量找到相似的向量的问题了。
![563a75f08091a00baead3361f235e1db.png](https://img-blog.csdnimg.cn/img_convert/563a75f08091a00baead3361f235e1db.png)
书的二维向量化表示(因为是二维,所以可以展示到一张图上)
所以,向量近似最近邻(ANN)算法需要解决如下的问题:
- 给定N个维度是f的向量(vector)组成集合S
- 给定一个距离函数d,其中 d(a, b) 是向量a和b的距离,距离越小表示a,b越相似
- 输入一个维度是f的向量q,如何找到S中和q距离最近的K个向量
对于这个问题,最傻瓜的算法当然是,对集合S中的N个向量,每个计算一下和q的距离,并将结果放入一个堆中(堆里维护着距离最小的K个向量)。这样,整个算法的复杂度是 O(Nlog(K))。当N很大时(比如1亿),显然查询是非常慢的。
因此,为了解决快速查找的问题,如何对集合S建立合适的索引,就是一个重要的问题了。而HNSW就是这方面的一个重要算法。关于HNSW的开源实现可以参考Github上的hnswlib。不过,因为这个库做了很多性能优化,导致它的代码可读性不是很好,不太容易看懂。因