假设你想实现一种音乐服务,它的行为像Spotify一样,为你找到与你喜欢的歌曲相似的歌曲。你会怎么做呢?一种方法是将每首歌曲按照一些特征进行分类,将这些 "向量 "保存在一个索引数据库中,然后在数据库中搜索,找到 "接近 "你喜欢的歌曲描述向量。换句话说,你可以进行一个矢量相似性搜索。
什么是矢量相似性搜索?
矢量相似性搜索通常有四个组成部分:捕捉原始对象关键特征的矢量嵌入,如一首歌、一张图片或一些文本;代表矢量之间 "接近度 "的距离度量;搜索算法;以及保存矢量并以索引支持矢量搜索的数据库。
什么是矢量嵌入?
矢量嵌入本质上是特征向量,在机器学习和深度学习的背景下理解。它们可以通过手动执行特征工程或使用模型的输出来定义。
例如,文本字符串可以通过使用神经网络、单词共现矩阵的降维、概率模型、可解释的知识库方法以及单词出现的上下文的显式表示,被转化为单词嵌入(特征向量)。训练和使用词嵌入的常见模型包括word2vec(谷歌)、GloVe(斯坦福)、ELMo(艾伦研究所/华盛顿大学)、BERT(谷歌)和fastText(Facebook)。
图像通常是通过捕捉卷积神经网络(CNN)模型或转化器模型的输出而被嵌入。这些模型通过将像素块滚动到一起("卷积")成为特征,并通过池化层向下取样,自动降低特征向量的维度。
产品推荐可以基于产品描述中的单词和短语的嵌入,也可以基于产品图像的嵌入,或者两者都是。音频嵌入可以基于音频的傅里叶变换(这给了你频谱);基于作曲家、流派、艺术家、节奏、韵律和响度的描述;或者基于频谱和关键词。这个领域正在迅速发展,所以我预计将有新的嵌入技术用于许多应用领域。
什么是距离度量?
我们通常认为,距离是指二维或三维的直线。矢量嵌入通常超过10维,1,000维也不罕见。距离的一般公式是以赫尔曼-闵可夫斯基(Hermann Minkowski)的名字命名的,他因将爱因斯坦的狭义相对论表述为以时间为第四维的四维时空而最为著名(至少对物理学家而言)。闵可夫斯基度量(或距离)是对欧氏距离(直接的直线)和曼哈顿距离(锯齿状的线,像行走的城市街区)的概括。
欧氏距离,也被称为L2距离或L2规范,是聚类算法中最常用的度量。另一个度量,即余弦相似度,经常用于文本处理,其中嵌入向量的方向很重要,但它们之间的距离却不重要。
什么算法可以进行矢量相似性搜索?
一般来说,K-近邻(KNN)算法有可能对向量搜索问题给出好的答案。KNN的主要问题是它的计算成本很高,在处理器和内存的使用上都是如此。
替代KNN的算法包括近似近邻(ANN)搜索算法和ANN的一个变种,空间分割树和图(SPTAG)。SPTAG由微软研究院和Bing发布为开放源代码。一个类似的ANN的变体,由Facebook发布为开放源代码,即Facebook AI相似性搜索(Faiss)。产品量化器和IndexIVFPQ指数有助于加快Faiss和其他一些ANN变体的速度。正如我前面提到的,矢量数据库经常建立矢量索引以提高搜索速度。
Faiss的建立是为了在10亿个矢量数据库中搜索与查询文档相似的多媒体文档。为了评估,开发者使用了Deep1B,一个由10亿张图片组成的集合。Faiss允许你定制你的矢量预处理、数据库分区和矢量编码(产品量化),以便数据集能够适应可用的RAM。Faiss是为CPU和GPU分别实现的。在CPU上,Faiss可以在2毫秒内对10亿张图像数据集达到40%的召回率,换算成每个核心每秒500次查询。在Pascal-class Nvidia GPU上,Faiss的搜索速度比CPU上快20多倍。
SPTAG是为了类似的目的而建立的,尽管使用的方法略有不同。Bing对搜索引擎索引的1500多亿条数据进行了矢量处理,以改善比传统关键词匹配的结果。矢量数据包括单字、字符、网页片段、完整查询和其他媒体。SPTAG的作者建立在他们以前在微软亚洲研究院的ANN研究的基础上,使用查询驱动的迭代邻域图搜索,并实现了kd-树(对建立索引更好)和平衡k-means树(对搜索准确性更好)算法。搜索从几个随机种子开始,然后在树和图中迭代继续。
Pinecone是一个完全可管理的矢量数据库,它的API使其能够轻松地将矢量搜索添加到生产应用中。Pinecone的相似性搜索服务是分布式的、无服务器的、持久的、一致的、分片的,并在许多节点上进行复制。Pinecone可以处理数十亿的矢量嵌入,你可以在Python或Java应用程序和笔记本中运行相似度搜索。
矢量搜索的应用有哪些?
除了Facebook展示的图像搜索和微软Bing实施的语义文本搜索外,矢量相似性搜索可以为许多用例服务。例子包括产品推荐、FAQ答案、个性化、音频搜索、重复数据删除和IT事件日志中的威胁检测。