精准广告matching方案调研与分析

一 背景

精准广告matching阶段查全率是影响业务效果的重要因素,matching结果作为广告rank的前置环节,是rank效果的天花板。随着业务发展,算法对matching环节查全率的要求越来越高,传统的“user->tag、tag->ad”两段式检索已经限制了业务的发展,我们的技术体系面临新的挑战——全库matching。
全库matching面临的主要挑战来自于计算量的大幅度提升,如何在计算资源有限的情况下精确的命中候选集是问题的关键。

二 向量空间检索

算法将广告和流量的各项特征提取成为向量,利用向量进行KNN向量空间检索,得到候选集。KNN检索或许大家都不陌生,指的是“选取K个距离最近的doc”,但值得一提的是,这个“距离”通常指的是L2距离,即欧式距离。但是,从广告算法角度出发,神经网络训练过程中大量使用的数学工具是矩阵,而矩阵计算过程中更多使用的是“内积”。因此对“内积”结果进行KNN检索更符合广告业务场景。
抛开L2和内积的区别,目前比较常用的KNN检索有如下几种:

2.1 hash型方案
2.1.1 LSH

LSH是“局部敏感hash”的简称,大概含义指的是找到一种hash算法,这种算法有一个特性,就是会将距离比较近的向量hash到同一个值上面,举个比较简单的例子就是对向量的每一个维度使用floor(x/10)这种hash函数。在检索的时候,直接将hash值当作token拉取多个倒排链,然后在将到排链中的doc进行topN,最终实现KNN
优点:这种方案实现十分简单,性能好,检索技术上主要是局部敏感hash函数和倒排检索的结合
缺点:检索的准确度强依赖于hash函数的设计,目前hash函数的精确度都比较低,不是很适合精准广告的业务场景

2.1.2 geohash

geohash最初应用于地图邻近搜索的场景,所以这种方法天生和“距离”绑定。具体的方法是,首先将广告和流量的特征向量的每一个维度按照值域进行“二分0/1”编码。假设维度x的值域是[-100,100],对x=14进行编码:
14 > (-100 + 100)/2 = 0 -> 1
14 < (0 + 100)/2 = 50 -> 0
14 < (0 + 50)/2 = 25 -> 0
14 > (0 + 25)/2 = 12.5 -> 1
14 < (12.5 + 25)/2 = 18.75 -> 0
14 < (12.5 + 18.75)/2 = 15.625 -> 0
二分可以不断继续,直到认为精度已经足够。现在假设100100的精度已经足够,那么我们将维度x编码为100100。按照类似的方式对维度y进行编码,假设结果为001001。
然后将多维编码交织在一起,组成一个一维的编码。
1 0 0 1 0 0
+
0 0 1 0 0 1

1 0 0 0 0 1 1 0 0 0 0 1
编码为100001100001。
这样编码的结果有个特性,就是两个向量前缀越匹配,代表这两个向量代表的“点”的距离越近。
我们将这样的一维编码转换成string,当作token,每个token下挂载精度表达范围内的多个doc,检索时我们可以通过指定前缀匹配数量来调整检索精度,然后再进行topK选取。
优点:方案比较简单,实现便捷,主要用到的检索技术是倒排检索 + 前缀匹配检索,前缀匹配检索比较常见的如TrieTree
缺点:

  • 编码精度和token数量间存在矛盾,若提高编码精度,则token数过多,倒排检索环节的正确性以及性能无法兼顾
  • 高维度token数过多
  • 只适用于使用“距离”当作衡量标准的向量检索场景,且无法做到精确的L2距离检索
2.2 树型方案
2.2.1 四叉树

顾名思义,类比二叉树,这是一颗每个节点有四个子结点的树。这种方案最初用于GIS,在二维向量检索的场景下比较适用。大概思路其实和TrieTree差不多,只不过是变成了二维,只有叶子结点会存放数据,并且了一个“分裂”的概念。类比TrieTree用于前缀匹配存储一维数据,每个节点只能存放一个value(TrieTree的value即是倒排的token,后面称这个为token),四叉树每个节点可以存放多个token,当随着四叉树的建立token数量满足一定条件时,这个节点会分裂成为最多四个节点,原结点将挂载在自己身上的token按照空间划分分配给四个子结点。检索时,和trie tree更像,都是用前缀去检索根结点,然后找到对应子结点,再进入到子结点继续前缀匹配,以此类推。
可以看出,对应geohash方案,四叉树可以作为hash值匹配的实现工具,hash匹配后,拉取对应的倒排链。对于三维、四维向量,可以推广为八叉树、十六叉树。。。
优点:方案比较简单,实现便捷
缺点:和geohash差不多

2.2.2 KD-Tree

