Skip to content

算法Algorithm

LSH 放大候选索引

LSH amplification index · AND-OR locality-sensitive hashing index

把独立基础碰撞组成多张复合键桶表,按唯一记录ID去重并精确核验,显式报告遍历预算与概率召回的边界。

形式陈述 ​

从一对对象的碰撞到一批记录的索引 ​

输入是静态记录表 P=((idi,xi))i=1n,允许 n=0。ID 必须唯一;两个 ID 可以携带完全相同的值,它们仍是两条应分别报告的记录。再给出基础随机函数族 H、整数 k,L≥1,以及用于最终核验的确定谓词 close(x,z)。

对每张表 j∈{0,…,L−1},抽取 k 个基础函数,形成长度为 k 的完整复合键

Kj(x)=(hj,0(x),…,hj,k−1(x)).

全部 Lk 次抽样相互独立,而数据与查询在每个分量上使用同一函数。表 j 在键 Kj(xi) 下追加 ID,桶内保留输入顺序。键的相等是整个元组相等;用哈希表存桶时,底层散列冲突仍由完整键比较处理,不能把底层散列值相等误当作相似性碰撞。

查询 z 依表号从小到大遍历 Kj(z) 的桶。第一次见到某个 ID 才计算 close(xi,z);后面同一 ID 再出现只记一次重复出现,不再核验或输出。输出由已核验且谓词为真的 ID 组成,按首次见到的次序排列。因此所有返回值都满足核验谓词,但没返回的记录可能没有命中任何桶。

公开参考支持两种基础族。超平面角度指纹提供共享符号序列,连续切成 L 段、每段 k 位;核验整数向量的余弦是否至少为给定有理数 a/b∈[0,1]。MinHash则为有限全集中的非空集合提供共享排列最小元素,核验 Jaccard 比是否至少为 a/b。小全集参考保存完整排列,而不是用普通整数散列冒充严格 min-wise 抽样。给定函数表可以确定地执行索引;程序不能仅凭函数值检查调用者是否真的独立抽样。

AND 与 OR 分别使用哪一份独立性 ​

对抽样前固定的 x,z,令基础碰撞概率为 p=Pr[h(x)=h(z)]。同一张表的 k 个独立分量全相等,才有键相等,所以

Pr[Kj(x)=Kj(z)]=pk.

不同表也独立,一张表都未命中的概率为 (1−pk)L。完整扫描的候选召回率因此是

fk,L(p)=1−(1−pk)L.

这些等式对单个固定对象对成立;不同记录是否命中不必相互独立。若该记录还满足核验谓词,则无预算截断时,候选命中就等价于最终报告这条记录。

常见的距离型假设给定 r1<r2 与 p1>p2:距离至多 r1 的对象基础碰撞概率至少 p1,距离大于 r2 的对象至多 p2。那么每条固定近记录的遗漏率至多 (1−p1k)L;对 m 条预先固定的近记录要求全部报告,可用并集界给出遗漏概率至多 m(1−p1k)L。对于归一化角度距离,p=1−θ/π;对于 Jaccard 相似度,p 就是 Jaccard 比。

令 F 是距离大于 r2 的记录集合,RF 计它们在查询桶中的出现总次数,同一 ID 跨表重复也计入。期望线性性给出

E[RF]=L∑i∈Fpik≤|F|Lp2k≤nLp2k.

不同远记录间的碰撞相关也不影响这个式子。它没有控制 r1 与 r2 之间的灰区,也没有控制大量真正的近记录。若所有记录和查询相同,每张表都包含全部 n 条记录,出现次数就是 nL。

遍历预算也是输出合同的一部分 ​

参考允许非负整数预算 B,单位是读取的桶出现项,重复 ID 也消耗预算。先计算全部 L 个查询键,用各桶长度求出总出现数 R,然后只扫描串接列表的前 min(B,R) 项。没有预算参数时扫描全部。返回值同时包含:总出现数、实际扫描数、首次核验 ID、重复出现数、通过核验 ID,以及

  • buckets_exhausted:本次选中的全部桶已读完,实际扫描数等于 R;
  • budget_exhausted:仍有出现项未读,不能将这次结果当作完整候选集。

