Jina AI 的开源向量索引产品 AnnLite 的核心近似搜索算法是基于 HNSW 来实现,并在此基础上提供了更加丰富的功能(例如支持前置过滤近似查询)。为了使得 AnnLite 能够具备更强的竞争力和实际应用价值,我们对 HNSW 算法进行了改进和优化。
10 月 26 日晚 7:00,我们邀请到了负责本优化项目的叶坚白,来分享《近似最近邻搜索算法 HNSW 的改进与优化》。
叶坚白 Jina AI 开源社区 AnnLite 贡献者,本硕就读于中国科学技术大学大数据学院。
项目名称:近似最近邻搜索算法 HNSW 的改进与优化
项目描述:针对海量向量数据的搜索,无论是工业界还是学术界都做了大量的研究。由于精确的向量搜索在海量数据的场景下搜索时间过长,所以目前的常见做法,是在向量上建立近似搜索索引。学术上我们称之为近似最近邻搜索 ANN (Approximate Nearest Neighbor Search) 问题,通常都是通过牺牲搜索精度来换取时间和空间的方式,从大量样本中获取最近邻。
根据 Benchmark 上 ANN 算法的基准测试结果,基于图结构的 HNSW 算法在查询速度和精度上优于其他 ANN 算法。但是 HNSW 算法本身的主要问题就是对内存占用较大,限制了其可以索引的数据大小。
目前我们的开源向量索引产品 AnnLite 核心近似搜索算法是基于 HNSW 来实现,并在此基础上提供了更加丰富的功能(例如支持前置过滤近似查询)。为了使得 AnnLite 能够具备更强的竞争力和实际应用价值,我们希望能够进一步对 HNSW 算法进行改进和优化。
AnnLite:https://github.com/jina-ai/annlite
感谢开源之夏提供的这个平台的机会, 让我了解到了 Jina AI 这家公司以及其开源的多模态搜索的工具库. 我一直对深度学习的应用和落地充满渴望了解和参与的热情, 尤其是在 Deep learning for data mining 这一块. 而 Jina AI 正在做的事情与我的想法一拍即合. 通过开源之夏, 我联系到了我后续项目的导师 —— 王峰博士, 并和其交流后很荣幸的被选中进行 Jina AI 。
在使用 Deep Learning 进行搜索的过程中, 当前的范式无法避免的一件事就是向量搜索的过程, 即通过匹配海量表征向量的过程. 如果考虑到表征向量的高维度以及召回的大规模, 如何在保证理想的精度和速度的平衡下进行召回是一个存在挑战且迷人的问题. 了解到 Jina AI 中实现了自己的向量搜索库 AnnLite, 我便很希望可以参与的这部分的开发中来, 在一个深度学习落地中留下自己的一份努力。
由于之前有一定的 Python 和 CPP 基础, AnnLite 项目本身的理解和上手在较早就比较充分,AnnLite 可以理解为一个前后端的结构, Python 作为主要的用户使用的地方, 封装 CPP Backend 或者 Database 的交互功能. 而项目要开发的地方则主要集中在 C++ backend 中的修改. 在现有的基于 Hnswlib 的HNSW搜索算法的实现上, 需要添加向量量化的支持. 其主要难点在与, 当前的实现对于向量添加, 搜索时的距离计算是不具备上下文信息的. 对于不需要上下文信息的距离, 比如向量内积, 进行实现是很自然的. 然而对于向量量化算法, 经过量化的向量是需要 Distance Table 这一上下文信息进行距离计算的. 所以在添加上下文信息这里, 需要对 Backend 的中多处接口进行修改. 除开功能开发上, 项目开发过程中 Uni-test 的产出和代码, git message 规范化也是很重要的一环。
在与导师王峰的合作过程中, 整体的体验是愉快且 inspiring 的. 老师对于问题的理解往往一针见血,同时也很尊重同学的感受。每周开会时都会对同学们的情况进行询问和关心。
优化是没有尽头的. 虽然当前的 AnnLite 的 HNSW 中添加了向量量化的支持, 但是其性能( Latency, memory 利用)上没有得到完整的验证和优化. 在后续我应该会进一步的调整先前的实现, 以达到更好的搜索效果。
更多成果请点击: https://github.com/jina-ai/annlite/pull/158
Q(开源之夏小助手):这是你第几次参与开源之夏,为什么选择参与开源之夏?
A(坚白): 第一次参与,因为开源之夏上有很多优秀的国内开源社区的机会,我很想体验。
Q(开源之夏小助手):开发过程中导师和社区给予了你怎样的帮助呢?
A(坚白):非常大的帮助,导师对于project的细节和设计目标都非常清楚。很多次的指导都有种醍醐灌顶的感觉。
Q(开源之夏小助手):你是从什么时候开始接触开源的?有什么特别的经历吗?
A(坚白): 我是在我本科期间第一次接触开源的,那个时候开始科研需要从github上找很多别人工作的实验源码。然后自己逐渐接触到我们这个行业里的开源精神,觉得很是认可,特别的经历的话倒也没有,就是一个水到渠成的过程. 保持好奇就很好
Q(开源之夏小助手):在开源社区里学习工作是一种什么体验?
A(坚白): 非常好的体验,开源社区的关系不太是出卖劳动时间的契约。我接触到的开源的社区都很 nice,很放松。这会让我们有更多的时间花在思考任务的意义上,而不是埋头苦干。
Q(开源之夏小助手):你认为在校生有哪些参与开源的方式?你认为在校生有哪些参与开源的方式?
A(坚白): 我觉得主要还是由兴趣驱动是最好的,从朋友推荐或者相关文章中了解前沿的项目,然后试图理解他的源码。或者通过相关的平台,比如开源之夏。
2022 年 10 月 26 日 周三晚 19:00 - 19:45
扫描下方二维码,即可报名参加
更多精彩内容(点击图片阅读)