丁香园基于 Milvus 的向量召回应用

丁香园大数据 NLP 丁香园大数据

背景

随着 BERT,GNN 等模型在 NLP 领域的发展,DNN 类模型的语义提取能力又得到进一步提升,我们对文本语义向量也有了更高的期待,期望语义向量或其他模型特征向量可以在召回段发挥更大作用;约 2019 年初,我们就尝试在推荐业务中引入基于 Faiss 的向量召回,随后很快意识到,作为一个基础库,Faiss 固然可以快速部署,但缺乏分布式方案,数据持久管理等问题令其无法应付大数据场景;Milvus 很好的弥补了 Faiss 的不足,具体来说:分布式解决方案、数据持久化管理、丰富的 SDK 这些优势都是其他 ANN 库无法比拟的,另外 Milvus 的社区很活跃,意味着用户遇到的问题能很快被解决;因此在 2020 年,丁香园算法组选择 Milvus 作为向量索引组件,并首先用于社区论坛搜索场景。

召回流程

搜索召回通常基于 Solr/ES 这类组件,核心是基于概率检索模型,通常是 BM25 算法的分词召回;对丁香园的社区搜索场景而言,用于需求的内容不仅包含专业知识,还有考试求职和新闻热点等内容需求,因此 query 往往描述模糊,中心点不明确;利用 BM25 不得不接受分词的损失,还需要维护优质的业务相关词典,同时还需要识别关键词的算法辅助;简言之,BM25 很难应对模糊和复杂语义表达,因此我们尝试通过不同的文本向量化模型改善对关键词和语义的召回结果

图片

向量模型

Bi-Encoder[1]

BERT 是典型的 Cross-Encoder 模型,通过 12 层 Multi-Head Attention 捕捉全局信息,单句 BERT 的 Bi-Encoder 结构会有不小性能损失,但向量召回模型只能选择 Bi-Encoder 类的结构,将候选文档提前向量化存储,线上服务只计算 query 的向量

图片

损失函数的选择和负采样策略显得尤为重要;这里我们也选择 triplet loss,将负样本分为 easy,middle,hard 三部分,按 2:2:1 构造训练数据集

图片

Spherical Embedding[2]

论坛中话题的分布是很不均衡的,包含专业关键词的内容往往不如话题性内容多,所以很难只靠 BERT 捕捉到这些关键词的语义;我们首先想到 word2vec 类模型,这篇 Spherical Text Embedding 可以同时学习文档向量和词向量,实测中对关键词与文档的捕捉效果也不错

传统的 word2vec 只关注了中心词和周围词的语义关系,忽视了与整篇文章的关系,实际上文章中最先产生的往往中心词/主题词,然后才产生周围词,因此作者提出词向量的生成过程,基于 doc 向量,先生成中心词向量 tgt,再产生周围词向量 src;具体的,生成中心词 tgt 时可以将文档向量 doc 视作分布空间的均值向量,同理生成 src 时 tgt 就是均值向量

图片

需要指出,这里的三类向量 doc,tgt,src 都属于 von Mises-Fisher(vMF)分布,所以概率密度函数的具体形式,用于计算基于 doc 的联合概率分布



图片

具体的训练思路与 word2vec 类似,通过 max-margin loss 最大化正负样本的距离

图片

Knowledge Embedding[3]

更直接的关键词向量化方法是利用现有的图谱结构,通过 TranE 这样的实体关系表示模型,或者 node2vec 这类邻接图表示模型直接得到关键词向量,这里以 ProNE 为例;在之前有关 GNN 的文章中也介绍过,ProNE 整体可分为两部分,第一部分对无向图结构的邻接矩阵做稀疏矩阵分解。作者定义了如下损失函数最大化节点 r 和邻居 c 的共现频率 p,同时最小化负采样邻居概率:

图片

最小化 loss 的充分条件是 loss 对 r*{i}{T} c*{j} 的偏导数为 0,可得节点 r 和邻居 c 的的距离公式并构造距离矩阵

图片

对距离矩阵 M 做 tSVD(truncated Singular Value Decomposition)并取最后 top-d 的奇异值和对应向量作为这一部分的节点 embedding 表示,为了效率用 randomized tSVD 加速运算。第二部分借鉴 GCN 中 spectrum 方法的思路设计了传播策略(propagation strategy),目的是获取图结构中的局部平滑(localized smoothing)信息和全局聚类(global clustering)信息;具体来说,根据图分割理论,子图的聚合度越高表明对图的划分越好,可以用常量值 k 表示,高阶 Cheeger 不等式将常量 k 与邻接图的特征值关联了起来

图片

上式表明 Cheeger 常量对应着特征值的上下界,更小的常量对应更小的特征值,也对应着更内聚(clustering)的子图,反之对应更大的特征值,此时图结构中的子图更为平滑(smoothing);于是,作者设计了一个函数 g(\lambda) 用于控制特征值的取值范围,再参照 GCN 中利用切比雪夫多项式近似计算下面的 \widetilde{L} ,整个过程可以看作限制特征值范围的 GCN,最后为保证正交性,还需要对 Embedding 结果做一次 SVD。

图片

总结

本文简单梳理了丁香园在搜索场景中关于向量召回方向的思考和尝试,通过不同类型的向量表示模型逐步处理现实场景中复杂的语义表达,基于 Milvus 的向量召回引擎有良好的性能和成熟的落地方案,让我们可以把精力完全集中在表示模型的调试上;此外,我们在其他场景中也会灵活应用 Milvus,例如将长文本转化为二值向量,通过汉明距离计算查询字面相近的内容,Milvus 全面的 SDK 支持使得这些功能可以在不同团队不同业务线内快速部署上线。目前向量召回引擎在 NLP 和推荐领域的应用都已逐渐成为趋势,Milvus 可靠的性能保证和丰富的落地技术支持极大的提高了我们的开发和部署效率,目前我们也积极在其他业务场景中引入向量表示模型,期待基于 Milvus 的应用能在更多业务线中发挥优势。

参考文献

  1. https://arxiv.org/pdf/2006.11632.pdf
  2. https://arxiv.org/pdf/1911.01196.pdf
  3. https://www.ijcai.org/proceedings/2019/0594.pdf


本文地址:https://www.6aiq.com/article/1624402033133
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出