这种数据结构是高维向量KNN检索比较常用的数据结构。基本思路是
(1)选取n个维度中方差最高的维度
(2)按照该维度的中位数切一刀,假设是按照维度2为d2,切分的面是d2=10,那么就将<2,10>记到这个节点
(3)将数据分成两份,分别放入左右结点,并对左右结点重复步骤(1)
建立好KD-Tree以后,检索时指定目标向量和L2距离范围,从根节点开始:
(1)节点入栈
(2)栈为空? 是,结束;否,pop首节点
(3)是叶子节点?是,遍历样本,计算L2距离,保存,转步骤(2);否,步骤(4)
(4)右节点有可能包含满足L2距离限制条件的样本 ?是,入栈
(5)左节点有可能包含满足L2距离限制条件的样本 ?是,入栈
(6)转步骤(2)
结束后对保存下来的样本进行topN选取。
我们看到,KNN检索过程中,对一个路径检索到尽头时(接触到叶子节点),由于父节点的陪兄弟节点也有可能包含满足L2距离限制条件的样本,需要进行回溯。当向量维度非常高时,回溯十分频繁,检索性能会急剧下降。之所以要回溯,本质上是因为KD空间是按照矩形切分,但是L2检索的闭合面是一个球面,无法和矩形很好的贴合,闭合面交界处会出现很多不确定是否满足要求的“矩形碎块”。
优点:低维下检索效率高(一般维度小于20-30维),可以精确的L2范围搜索
缺点:

  • 实现相对复杂
  • 高维下检索性能退化严重
  • 只能支持L2距离检索,对内积检索不友好
  • 数据分布不均匀时会导致不平衡
  • 需要全量数据才能比较好的构建树,实时更新后会加剧树的不平衡
2.2.3 KDB-Tree

KDB-Tree其实应该写成KD B+Tree,就是用B+Tree树的思路去解决KD-Tree不平衡的问题,是对KD-Tree的一种优化
优点:解决了KD-Tree不平衡的问题,实时更新成为可能
缺点:继承了KD-Tree除上述优点的所有缺点

2.2.4 R-Tree

这种方案多用于“空间对象”的相关性检索,所谓“空间对象”就是占据了一定体积的对象。主要思路是用最小外接矩形(MBR)去表示被检索对象,然后向上“聚类”,父节点的MBR是“包含所有子节点的MBR的最小外接矩形”。检索时输入一个MBR,使用类似KD-Tree深度遍历+ 回溯的方法,查找MBR有“交集”的空间对象
这种方法更适用于“空间对象”检索,目前来看并不适用于广告业务场景。

2.2.5 ball tree

这个方案解决了KD-Tree高维退化的问题。基本思路是先将数据聚类,组织成k个中心,每个中心下挂载了对应doc,然后用一个球面将各个聚类分别包含起来,这个球面以聚类中心为圆心,对半径的选取以能包含所有doc为准,可以选用最小外接圆。
在这里插入图片描述
用向量和几何方法都可以证明任意一点Q到圆内的距离都小于Q到圆心O的距离与圆半径R之和。在检索时,可以按照R-Tree类似的方式构建一颗树,然后将对样本的距离计算先粗力度的转换为对聚类圆圆心的距离计算,使用类似于beam search的剪枝检索算法选出候选集。
优点:简化了检索计算的复杂度,解决了高维度性能问题,并且这种方法可以很自然的推广到内积模型

在这里插入图片描述
缺点:

  • 检索的精度依赖聚类算法
  • 当计算逻辑不局限于L2或内积时,这种方法仍然有局限性
2.3 聚类型算法
2.3.1 乘积量化(Product Quantization, PQ)

PQ的思路是以牺牲部分精度为代价,换取检索效率的提升。具体方法是将一个高维向量(D维)分段成等长的M个子向量d1、d2……dm,每个子向量dm维度为D/M。然后,在每一个子向量空间内把训练样本进行聚类,每个子向量空间得到cm个聚类中心,最后,一个样本最终从属的聚类中心是由其各个子聚类中心拼接而成,即c1##c2##……##cm,faiss实现中称之为label。以上过程称之为“量化”。检索时,先将查询向量x拆分成多个子向量,然后每个子向量都求得topK个L2距离最近的聚类中心,最终再将各个中心拼接成label去查询这个label下的所有doc,然后在对所有候选doc进行筛选。
优点:检索效率高,并且高维度性能好
缺点:只能用于L2度量的检索

2.3.2 聚类球(cluster ball)

为了解决2.3.1方法只能应用于L2距离场景的问题,借助了2.2.5中ball-tree的思想,提出了cluster ball的方法。这种方法的首先用L2度量对doc进行聚类,聚类后用一个超球面将该同一个聚类中下的所有doc包含在内,记录这个球面的中心点和半径。在进行内积(Inner Product, IP)度量的检索时,参照2.2.5的方法进行剪枝
优点:支持IP度量的检索
缺点:在进行doc粒度的topK时,若聚类精确度不高,可能需要对很多本来相关性比较差的doc进行计算,影响检索效率

2.3.3 倒排乘积量化(IVF-PQ)

这种方法的思路是先用粗聚类算法(如k-means)将全量样本集聚类成较少数量的中心点,称作粗量化,每个中心点对应一个粗量化中心C。第二步,把粗量化中心下所有的doc对应的向量减去粗量化中心向量,得到残差r,然后对r使用PQ ball
优点:先将候选集限定在一个比较粗的范围内,避免对大量不相关的doc进行向量计算,检索效率高
缺点:在一定程度上丢失了精度,精度取决于粗量化阶段的聚类算法

如果感兴趣,欢迎关注微信技术公众号
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值