快速数据库搜索系统和方法与流程

文档序号:18516572发布日期:2019-08-24 09:29阅读:379来源:国知局
快速数据库搜索系统和方法与流程
本申请是2016年10月11日提交的标题为“hierarchicalquantizationforfastinnerproductsearch”的美国申请no.15/290,198的继续并要求其优先权,该申请的公开内容通过引用整体并入本文。
背景技术
:搜索非常大的高维数据库是一项可能涉及大量处理和存储器资源的具有挑战性的任务。许多搜索任务涉及计算查询向量与数据库向量集合的内积,以找到具有最大(largest)或最大(maximum)内积(例如,最高相似性)的数据库实例。这是最大内积搜索(mips)问题。但是,经由线性扫描计算内积需要o(nd)时间和存储器,当数据库向量的数量(n)和维数(d)大时,这是负担不起的。技术实现要素:实现提供内积的快速近似,其比蛮力(brute-force)方法快几个数量级,同时保持高准确度和小存储器占用。该方法包括数据库项的分层量化,该层级包括至少两个层。在一些实现中,第一层是向量量化(vq),第二层是乘积量化(pq)。在一些实现中,系统可以在量化层之间的残差上执行变换,优选地是正交变换(本领域技术人员将知道保持向量的长度和它们之间的角度)。在一些实现中,在积量化之前可能存在若干层向量量化。可以使用其它分层组合。在一个实现中,系统可以经由向量量化来量化数据库向量(例如,在向量空间中密集的高维点中表示的数据库项)。换句话说,数据库项可以被聚类(成向量空间中的数据库项的组)并且为每个聚类确定的聚类中心(例如质心、最接近质心的向量或其它平均中心位置)并输入到码本(vq码本或第一层码本)。然后经由表示vq码本中对应条目的vq码字将每个数据库项映射到其相应的聚类。然后,系统可以确定数据库项的残差,残差是数据库项被映射到的聚类中心(即,项映射到的vq码本中的条目)与数据库向量之间的差。残差具有比数据库项小得多的“直径”(方差的测量),这导致量化误差的显著减少。然后,系统可以经由学习(正交)变换来变换残差。学习到的变换降低了积量化的每个子空间内的方差,这大大降低了量化误差并导致更高的最终召回(数据库向量到搜索向量的正确最近邻居在前t个位置中排名的查询的更高比例)。最后,可以将变换的残差提交给积量化,其中每个变换的残差被投影到子空间中,并且残差的每个子空间(或块)被指派pq码本(使用pq码字)中用于该子空间的条目。在这里,子空间可以是残差的向量空间的细分。投影可以简单地是将残差的向量空间划分为块,例如将残差向量的元素划分为元素的集合或块,从而定义子空间。pq码本也可以称为第二层码本。换句话说,对于每个子空间,生成聚类,并且每个经变换的残差映射到用于子空间的聚类之一。每个子空间具有其自己的pq码字(即,不同的聚类指派)。数据库项的最终量化的表示是用于每层的码字(例如,vq码本的条目)和用于每个子空间的pq码字的串联(concatenation)。在具有附加层(例如,附加向量量化层)的实现中,附加vq码字将在第一vq码字之后串联。通过最小化数据库上的量化误差,可以通过变换来联合学习vq码本和pq码本。在查询时,系统计算查询向量与每个vq码字之间的内积,并且系统基于内积计算的结果选择与查询最相似的vq码字中的一个或多个。然后,系统可以计算查询的残差,例如,查询向量与最类似于查询的vq码字之间的差。如果选择了多于一个vq码字,那么系统可以为每个选择的vq码字生成残差查询向量。然后,系统可以用学习到的变换来变换残差查询向量(或多个向量)。在一些实现中,系统可以将经变换的残差提交给另一个层(例如,附加向量量化)。系统可以将经变换的残差查询向量投影到子空间中,并将查询向量投影与映射到相同vq码字的量化数据库条目进行比较,一次一个pq子空间。例如,系统可以选择具有相同vq码字的任何量化的数据库项并且,对于查询的第一块(pq子空间),确定每个选择的量化的数据库项的第一子空间的聚类标识符(即,pq码字),并使用那个标识符来识别子空间中的pq码本中的聚类中心。然后,系统可以执行查询的块与用于量化的数据项的pq码本条目之间的点积。点积的结果是子空间的相似性得分,并且查询与数据库项之间的相似性是所有子空间的点积的总和。对于映射到为查询选择的vq码字的任何数据库项,系统可以重复这个操作。因此,系统仅对于完整数据库向量的一部分执行内积,从而改善查询响应时间。可以使用随机梯度下降来联合学习vq和pq码本以及变换。在每次迭代时,在一小批数据上计算量化误差的梯度,以便将数据点固定指派给码字。在执行下降步骤后,重新计算针对数据点的码字指派。可以通过从采样并经由正交矩阵的cayley表征参数化来初始化变换。根据一个总体方面,例如用于查询数据库的计算机系统包括至少一个处理器和存储量化的项的数据库的存储器。每个量化的项包括第一码本中的第一条目和第二码本中的多个第二条目,其中多个第二条目中的每一个表示k个子空间的相应子空间。存储器还包括在由至少一个处理器执行时使系统执行操作的指令。操作可以包括从第一码本中确定与查询向量最相似的聚类中心,从聚类中心和查询向量(例如,从它们之间的差)计算残差向量,使用学习到的变换来变换残差向量,并将经变换的残差向量投影到k个子空间中。对于具有与查询向量确定的聚类中心对应的第一索引的每个量化的项,操作还可以包括:对于每个子空间,计算量化的项和经变换的残差向量之间的内积,并通过对内积进行求和来计算量化的项与查询之间的相似性得分。操作还可以包括响应于查询而提供具有最高相似性得分的项。在一些实现中,子空间的数量k远小于数据的维度d,例如小10倍或更多倍;这有助于降低搜索复杂性。例如,k可以是16。操作还可以包括:对于每个子空间,计算经变换的残差向量和第二码本中的每个聚类中心之间的内积;并将计算出的内积存储在码本查找表寄存器内存储装置中。这可以促进指令级并行性,如下面进一步描述的。优选地,每个子空间具有对应的寄存器。数据库可以有数百万个量化的项。在一些实现中,可以用两个码本共同学习变换,这是高效的并且可以提供良好的结果。但是,在初始化第二码本和执行联合学习之前,第一码本可以经历初始化和(整数)x个学习时期,这可以促进高效学习。根据一个方面,一种例如对数据库中的项进行索引以用于后续近似搜索的方法包括聚类被表示为高维向量的数据库项的数据存储,并为每个聚类选择聚类中心并将该聚类中心存储为第一层码本中的条目。该方法还可以包括,对于每个数据库项,基于数据库项被指派到的聚类的聚类中心来计算残差,将残差投影到子空间中,为每个子空间确定第二层码本中用于该子空间的条目,并第一层码本中的条目、以及用于每个子空间的第二层码本中的相应条目存储为用于数据库项的量化的向量。量化的向量可以用于使用最大内积搜索来确定响应数据库项。该方法还可以包括在将残差投影到子空间之前使用学习到的旋转来变换残差;可以用第一和第二层码本的参数来联合训练学习到的旋转。该方法还可以包括:基于内积运算,从第一码本中确定与查询向量最相似的t个聚类;基于聚类的聚类中心,为t个聚类中的每一个计算查询向量的残差;将查询的每个残差投影到子空间中;对于指派给t个聚类之一的每个数据库项,确定与查询向量的最大内积得分,最大内积得分基于在数据库项的残差和指派给数据库项的聚类的查询的残差之间计算的内积的子空间之上的总和;并且基于最大内积得分从指派给t个聚类之一的数据库项中识别与查询向量最相似的数据库项。与查询向量最相似的数据库项可以用于对由查询向量表示的项进行分类和/或响应于查询向量而提供项。根据一个方面,一种例如搜索数据库的方法可以包括使用向量量化将数据库中的向量划分为m个分区,使得每个向量具有指派的向量量化码字并且针对每个向量计算相应的残差,残差是向量与和向量量化码字对应的聚类中心之间的差。该方法还可以包括将积量化应用于每个残差,为每个残差产生用于k个子空间中的每一个的乘积量化码字,为每个向量存储指派的向量量化码字和用于向量的残差的k个积量化码字,并使用向量量化码字来选择数据库向量中与查询向量最相似的一部分。该方法还可以包括,对于该部分中的每个数据库向量,使用积量化码字来从所述与查询向量最相似的部分中确定数据库向量。在另一方面,一种包含在计算机可读存储设备上的计算机程序产品包括指令,所述指令在由在基板中形成的至少一个处理器执行时使计算设备执行本文公开的任何公开的方法、操作或处理。可以实现本文描述的主题的一个或多个实现,以便实现以下优点中的一个或多个。作为一个示例,实现在大的、密集的、高维数据集上提供快速最大内积搜索。此类数据集常常与推荐或分类系统相关联,例如查找与查询图像、视频或产品类似的图像、视频或产品。这种问题的另一个示例是分类模型,该分类模型在给定目标词的情况下使用内积计算附近词的概率。搜索避免对数据集的完全扫描,同时在现代cpu体系架构上提供高性能的同时最小程度地减少召回。实现包括向量量化和积量化的分层组合,其以低等待时间(例如,更快的处理时间)大大减少了针对大的、密集的、高维数据集近似内积的误差。作为另一个示例,码本和变换可以被端到端地联合训练,这导致在表示数据集时的较低近似误差,从而改善了召回。一些实现提供寄存器内查找表来计算查询的子空间和量化的数据库项之间的内积,其利用现代处理器的指令级并行能力并且提供对存储器中查找的显著改进。在一些实现中,搜索的最终复杂度是其中k是子空间的数量,m是向量量化器的数量(例如,vq码本中的条目的数量),t是为查询向量选择的vq码字的数量,并且n是数据库项的数量。因此,当k远小于数据维度d并且t远小于m时,搜索的复杂性比蛮力搜索快得多。此外,所公开的实现的存储器占用空间将是这远小于蛮力的存储器占用空间(即,)。在附图和以下描述中阐述一个或多个实现的细节。根据说明书和附图以及权利要求,其它特征将是显而易见的。附图说明图1图示了根据所公开主题的示例系统。图2图示了根据所公开主题的、表示搜索项的数据库向量的分层量化的框图。图3图示了根据实现的、用于对数据库项执行分层量化的示例处理的流程图。图4图示了根据实现的、使用分层量化和最大内积搜索的示例查询处理的流程图。图5图示了根据所公开主题的、用于联合学习正交变换和用于分层量化的码本的示例处理的流程图。图6a至6d是图示各种实现的益处的图。图7示出了可以用于实现所描述的技术的计算机设备的示例。图8示出了可以用于实现所描述的技术的分布式计算机设备的示例。各个附图中的相同标号指示相同的元件。具体实施方式图1是根据示例实现的可伸缩推理系统的框图。系统100可以用于分层量化项的数据库并用查询向量计算内积以查找相关数据库项以供在如推荐系统、机器学习算法中的分类以及使用最近邻居计算的其它系统之类的应用中使用。系统100联合学习用于分层级别的码本,并减少执行内积搜索所需的处理时间,同时仍保持高质量的结果。图1中系统100的描绘被描述为基于服务器的搜索系统。但是,可以使用其它配置和应用。例如,可以在客户端设备上执行一些操作。此外,虽然系统100被描述为搜索系统,但是所公开的实现的方法和技术可以用于例如使用最大内积的任何任务,诸如在具有大量(例如,数百万个)输出节点的神经网络的最后一层中执行的分类。因此,实现不限于搜索系统,而是可以在解决mips问题的任何系统中使用。可伸缩推理系统100可以是采用多个不同设备的形式的一个或多个计算设备,例如标准服务器、一组这样的服务器,或机架服务器系统,诸如服务器110。此外,系统100可以在个人计算机(例如膝上型计算机)中实现。服务器110可以是计算机设备700的示例(如图7中所描绘的)或计算机设备800(如图8中所描绘的)。虽然未在图1中示出,但是服务器110可以包括在基板中形成的一个或多个处理器,基板被配置为执行一个或多个机器可执行指令或者软件、固件或其组合的块。处理器可以是基于半导体的——即,处理器可以包括可以执行数字逻辑的半导体材料。处理器还可以包括能够执行数据级并行化的寄存器,例如,单指令多数据(simd)寄存器。服务器110还可以包括操作系统以及被配置为或者临时、永久、半永久或者其组合地存储一条或多条数据的一个或多个计算机存储器,例如主存储器。存储器可以包括以可以由一个或多个处理器读取和/或执行的格式存储信息的任何类型的存储设备。存储器可以包括易失性存储器、非易失性存储器或其组合,并且存储在由一个或多个处理器执行时执行某些操作的模块。在一些实现中,模块可以存储在外部存储设备中并加载到服务器110的存储器中。模块可以包括量化引擎126和查询引擎120。量化引擎126可以分层量化数据库项132的数据库并且,在该处理中,为层级中的每个级别生成码本,例如vq码本134、pq码本136。分层量化的结果是量化的数据库项130。在图1的示例中,vq码本134表示层级中的第一层,并且pq码本136表示第二层。在具有多于两层的实现中,量化引擎126可以生成附加的码本,例如,每层一个。因此,例如,如果系统100使用两个向量量化层,接着是一个积量化层,那么系统100可以为附加向量量化层生成第二vq码本。结果得到的量化数据库项130和码本(例如,vq码本134和pq码本136)具有比数据库项132的数据库更小的存储器占用空间。数据库项132可以是向量的数据库。向量可以被认为是具有d维度的浮点数的数组,或者换言之,具有d个位置的数组。诸如查询182之类的查询也可以表述为维度d的向量。当d大并且数据库条目的数量大(例如,数万或甚至数百万)时,查询向量和数据库向量之间的内积的计算是缓慢且处理器密集的。量化使得能够近似内积,但会引入量化误差。误差越大,结果越不准确。为了在保持高准确度级别的同时实现更快的计算时间,量化引擎126可以量化数据库项132。量化引擎126可以首先对数据库项132执行向量量化,以向每个数据库项指派vq码本134中的条目。因此,每个数据库项132具有相应的vq码字,该码字识别vq码本134中的条目。然后,量化引擎126可以确定每个数据库项的残差向量,残差向量是数据库项向量与聚类中心(例如,与数据库项映射到的vq码本134中的条目对应的向量)之间的差。然后,量化引擎126可以使用正交变换,例如使用学习到的旋转,来变换残差。正交变换(学习到的旋转)减小了后续积量化的每个子空间中的方差,这产生了显著更低的量化误差和更高的召回率。然后,量化引擎126可以经由积量化进一步量化旋转的残差向量,或者换句话说,将经变换的残差投影到子空间中,并将每个子空间映射到为子空间生成的pq码本中的条目。因此,经变换的残差的每个子空间具有相应的pq码字,用于子空间的pq码字识别用于那个子空间的pq码本中的条目。系统可以将vq码字和用于每个子空间的相应pq码字存储为量化的数据库项130中的量化的数据库项。图2图示了示例数据库项132和量化的数据库项130。在图2的示例中,数据库项132包括n个条目或n个不同的数据库项。数据库项132中的每个数据库项(例如,数据库向量(dbv)1、dbv2等)具有d维,或者换言之,d个元素。量化引擎126可以首先使用vq码本134经由向量量化来量化数据库项132。在向量量化中,每个数据库向量被指派来自vq码本134的vq码字。vq码字表示vq码本134中的具体条目,并且vq码本134中的每个条目是聚类中心,或者换句话说,是最佳地表示聚类的数据点。因此,实际上,向量量化将每个数据库项与聚类相关联。vq码本134由量化引擎126学习和生成,并且数据库项的指派可以与vq码本134的生成同时发生。vq码本134可以具有m个条目,其可以在学习vq码本134时确定或者可以作为参数提供。因此,数据库项132可以被划分为m个分区。量化引擎126将用于每个数据库项的vq码字存储为量化的数据库项130中的量化的数据库项的第一部分。这表示分层量化中的第一层。量化引擎可以使用vq码字和vq码本134来为每个数据库项生成残差。残差可以被定义为数据库向量与和数据库向量相关联的聚类中心之间的差。可以通过从聚类中心向量中减去数据库向量来计算差(或者反过来)。因此,量化引擎126可以使用向量量化来获得残差数据集(例如,数据库项残差232),其具有比原始向量(例如,数据库项132)小得多的直径。换句话说,数据库项残差232仍然具有d维,但是向量中浮点数的值内的方差减小。量化引擎126可以仅临时存储这些残差232,因为它们在层级的另一个层中被进一步量化。当使用积量化(第二层)进一步量化时,较小直径产生量化误差的显著降低。在一些实现中,量化引擎126可以使用学习到的旋转来旋转数据库项残差232。学习到的旋转可以用于实现信息到由通过积量化生成的各种子空间的最佳分布。可以优化学习到的旋转以使用随机梯度下降来减少误差。可以与vq码本134和pq码本136联合学习旋转以最小化量化误差。因此,学习到的旋转提供了比随机旋转更小的量化误差。但是,在一些实现中,可以不执行旋转或随机旋转。如果数据库项残差向量232经历学习到的旋转,那么将其称为经变换的或经变换的残差。在一些实现中,经变换的残差可以经历另一个轮向量量化,从而将层添加到层级。在每次向量量化之后,系统可以再次计算残差,其可以经历积量化。然后,量化引擎126将可以被变换的数据库项残差232投影到k个子空间中。子空间可以被定义为来自每个残余数据库项向量的元素块,其出现在相同的向量位置处。在一些实现中,d可被k整除,使得每个块包括相同数量的元素。这种实现在图2中示出,其中每个子空间是六个元素的块。在一些实现中,即使d可被k整除,直接除也可能导致其中每个子空间中的元素的数量不相等的子空间。在一些实现中,除法可以基于向量的随机或学习到的投影。在一些实现中,可以通过为每个第一mod(d,k)子空间指派额外的维度来生成可变大小的子空间。在这样的实现中,每个块中的元素的数量可以不相等。在图2所示的示例中,投影或除法产生k个子空间或块,每个子空间具有n行六个元素。一旦将经变换的残差向量投影到子空间中,量化引擎126就可以生成pq码本136。pq码本136可以包括每个子空间一个码本。因此,使用图2的示例,pq码本136包括k个pq码本。在一些实现中,每个子空间的pq码本可以统称为用于数据库项132的pq码本。每个pq码本可以包括用于j个聚类中的每一个的条目。当生成pq码本136时可以确定聚类的数量j,或者可以将数量j作为参数传递给量化引擎126。例如,参数可以指示量化引擎126应当为每个码本生成16个聚类,或者为每个码本生成256个聚类。在一些实现中,聚类的数量(即,j的值)可以取决于寄存器(例如,simd寄存器)的尺寸。换句话说,为了改善计算时间,聚类的数量可以限于系统中的寄存器可以执行的并行查找的数量。生成聚类时,每个聚类都将具有聚类中心。聚类中心是码本中用于那个聚类的条目。例如,在图2中,子空间k(即,块(k))具有来自n个向量中的每一个的六个元素(经变换的残差)。量化引擎126可以将六个元素的n个向量中的每一个聚类成j个聚类中的一个。当然,聚类中心不需要匹配数据库向量子空间,但可以表示作为聚类中心的六个元素。为了便于讨论,第k个子空间的码本可以用s(k)表示。因为每个码本具有j个条目,所以码本中的第j个条目可以表示为在一些实现中,系统可以联合地利用变换(例如,旋转)来学习vq码本和pq码本的聚类中心。量化引擎126可以使用基于欧几里德距离或k均值的常规聚类算法并使用随机梯度下降,其中在每次迭代时,在小批量数据上计算量化误差的梯度以用于数据点到码字的固定指派。在执行下降步骤后,将重新计算数据库项的码字指派。以这种方式,将码字指派给数据库项可以与学习码本同时进行。为了在保持正交性的同时优化残差的正交变换,量化引擎126可以通过正交矩阵的cayley表征来对变换进行参数化,正交矩阵由r=(1-a)(i+a)-1表示,其中a是偏斜对称矩阵,即a=-at,并且i是尺寸为dxd的单位矩阵。偏斜对称矩阵a的参数是d(d-1)/2,因此计算变换矩阵r可以涉及在每次迭代时涉及dxd矩阵求逆。如果d是高维的(例如,大于数千),那么系统可以限制a的参数的数量。这权衡了容量和计算成本。在一些实现中,量化引擎126可以使用来自数据库项132的数据库的随机样本来初始化vq码本134,并且可以使用独立样本的集合的残差(例如,在向量量化之后)来初始化pq码本。为了允许向量量化层有机会划分空间,量化引擎126可以在初始化pq码本136并进行完全联合训练之前仅优化几个时期的向量量化误差。量化引擎126可以通过从采样来初始化偏斜对称矩阵a的参数。在一些实现中,系统可以经由m维(对于vq码本)或j维(对于pq码本)的一个热指派向量将数据库向量指派给码本中的条目。除了表示聚类指派的位置之外,用于向量x(例如,αx)的一个热指派向量或用于向量x的第k个子空间的一个热指派向量(例如,)可以全为零。在一些实现中,用于x的指派向量(例如,αx)可以是量化的数据库项。换句话说,在一些实现中,指派向量可以是码字。因此,指派向量和码本的点积可以提供向量x(或向量x的第k个子空间)的聚类中心(例如,量化)。在一些实现中,量化的数据库项中的信息可以是指向码本条目的指针。量化引擎126可以通过串联来自不同级别的码字来生成量化的数据库项。在图2的示例中,首先是vq码字,然后是用于k个子空间中的每一个的pq码字。如果系统100使用附加层,那么可以按量化的次序串联来自每个附加层的码字(或多个字字)。例如,如果系统在积量化之前执行另一个层向量量化,那么用于第二层向量量化的码字将跟在用于积量化的码字之前的第一向量量化层的码字后面。量化引擎126可以存储量化的数据库项130、vq码本134、pq码本136和学习到的变换矩阵r,以供查询引擎120使用。一旦量化引擎126已经生成码本,学习到了旋转,并且生成了量化的向量(例如,量化的数据库项130),系统100就准备好使用vq码本134、pq码本136、学习到的变换矩阵r和量化的数据库项130来响应查询。因此,模块可以包括查询引擎120。查询引擎120可以被配置为使用码本和量化的数据库项130来识别响应于查询182的数据库项132并且响应于查询182提供结果184。查询引擎120可以包括使用常规技术从查询182创建查询向量的模块或引擎。查询引擎120可以确定查询与来自vq码本134的哪些聚类最接近。在一些实现中,这可以包括计算查询向量和每个聚类中心之间的内积并选择具有最大内积的聚类中心。在一些实现中,查询引擎120可以选择多于一个聚类中心为“最接近”,例如,选择具有最高内积的前t个聚类。因此,查询引擎120可以确定用于查询182的vq码字(或多个码字)。查询引擎120可以通过将查询向量的比较限制到仅共享vq码字的那些量化数据库项来使用vq码字(或多个码字)以减少内积搜索的计算时间。因此,不是将查询向量与每个数据库项进行比较,而是仅考虑共享vq码字的那些数据库项。当然,如果查询引擎120选择多个vq码字,那么与附加vq码字对应的量化的数据库项也将包括在与查询182的比较中。然后,系统例如通过从与vq码字对应的聚类中心中减去查询向量来计算查询182的残差。如果系统100已经变换了量化的数据库项,那么查询引擎120还可以变换残差查询向量。系统可以将残差查询向量投影到子空间中。查询残差被投影到的子空间匹配数据库项132被投影到的子空间。因此,残差查询向量可以具有k个子空间。在一些实现中,查询引擎120可以生成查找表138。查找表138可以存储每个子空间中的每个聚类中心和查询向量的对应子空间的内积的结果。因此,系统可以预先计算每个pq码本中的每个数据点和对应的残差查询向量子空间之间的内积,并将结果存储在查找表138中。这可以产生表或数据库,其中可以通过知道用于任何特定子空间(例如,哪个子空间中的哪个聚类)的pq码字来访问内积的结果。在一些实现中,查找表138可以存储在寄存器中,例如,存储在simd寄存器中。在一些实现中,每个子空间可以具有存储在寄存器中的查找表138,从而给出k个查找表。查询引擎120可以使用查找表138来大大加速搜索,甚至在存储器表中也是如此。但是,使用寄存器中的表可能意味着基于寄存器的容量选择j,例如16或32。然后,查询引擎120可以确定与所选择的vq码字相关联的每个量化的数据库项和查询的内积。为了实现这一点,查询引擎120可以针对每个被检查的量化的数据库向量确定每个子空间中的pq码本指派(即,pq码字),并确定由那个子空间中的pq码本指派表示的数据点和残差查询向量的对应子空间的内积。在使用查找表138的实现中,系统可以在表中查找pq码本条目和子空间。因此——查询引擎120可以使用对查找表138的查找,而不是执行查询和用于数据库项的pq码本条目之间的内积操作。如上面所指示的,在一些实现中,查找表138可以存储在寄存器中,并且系统可以存储用于寄存器中的数据库项的对应pq码字。以这种方式,系统可以在一个cpu周期中执行16次并行(或32次并行)查找。在其它实现中,系统可以执行内积。查询引擎120可以将数据库项和查询之间的内积近似为量化的数据库项的pq部分(第二部分,或第二层部分)和查询之间在每个子空间中的内积的结果的总和。换句话说,使用图2的示例,查询和dbv1之间的近似内积是量化的搜索项1的量化的块(1)到量化的块(k)和残差查询向量之间的内积的总和。这可以表示为其中s(k)是第k个子空间的查找表,并且是用于数据库项x的第k个子空间的pq码字。一旦查询引擎120使用上述近似确定了具有最高内积的数据库项,搜索就已经确定了响应于该查询的数据库项。在一些实现中,查询引擎120可以包括排名引擎,该排名引擎按照相似性得分(即,最高内积)对结果184进行排序。查询引擎120可以提供结果184以供客户端设备(诸如客户端170)显示。当然,响应数据库项可以用于其它目的,诸如分类。可伸缩推理系统100可以通过网络160与(一个或多个)客户端170通信。客户端170可以允许用户向查询引擎120提供查询182并接收结果184,结果184包括使用量化的数据库项基于与搜索查询的近似内积响应于查询而找到的数据库项。网络160可以是例如互联网或者网络160可以是使用例如网关设备、网桥、交换机等实现的有线或无线局域网(lan)、广域网(wan)等。经由网络160,可伸缩推理系统100可以与客户端170通信或从客户端170发送数据。在一些实现中,客户端170可以包括应用,诸如执行查询引擎120的一些或全部功能的搜索应用175。例如,与数据库项132相比,量化的数据库项130不占用太多存储器,并且可以具有适合于在客户端上(诸如在数据存储180中)存储的尺寸。数据存储180可以包括任何类型的非易失性存储器,诸如闪存、sd、ram、盘等。服务器110可以将量化的数据库项130、vq码本134和pq码本136发送到客户端170,并且搜索应用175可以执行上面关于查询引擎120描述的动作。在一些实现中,客户端170可以是另一个服务器或系统。客户端170可以是计算设备800或计算设备700的另一个示例。在一些实现中,可伸缩推理系统100可以与提供对数据库项132的更新的其它计算设备通信或包括提供对数据库项132的更新的其它计算设备。可伸缩推理系统100表示一个示例配置,并且其它配置是可能的。此外,系统100的部件可以以与所示不同的方式组合或分布。例如,在一些实现中,查询引擎120和量化引擎126中的一个或多个可以组合成单个模块或引擎。此外,查询引擎120、量化引擎126的部件或特征可以分布在两个或更多个模块或引擎之间,或甚至分布在多个计算设备上。例如,数据库项132和/或量化的数据库项130可以分布在多个计算设备上。图3图示了根据实现的、用于使用分层量化来准备项的数据库用于快速最大内积搜索(mips)的示例处理300的流程图。处理300可以由可伸缩推理系统(诸如图1的系统100)执行。处理300是由图1的量化引擎126执行的单个数据库项的分层量化的示例。应该理解的是,系统还可以同时对所有数据库向量执行处理300,并且处理300可以与生成或学习用于量化的码本同时执行,如关于图5更详细地描述的。处理300可以由系统周期性地执行,使得生成的量化的数据库项和码本保持最新。例如,系统可以每天执行一次处理300、每周执行一次、每小时执行一次等,这取决于用新项更新项的数据库的频率。处理300可以从可伸缩推理系统为每个数据库项(即,每个数据库向量)指派向量量化(vq)码本中的条目开始(305)。换句话说,系统可以为每个数据库项指派vq码字。vq码字指向vq码本中的条目,该条目包含(或指向)聚类中心。因此,vq码字也可以称为聚类标识符。聚类中心是与数据库项向量具有相同维度的向量,并且最能代表聚类中的数据库项。可以经由学习处理生成vq码本,该学习处理还可以执行数据库项到vq码本条目的映射。将相应的vq码字指派给数据库项是分层量化中的第一级,并且用于每个数据库项的vq码字是量化的数据库项的第一级部分。形式上,向量量化可以表示为其返回用于x的向量量化码字,是具有m个条目的向量量化码本(例如,码本134),并且ui是第i个条目。系统可以计算每个数据库项的残差向量(310)。残差向量是数据库项向量与和该数据库项的vq码字对应的聚类中心之间的差。真实世界数据常常是可聚类的,聚类的直径大大低于作为整体的数据集的直径。因此,系统可以使用向量量化来获得具有小得多的直径的残差数据集,从而当利用积量化进行量化时产生量化误差的显著减小。因此,分层量化利用非常适合于近似低维分量的向量量化,以及非常适合于从残差中捕获高维数据的积量化。在一些实现中,系统可以对残余向量执行学习到的旋转或变换(315)。在一些实现中,与码本一起学习旋转。如图6c所证明的,学习到的旋转提供了更好的召回。学习到的旋转可以是应用于向量量化的残差的矩阵在一些实现中,变换可以是随机的,但是固定的,置换。换句话说,置换是随机生成的,但是一旦生成置换,它就是固定的并且可以应用于所有数据库向量和所有查询向量。但是,随机变换不产生与学习到的旋转相同的召回。在一些实现中,步骤315是可选的,并且残差向量保持不变。系统可以将每个残差向量投影到子空间中(320)。在一些实现中,每个子空间可以具有来自向量的相等数量的元素。在一些实现中,子空间可以不具有相等数量的元素。子空间也可以称为块。系统可以为子空间指派用于该子空间的积量化(pq)码本中的条目(325)。在一些实现中,指派可以作为通过聚类处理生成pq码本的一部分而发生。因此,用于特定子空间的pq码本包括用于每个聚类的条目,其中聚类中心作为条目。聚类中心具有与子空间中残差向量的部分相同数量的元素。换句话说,每个子空间具有pq码本,并且每个码本具有j个条目。j的值可以取决于提供给生成pq码本的过程的参数,或者该过程可以基于数据确定值。在一些实现中,j的值可以取决于寄存器(例如,simd寄存器或其它寄存器)的容量。例如,j的值可以是16,使得单个寄存器可以保存用于子空间k的整个pq码本(例如,s(k))。每个数据库向量子空间可以被映射到或指派给用于该子空间的码本中的j个条目之一。用于子空间k的pq码本中的具体条目j被表示为在一些实现中,指派可以作为生成码本的一部分而发生。例如,当使用聚类时,可以将每个残余向量子空间指派给聚类之一,因为聚类是从用于子空间的残差向量生成的。系统可以通过将vq码字与用于每个子空间的每个pq码字串联来为每个数据库向量生成量化的向量(330)。vq码字可以是用于层级的第一级的码字,并且pq码字(每个子空间一个)可以用于层级的第二级。因此,在分层量化中,数据库向量x可以由下式近似其中返回用于x的vq码字,是具有m个码字的向量量化码本,矩阵是应用于向量量化的残差的学习到的旋转,并且积量化器由下式给出:通过将经旋转的残差rx划分到k个子空间1到k中而获得的码字的串联,以及通过向量量化器独立地量化子空间以最小化量化误差:其中是用于第k个子空间(具有j个条目)的pq码本。x的最终量化的表示通过串联φvq(x)的索引和k=1,...,k的k个索引来给出。这个表示,即,量化的数据库项,具有log2m+klog2j的总位速率,其中m是vq码本中的条目的数量,j是每个pq码本中的条目的数量,并且k是子空间的数量。系统可以将每个量化的数据库项与vq码本、pq码本和学习到的旋转r一起存储在数据存储、数据库或其它存储器中。然后,处理300结束,生成的结构可以用于以高效的方式和准确的方式近似查询项和数据库项之间的最大内积。虽然图3图示了具有两个层的层级,但是系统可以在层级中包括多于两个层。例如,系统可以根据需要和/或由数据支持来执行一个或多个附加向量量化层或一个或多个附加积量化层。每个附加层将向量化的数据库项添加附加码字。此外,每层接收在前一层中计算出的残差。图4图示了根据所公开的主题的、用于使用分层量化来识别响应数据库项的示例处理400的流程图。处理400可以由可伸缩推理系统(诸如图1的系统100)执行。可以在每次接收到查询时执行处理400,以便确定具有和查询向量的最大内积的数据库项。具有最高内积的那些项对查询的响应最快,或者换句话说,最像查询。查询向量还可以表示要分类的项,例如,作为具有大量输出节点的神经网络的最后一层的一部分。处理400可以从系统确定查询向量和vq码本中的每个条目的内积开始(405)。这提供了与查询最相似的vq码字。系统可以选择最相似的vq码本条目(基于内积计算的结果)并计算查询的残差(410),例如,作为查询向量与选择的vq码本条目之间的差。在一些实现中,系统可以选择多于一个“最相似的”vq码本条目,例如,选择t个最相似的条目(例如,t=2或t=5等等,并且t<m)。在这样的实现中,系统可以为每个选择的vq码本条目生成残差,使得每个选择的向量量化条目具有相应的残差查询向量。系统可以变换残差查询向量(415)。在使用变换的实现中,变换或旋转与图3的步骤315中使用的变换或旋转相同。可伸缩推理系统还可以将残差查询向量(或多个向量)投影到子空间(420)中。以与数据库项向量的投影相同的方式完成查询向量的投影,作为图3中步骤320的一部分。然后,系统可以可选地生成查找表(425)。查找表可以对于每个pq码本的每个条目包括一个条目。为了生成表,系统可以对于每个子空间(即,每个pq码本)执行子空间中残差查询向量的元素和子空间中每个pq码本条目的元素之间的内积。因此,如果码本具有j个条目,那么查找表将具有用于那个子空间的j个条目。作为下面的步骤435的一部分,系统可以使用查找表来加速与量化的数据库项的内积的计算,但是查找表的使用是可选的。在一些实现中,查找表存储在寄存器中,并且j的值受寄存器的特点约束,例如,是16或32。然后,系统可以计算共享在步骤410中选择的vq码字(vq码本条目)的每个量化的数据库项的相似性得分。因而,系统可以选择共享vq码字的量化的数据库项(430),并且为每个子空间计算那个子空间中的残差查询元素和用于该子空间的量化的数据库项元素之间的内积(435),这由子空间中的pq码本条目指派(例如,图2的量化的块1或量化的块(k))表示。在一些实现中,系统可以从量化的数据库项的子空间中确定pq码本条目,确定pq码本条目的数据点(例如,聚类中心),并计算残差查询子空间和数据点之间的内积。在使用查找表的实现中,系统可以确定量化的数据库项子空间的pq码本条目,并在查找表中查找用于那个pq码本条目的内积结果。系统可以通过对如在步骤435中计算的每个子空间的内积求和来计算用于数据库项的相似性得分(440)。相似性得分是量化的数据库项和查询之间的近似内积。如果将查询和数据库项向量投影到k个子空间中,那么系统可以对k个值求和,每个值表示针对子空间的内积计算。系统可以重复步骤430至440(445,是),直到已经为映射到与残差查询向量相同的vq码字的每个数据库项计算出相似性得分(445,否)。在使用码本查找表的实现中,步骤430至440也可以表述为其中k是k个子空间的第k个子空间,j是pq码本中j个条目的第j个条目,是经旋转的残差查询向量,其中作为第k个子向量并且是作为残差查询向量和pq码本条目之间的内积的查找表条目(例如,其中是用于第k个子空间的pq码本的第j个条目)。当码本查找表存储在寄存器中时,系统可以利用中央处理器(cpu)的指令级并行化能力。例如,系统可以使用一个寄存器(例如,simd寄存器)来保持查找表v(k),并且使用另一个寄存器来保持用于给定的量化的数据库项的pq码字的索引。在这样的实现中,在一个cpu周期中,系统可以使用寄存器指令来执行若干并行查找,例如16个并行查找(pshufb,ssse3)或32个并行查找(vpshufb,avx2)。这表示对存储器中码本查找表的显著改进,存储器中码本查找表仅具有每个cpu周期一次查找的吞吐量。如果系统选择多个vq码字作为与查询向量“最相似”,那么系统可以对其它vq码字重复步骤425至445。然后,系统可以返回具有最高相似性得分的数据库项,例如,识别数据库项或数据库向量本身的标识符(450)。如图4中所示,vq码字用于减少例如经由内积操作为其比较查询向量的数据库项的数量。这减少了处理时间,从而改进了系统的响应性,同时残差的积量化提供了高准确度。由系统执行的搜索的复杂性可以表述为其中k是子空间的数量,m是向量量化器的数量(例如,vq码本中的条目的数量),t是为查询向量选择的vq码字的数量,并且n是数据库项的数量。在一些实现中,系统可以使用精确的点积计算来重新评分最高得分数据库项。换句话说,系统可以为具有最高相似性得分的项计算精确点积,并使用该精确点积来确定将呈现给查询请求器的数据库项。例如,系统可以使用n个项作为查询请求器的搜索结果,并计算查询向量和使用量化向量确定的前10*n个(例如具有最高相似性得分的那10*n个)数据库项的数据库向量之间的精确点积。然后,系统可以使用具有最高实际点积的前n个数据库项。这提高了搜索结果的准确性,但是比计算所有数据库项的点积需要更少的时间来确定。系统可以提供搜索结果,该搜索结果包括关于那些项的信息以供显示给提供查询的用户。然后,处理400结束,识别出了响应最快的项。图5图示了根据所公开的主题的、用于联合学习正交变换和用于分层量化的码本的示例处理500的流程图。处理500可以由可伸缩推理系统(诸如图1的系统100)执行。处理500训练和优化依赖任务的目标函数,以预测每个分层的层中的聚类以及从来自数据库的随机样本开始的可选的学习到的旋转。为了联合训练参数(码本和正交变换),系统使用随机梯度下降,其中在每次迭代时,在小批量数据上计算量化误差的梯度,用于数据点(数据库项)到码字的固定指派。在执行下降步骤后,重新计算针对数据点的码字指派。换句话说,处理500使用迭代处理在求解每层的码本和将数据库项到码本条目的指派之间交替。处理500可以作为图3的处理300的一部分或与其同时执行。处理500可以从可伸缩推理系统为每个vq码本条目指派随机数据库向量开始(505)。系统可以使用小批量数据上的随机梯度下降来优化几个时期的向量量化误差(510)。这允许向量量化在初始化pq码本条目和进行完全联合训练之前分割空间的机会。系统可以通过以下方式初始化pq码本条目:从向量量化为独立样本集合生成残差,将残差投影到子空间中,并且从残差的相应子空间指派pq码本值中的条目(515)。系统还可以通过使用来自的采样填充偏斜对称矩阵来初始化旋转矩阵。然后,系统可以使用小批量(例如,2000项)数据上的随机梯度下降来优化向量量化误差、变换误差和积量化误差(525)。这可以包括找出被违反的约束的集合(但不一定是所有被违反的约束),使用梯度下降调整对于检测到的违反的码本指派,以便违反不再显示为具有大于具有最大点积的数据库项的近似。当使用分层的层(即,使用码本和变换)生成的近似点积指示第一量化的数据库项与查询之间的值大于第二量化的数据库项与查询之间的值时,发生被违反的约束,但第二数据库项(即,原始数据库项向量)实际上具有与查询的最高点积。换句话说,近似指示第一数据库项具有比第二数据库项更高的相似性,但查询和第二项的实际内积最相似(具有最大内积)。作为一个示例,系统可以使用在kingma等人的“adam:amethodforstochasticoptimization”,corr,abs/1412.6980,2014中描述的adam优化算法来优化参数。系统可以确定是否需要上述步骤的附加迭代(530)。如果在步骤525中未发现违反,那么迭代可以完成。如果迭代达到设定的数量(例如,30),那么迭代可以完成。如果迭代未完成(530,否),那么系统可以通过查找违反、调整指派和调整码本来继续调整参数。如果迭代完成(530,是),那么处理500结束,从而生成vq码本、pq码本和学习到的变换。当系统在层级中包括附加层时,以类似方式联合学习附加码本。图6a至6d图示了使用分层量化的实现的益处。在图6a至6d的示例中,跨四个基准数据库比较分层量化和其它量化处理的评估。表1图示了四个数据库的特点:数据集维度(d)尺寸(n)movielens15010,681netflix30017,770word2vec_text820071,291word2vec_wiki5003,519,681表1图6a图示了不同距离计算的效率的比较。具体而言,图6a图示了在数据库的线性搜索中每个查询花费的时间(以μs为单位)。在图6a中,使用寄存器内码本查找表(lut16)的分层量化与1)二进制码的hamming距离(使用xor和popcnt指令;以及2)到积量化码的不对称距离(pq,使用存储器中的查找表)进行比较。所有三者都使用相同数量的位(64):hamming使用64位二进制码,pq使用8个子空间,每个子空间有256个量化器,并且lut16使用16个子空间,每个子空间有16个量化器。定时包括距离计算和前n选择。在图6a的示例中,计算在3.5ghzhaswell机器上利用单线程完成,并且cpu缩放被关闭。如图所示,lut16优于pq和hamming,并且分层量化(lut16)明显快于具有存储器中查找表的pq(在较大的数据库中为5倍)并且比hamming距离计算略快。图6b图示了在所有四个数据库上取回(retrieving)前10个邻居时的精确度/召回曲线。图6b比较使用寄存器中的码本查找表(分层)的分层量化与四种基线方法:签署的alsh、简单lsh、复合量化和quips。签署的alsh在shrivastava等人的“animprovedschemeforasymmetriclsh”,corrabs/1410.5410,2014中描述,lsh在neyshabur等人的“asimplerandbetterlshformaximuminnerproductsearch(mips)”,arxivpreprintarxiv:1410.5518,2014中描述,复合量化在du等人的“innerproductsimilaritysearchusingcompositionalcodes”,corr,abs/1406.4966,2014中描述,并且quips在guo等人的“quantizationbasedfastinnerproductsearch”,arxivpreprintarxiv:1509.01469,2015中描述。在生成曲线时,使用蛮力搜索生成基础真实(ground-truth)mips结果,并与固定位速率设置中的基线方法和分层量化的结果进行比较。图6b图示了分层量化倾向于明显优于所有四种基线方法,在越大的数据库上具有越好的性能。因此分层量化是高度可伸缩的。图6c图示了用于取回前10个邻居的召回@n,从而比较具有和不具有最大数据库(例如,word2vec_wiki)上的残差的学习到的旋转的分层量化。图6c图示了学习到的旋转对召回的显著提升。图6d图示了在最大数据库上搜索vq分区的不同部分时用于取回前10个邻居的召回@n。使用分层量化的系统使用向量量化将数据库分割成m个分区,并且仅搜索共享(例如,在图4的步骤410)为查询项选择的相同vq码字的那些数据库项。因此,系统搜索数据库的一小部分。这加快处理时间,但会影响召回。图6d图示了在不同搜索分数(fraction)t/m下的最大数据集的召回曲线(其中t是为查询项选择的vq码字的数量,并且m是vq码本中的分区的总数)。如图6d所示,当搜索分数为1/4(25%)时实际上没有召回损失,并且当搜索分数为1/16(6.25%)时损失小于2%。因此可以调整所选分区的数量(t)以有利于速度(较低的t)或召回(较高的t),但是图6d图示了t可以远低于m并且仍然获得准确的结果。图7示出了可以与这里描述的技术一起使用的通用计算机设备700的示例,其可以是图1的服务器110和/或客户端170。计算设备700旨在表示计算设备的各种示例形式,诸如膝上型计算机、台式机、工作站、个人数字助理、蜂窝电话、智能电话、平板电脑、服务器和其它计算设备,包括可穿戴设备。这里示出的部件、它们的连接和关系以及它们的功能仅仅意味着是示例,并不意味着限制本文档中描述和/或要求保护的发明的实现。计算设备700包括经由接口708连接的处理器702、存储器704、存储设备706和扩展端口710。在一些实现中,计算设备700可以包括经由接口708连接的收发器746、通信接口744和gps(全球定位系统)接收器模块748以及其它部件。设备700可以通过通信接口744无线通信,通信接口744可以在必要时包括数字信号处理电路系统。部件702、704、706、708、710、740、744、746和748中的每一个可以适当地安装在公共主板上或以其它方式安装。处理器702可以处理指令以供在计算设备700内执行,包括存储在存储器704中或存储设备706上的指令,以在外部输入/输出设备(诸如显示器716)上显示gui的图形信息。显示器716可以是监视器或平板触摸屏显示器。在一些实现中,可以适当地使用多个处理器和/或多个总线以及多个存储器和多种类型的存储器。而且,可以连接多个计算设备700,其中每个设备提供必要操作的部分(例如,作为服务器组、一组刀片服务器或多处理器系统)。存储器704存储计算设备700内的信息。在一个实现中,存储器704是易失性存储器单元。在另一个实现中,存储器704是非易失性存储器单元。存储器704还可以是另一种形式的计算机可读介质,诸如磁盘或光盘。在一些实现中,存储器704可以包括通过扩展接口提供的扩展存储器。存储设备706能够为计算设备700提供大容量存储。在一个实现中,存储设备706可以是或包括计算机可读介质,诸如软盘设备、硬盘设备、光盘设备或带设备、闪存或其它类似的固态存储设备,或设备的阵列,包括存储区域网络中的设备或其它配置。计算机程序产品可以有形地在这样的计算机可读介质中实施。计算机程序产品还可以包括在执行时执行一种或多种方法(诸如上面描述的那些方法)的指令。计算机或机器可读介质是诸如存储器704、存储设备706或处理器702上的存储器之类的存储设备。接口708可以是管理计算设备700的带宽密集型操作的高速控制器或者管理较低带宽密集型操作的低速控制器,或这些控制器的组合。可以提供外部接口740,以便能够使设备700与其它设备进行近区域通信。在一些实现中,控制器708可以耦合到存储设备706和扩展端口714。可以包括各种通信端口(例如,usb、蓝牙、以太网、无线以太网)的扩展端口可以例如通过网络适配器耦合到一个或多个输入/输出设备,诸如键盘、指示设备、扫描仪或联网设备(诸如交换机或路由器)。计算设备700可以以多种不同的形式实现,如图中所示。例如,它可以被实现为标准服务器730,或者在一组这样的服务器中多次实现。它也可以作为机架服务器系统的一部分来实现。此外,它可以在诸如膝上型计算机722之类的个人计算机或者智能电话736中实现。整个系统可以由彼此通信的多个计算设备700组成。其它配置也是可能的。图8示出了可以与这里描述的技术一起使用的通用计算机设备800的示例,其可以是图1的服务器110。计算设备800旨在表示大规模数据处理设备的各种示例形式,诸如服务器、刀片服务器、数据中心、大型机和其它大规模计算设备。计算设备800可以是具有通过一个或多个通信网络互连的多个处理器的分布式系统,可能包括网络附连的存储节点。这里示出的部件、它们的连接和关系以及它们的功能仅仅意味着是示例,并不意味着限制本文档中描述和/或要求保护的发明的实现。分布式计算系统800可以包括任何数量的计算设备880。计算设备880可以包括通过局域网或广域网、专用光链路、调制解调器、网桥、路由器、交换机、有线或无线网络等进行通信的服务器或机架服务器、大型机等。在一些实现中,每个计算设备可以包括多个机架。例如,计算设备880a包括多个机架858a-858n。每个机架可以包括一个或多个处理器,诸如处理器852a-852n和862a-862n。处理器可以包括数据处理器、网络附连的存储设备以及其它计算机控制的设备。在一些实现中,一个处理器可以作为主处理器操作并控制调度和数据分发任务。处理器可以通过一个或多个机架开关858互连,并且一个或多个机架可以通过开关878连接。交换机878可以处理多个连接的计算设备800之间的通信。每个机架可以包括存储器(诸如存储器854和存储器864),以及存储装置(诸如856和866)。存储器856和866可以提供大容量存储装置,并且可以包括易失性或非易失性存储装置(诸如网络附连的盘、软盘、硬盘、光盘、磁带、闪存或其它类似的固态存储器设备),或者设备的阵列,包括存储区域网络中的设备或其它配置。存储装置856或866可以在多个处理器、多个机架或多个计算设备之间共享,并且可以包括存储可由一个或多个处理器执行的指令的计算机可读介质。存储器854和864可以包括例如一个或多个易失性存储器单元、一个或多个非易失性存储器单元和/或其它形式的计算机可读介质,诸如磁盘或光盘、闪存、高速缓存、随机存取存储器(ram)、只读存储器(rom)及其组合。诸如存储器854之类的存储器也可以在处理器852a-852n之间共享。诸如索引之类的数据结构可以存储在例如存储器856和存储器854之间。计算设备800可以包括未示出的其它部件,诸如控制器、总线、输入/输出设备、通信模块等。诸如系统100之类的整个系统可以由彼此通信的多个计算设备800组成。例如,设备880a可以与设备880b、880c和880d通信,并且这些可以被统称为系统100。作为另一个示例,图1的系统100可以包括一个或多个计算设备800。其中一些计算设备可以在地理上彼此靠近定位,而其它计算设备可以在地理上位于远处。系统800的布局仅仅是示例,并且系统可以采用其它布局或配置。根据一个方面,一种计算机系统包括至少一个处理器和存储量化的项的数据库的存储器。每个量化的项包括第一码本中的第一条目和第二码本中的多个第二条目,其中多个第二条目中的每一个表示k个子空间的相应子空间。存储器还包括在由至少一个处理器执行时使系统执行操作的指令。操作可以包括从第一码本中确定与查询向量最相似的条目,从第一码本中的该条目和查询向量计算残差向量,使用学习到的变换变换残差向量,并将经变换的残差向量投影到k个子空间中。对于具有与第一码本中与查询向量最相似的条目匹配的第一条目的每个量化的项,操作还可以包括:为每个子空间计算量化的项和经变换的残差向量的内积,并通过对内积进行求和来计算量化的项和查询之间的相似性得分。操作还可以包括响应于查询而提供具有最高相似性得分的项。这些和其它方面可以包括下列特征中的一个或多个。例如,k可以是16并且操作还可以包括:对于每个子空间,计算经变换的残差向量和第二码本中的每个条目之间的内积,并将计算出的内积存储在码本查找表寄存器内存储装置中。每个子空间可以具有对应的寄存器。作为另一个示例,可以与第一码本和第二码本联合学习变换。在一些实现中,第一码本可以在初始化第二码本和执行联合学习之前经历初始化和x个学习时期。作为另一个示例,残差可以是第一码本中的条目与查询向量之间的差。数据库可以大,例如,具有数百万个量化的项。根据一个方面,一种方法包括聚类被表示为高维向量的数据库项的数据存储并为每个聚类选择聚类中心,并将聚类中心存储为第一层码本中的条目。该方法还可以包括,对于每个数据库项,基于数据库项被指派到的聚类的聚类中心来计算残差,将残差投影到子空间中,并且对于每个子空间确定第二层码本中用于该子空间的条目,并且第一层码本中的条目以及用于每个子空间的第二层码本中的相应条目存储为数据库项的量化的向量。这些和其它方面可以包括以下特征中的一个或多个。例如,量化的向量可以用于使用最大内积搜索来确定响应数据库项。作为另一个示例,该方法还可以包括在将残差投影到子空间中之前使用学习到的旋转来变换残差。作为另一个示例,该方法可以包括:基于内积运算从第一码本中确定与查询向量最相似的t个聚类,并且对于t个聚类中的每一个基于该聚类的聚类中心来计算查询向量的残差。该方法还可以包括将查询的每个残差投影到子空间中,并且对于指派给t个聚类之一的每个数据库项确定与查询向量的最大内积得分。最大内积得分基于在数据库项的残差和指派给数据库项的聚类的查询的残差之间计算的内积在子空间上的总和。该方法还可以包括基于最大内积得分从指派给t个聚类之一的数据库项中识别与查询向量最相似的数据库项。在一些实现中,与查询向量最相似的数据库项用于对由查询向量表示的项进行分类,或者响应于查询向量而提供数据库项。作为另一个示例,该方法可以包括在将残差投影到子空间中之前使用学习到的旋转来变换残差,其中用第一层码本和第二层码本的参数来联合训练学习到的旋转。根据一个方面,一种方法可以包括使用向量量化将数据库中的向量分割成m个分区,使得每个向量具有指派的向量量化码字,并且针对每个向量计算相应的残差,残差是向量与和向量量化码字对应的聚类中心之间的差。该方法还可以包括将积量化应用于每个残差,从而为每个残差产生用于k个子空间中的每一个的积量化码字,为每个向量存储指派的向量量化码字和用于向量的残差的k个积量化码字,并使用向量量化码字来选择数据库向量中与查询向量最相似的一部分。该方法还可以包括,对于该部分中的每个数据库向量,使用积量化码字从该与查询向量最相似的部分确定数据库向量。这些和其它方面可以包括以下特征中的一个或多个。例如,该方法还可以包括在应用积量化之前使用学习到的旋转来变换残差。学习到的旋转可以与用于向量量化的码本和用于积量化的码本联合学习。作为另一个示例,使用向量量化码字来选择数据库向量的一部分可以包括在查询向量和每个聚类中心之间执行内积以产生每个聚类中心的相似性值;以及选择具有最高相似性值的聚类中心。该部分是数据库中具有与t个聚类中心之一对应的向量量化码字的向量。作为另一个示例,相应残差是第一相应残差,向量量化码字是第一向量量化码字,并且该方法还可以包括使用第二向量量化将第一相应残差分割为多个第二分区,因此每个向量具有指派的第二向量量化码字,以及对于第一相应残差中的每一个计算第二相应残差,第二残差是第一相应残差与和第二向量量化码字对应的聚类中心之间的差。可以将积量化应用于第二相应残差,并且将第二向量量化码字与第一向量量化码字和k个积量化码字一起存储。各种实现可以包括在可编程系统上可执行和/或可解释的一个或多个计算机程序中的实现,该可编程系统包括至少一个可编程处理器,其可以是特殊的或通用的,被耦合成从存储系统、至少一个输入设备和至少一个输出设备接收数据和指令以及向存储系统、至少一个输入设备和至少一个输出设备发送数据和指令。这些计算机程序(也称为程序、软件、软件应用或代码)包括用于可编程处理器的机器指令,并且可以用高级过程和/或面向对象的编程语言来实现,和/或在汇编/机器语言中实现。如本文所使用的,术语“机器可读介质”、“计算机可读介质”是指用于向可编程处理器提供机器指令和/或数据的任何非瞬态计算机程序产品、装置和/或设备(例如,磁盘、光盘、存储器(包括读取存取存储器)、可编程逻辑器件(pld))。这里描述的系统和技术可以在包括后端部件的计算系统(例如,作为数据服务器)或包括中间件部件的计算系统(例如,应用服务器)或包括前端部件的计算系统(例如,具有图形用户界面或web浏览器的客户端计算机,用户可以通过该浏览器与这里描述的系统和技术的实现交互)中实现,或者包括这种后端、中间件或前端部件的任意组合的计算系统中实现。系统的部件可以通过任何形式或介质的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(“lan”)、广域网(“wan”)和互联网。计算系统可以包括客户端和服务器。客户端和服务器一般彼此远离,并且通常通过通信网络进行交互。客户端和服务器的关系凭借在相应计算机上运行并且彼此具有客户端-服务器关系的计算机程序而产生。已经描述了许多实现方式。但是,在不脱离本发明的精神和范围的情况下,可以进行各种修改。此外,图中描绘的逻辑流程不需要所示的特定次序或顺序次序来实现期望的结果。此外,可以提供其它步骤,或者可以从所描述的流程中消除步骤,并且可以将其它部件添加到所描述的系统或从所描述的系统中移除。因而,其它实现在以下权利要求的范围内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1