预算正好等于 R 时属于前者。空记录表或空桶的 R=0,即使预算为零也已读完。buckets_exhausted 只说明命中的桶已尽,不代表整个数据库不存在漏掉的近记录。

截断后的报告概率通常不再等于 fk,L(p),因为记录可能碰撞了却排在截断之后。一个保守分解是

Pr(固定真近记录被遗漏)≤(1−pk)L+Pr(R>B).

当 B 为非负整数,由 R≥0 和整数性可再界为 (1−pk)L+E[R]/(B+1),最后与 1 取最小值。若只知道远记录的期望而不知道总 R,不能把 E[RF] 偷换进这个式子。参考并不声称任意预算都有非平凡召回下界。

表不变量与成本核算 ​

构建处理完前 t 条记录时,表 j 的桶 u 恰好按输入次序含有那些 i≤t 且 Kj(xi)=u 的 ID。每条新记录在每张表恰好追加一次,归纳立即保持不变量。查询遍历前缀后,seen 恰为此前见过的不同 ID;核验列表是首次出现顺序,输出列表是其中谓词为真的子序列。逐项检查“新 ID / 旧 ID”两种情况,就证明了不重复输出、不错报与前缀预算语义。

设一次基础函数求值花 H,一次原值核验花 D,一次基础函数描述占 Sh 个机器字,原始记录及 ID 存储占 SP。在 ID、分量键为机器字且字典操作期望常数探测的模型下,复合键的计算、散列与比较还需要 O(k),因此建表期望时间为

O(Tinput+nLk(H+1)),

其中 Tinput 包括读取、校验、保存原值以及建立函数配置,空输入也支付配置成本。索引空间不能只说 nL:它包括 LkSh 函数参数、nL 个 ID 引用、至多 nL 个长度为 k 的元组键,以及表目录,合计

O(SP+LkSh+L+nL(k+1)).

实际键数可能少于 nL,这是上界。稠密超平面有 H=O(d),Sh=O(d);完整 MinHash 排列表需 Sh=O(|U|),集合大小为 s 时一次求值是 O(s)。这些参数成本不应藏进“每个 hash 常数时间”。

记本次实际读取的出现数为 R′≤R,不同核验 ID 数为 V≤min(n,R′)。查询期望时间为

O(Tz+Lk(H+1)+R′+VD),

其中 Tz 包含验证查询和阈值。另记规范查询值的副本大小为 Sz,单次核验的最大临时空间为 Wverify;工作及返回空间是 O(Sz+Lk+V+Wverify),与只读索引存储分开,不把桶列表重新复制出来。公开整数向量实现有 Sz=O(d)、Wverify=O(d),因为校验会形成元组副本;集合实现有 Sz=O(|z|),交并集临时对象使 Wverify=O(maxi 已核验|xi|+|z|),无核验时该项取零。即使 B=0,参考也先计算全部查询键和桶长度,所以预算只限制出现项扫描与随后的核验。若 ID 是变长字符串、整数是任意精度,或字典遇到不利散列分布,对应位成本和探测退化需另计;上述期望界不是确定性的最坏保证。

直觉

一张表要求 k 个答案全相同,会同时减少近对象和远对象的碰撞;多张表允许其中任意一张成功,补回一部分近对象召回。k 大并非总更好,L 大也不是免费:前者拉长键并降低单表命中,后者复制记录引用并增加重复扫描。

最后的精确核验解决的是“碰巧落在同一个桶的远对象不能被输出”。它不负责找回从未进入候选集的近对象。去重则解决同一记录在几张表重复出现的问题,不能把内容相同而 ID 不同的两条记录合并。

LSH 候选:碰撞、去重、核验与截断
例子与边界

两张表、六次出现、四次核验 ​

取 k=L=2,四个基础符号依次用法向量 (1,0),(0,1),(1,1),(1,−1)。查询 z=(3,1) 的两张表键都是 11。按下列次序插入记录:

ID 原向量 表 0 键 表 1 键 与 z 的余弦至少 4/5?
F (1,8) 11 10 否
A (2,1) 11 11 是
A2 (4,2) 11 11 是
B (1,−1) 10 11 否
C (−3,1) 01 00 否

命中桶依次是 [F,A,A2] 与 [A,A2,B]。完整扫描共有 R=6 次出现,首次核验顺序为 [F,A,A2,B],两次重复出现不再核验;输出 [A,A2]。A 与 A2 的方向相同,却各有自己的 ID,所以都保留。C 没有命中,不在核验列表里。

对整数向量,记 s=⟨x,z⟩、u=‖x‖2、v=‖z‖2。当阈值 a/b∈[0,1] 时,正确核验为

s≥0且b2s2≥a2uv.

先检查符号,才能安全平方;否则负向量也可能被错报。A 的 s=7,u=5,v=10,有 25⋅49≥16⋅50;F 的 s=11,u=65,v=10,却有 25⋅121<16⋅650。阈值等号按“至少”接纳。

若 B=1,只读取 F,核验不通过,输出为空且状态为 budget_exhausted,明明后面还有 A 和 A2。若 B=4,读到 [F,A,A2,A],只核验三条记录,仍未读完。B=6 或更大才得到完整扫描状态。改变插入次序可以改变预算内结果,但不会改变无预算时最终结果的集合。

能精确枚举的放大率 ​

全集 U={0,1,2} 有六种等概率排列。令 X={0,1},Y={1,2},MinHash 基础碰撞概率是 1/3。独立选择四份排列作为两张表的两个分量,共有 64=1296 种等概率配置,完整命中数是 272:

272/1296=17/81=1−(1−1/9)2.

若一张表把同一个函数重复两次,单表碰撞率仍为 1/3,不是 1/9。若两张表共享完全同一对函数,总命中率仍为 1/9,不是 17/81。这些是依赖结构改变后的另一个算法,而不是独立配置恰好抽到重复函数;独立有放回抽样允许偶然相同,概率空间仍是全部 64 种。

固定查询与失败含义 ​

上述概率对预先固定的数据和查询成立。重用索引回答事先列好的有限查询集,可以对各查询及目标记录做并集界;看见桶、指纹或过去结果后任意挑选新向量,不能直接把单次失败率照搬过去。有限潜在查询全集上的同时保证与任意实查询空间的自适应保证是不同条件。

返回空集只意味着当前扫描前缀中没有通过核验的记录。即便 buckets_exhausted,某条真正近记录仍可能没命中任何表。若业务必须证明不存在近记录,需要额外的完整搜索或别的确定性证书。若只要求返回任一近点,某些特定参数和截断规则可以另证成功率;它不是本页“报告扫描前缀内所有合格 ID”自动拥有的性质。

推论与应用

这套索引把基础族的碰撞规律变成可调的候选工作量:选择 k 减少远对象出现,选择 L 提高固定近对象的机会,然后用原始谓词消除错报。选择参数时应同时检查可接受遗漏率、原值核验成本、灰区分布、键长度和重复扫描,不能只看一个理论碰撞曲线。

k-d tree在自身的几何查询合同内返回精确结果,最近邻访问数却可能退化到线性;这里则把漏检概率纳入合同,并可能因大量近点或相同键而扫描 nL 项。两者的差别是保证类型和数据访问方式,不是“高维一定用哪一个”。把有限空间预算、可容忍漏检与核验代价写清楚,才有可比较的结构选择。

参考资料
  • Sariel Har-Peled, Piotr Indyk, Rajeev Motwani, “Approximate Nearest Neighbor: Towards Removing the Curse of Dimensionality,” Theory of Computing 8(14), 2012, pp.321–350,§3.2 Definition 3.3、Theorem 3.4、Remark 3.5、Lemma 3.6:基础敏感族、复合键、多表与固定有限查询范围的保证。原文特定截断下的近邻存在性结论不等于本参考的任意预算全报告合同。
  • Moses S. Charikar, “Similarity Estimation Techniques from Rounding Algorithms,” STOC 2002, pp.380–388,§§1、3:共享基础碰撞族与角度实例。本页桶索引的独立性、ID、核验和预算规则全部在正文明确给出。
关系图谱10 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系