The case of learned index structures论文阅读(一)

The case of learned index structures论文阅读(一)

链接:https://pan.baidu.com/s/1L65BK2vZ_5qEny04bfHPoA 
提取码:z98n

学习索引结构的实例

摘要

        索引是模型:B树索引可以看作是将键映射到已排序数组中记录位置的模型,哈希索引可以看作是将键映射到未排序数组中记录位置的模型,位图索引可以看作是指示数据记录是否存在的模型。在这篇探索性的研究论文中,我们从这个前提出发,假设所有现有的指标结构都可以被其他类型的模型所取代,包括我们称之为学习指标的深度学习模型。其关键思想是,模型可以学习查找键的排序顺序或结构,并利用该信号有效地预测记录的位置或存在。我们从理论上分析了学习型指标在哪些条件下优于传统的指标结构,并描述了设计学习型指标结构的主要挑战。我们的初步结果表明,通过使用神经网络,我们能够以高达70%的速度 超过 缓存优化的B-树,同时在内存中比几个真实世界的数据集节省一个数量级。但更重要的是,我们认为,通过学习模型替换数据管理系统核心组件的想法对未来的系统设计具有深远的影响,这项工作只是提供了一个可能的一瞥。

1简介

        每当需要有效的数据访问时,索引结构就是答案,并且存在各种各样的选择来满足各种访问模式的不同需求。例如,B-树是范围请求的最佳选择(例如,检索某个时间帧中的所有记录);散列映射在单键查找中的性能很难击败;Bloom过滤器通常用于检查记录是否存在。由于索引对于数据库系统和许多其他应用程序的重要性,在过去几十年中,索引被广泛地调整,以提高内存、缓存和/或CPU效率[36、59、29、11]。然而,所有这些索引仍然是通用的数据结构;它们对数据分布没有任何假设,也没有利用现实世界中普遍存在的更常见的模式。例如,如果目标是构建一个高度优化的系统,以便在一组连续整数键(例如,键1到100M)上存储和查询固定长度记录的范围,那么就不会在键上使用传统的B树索引,因为键本身可以用作偏移量,因此查找任何键都是O(1)而不是O(logn)操作或一系列键的开头。类似地,索引内存大小也会从O(1)变化到O(n)。也许令人惊讶的是,对于其他数据模式,类似的优化是可能的。换句话说,知道准确的数据分布可以高度优化几乎任何索引结构。【当我们了解数据分布的情况下,其实可以优化数据库的索引

        当然,在大多数现实世界的用例中,数据并没有完全已知,并且为每个用例构建专门解决方案的工程消耗通常太高。然而,我们认为机器学习(ML)为学习反映数据模式的模型提供了机会,从而能够以较低的工程成本自动合成专门的索引结构(称为学习索引)。

        在这篇文章中,我们探索学习模型,包括神经网络,在多大程度上可以用来增强,甚至取代传统的索引结构,从B-树到Bloom过滤器。这似乎有悖常理,因为ML不能提供我们传统上与这些索引相关联的语义保证,而且因为最强大的ML模型,神经网络,传统上被认为是非常昂贵的计算。是的,我们认为这些明显的障碍都没有看上去那么有问题。相反,我们使用学习模型的建议有可能带来显著的好处,特别是在下一代硬件上。

        在语义保证方面,索引在很大程度上已经是学习过的模型,因此用其他类型的ML模型替换它们非常简单。例如,B树可以被视为一个模型,它以键作为输入,并预测数据记录在已排序集中的位置(必须对数据进行排序,以实现有效的范围请求)。Bloom过滤器是一个二进制分类器,它基于一个key来预测一个key是否存在于一个集合中。显然,存在微妙但重要的差异。例如,Bloom过滤器可以有假阳性,但不能有假阴性。然而,正如我们将在本文中展示的,通过新的学习技术和/或简单的辅助数据结构来解决这些差异是可能的。

        在性能方面,我们观察到每一个CPU都已经具备强大的SIMD功能,我们推测许多笔记本电脑和手机很快就会有图形处理单元(GPU)或张量处理单元(TPU。我们也有理由推测,CPU-SIMD/GPU/TPU将变得越来越强大,因为与通用指令集相比,扩展神经网络使用的(并行)数学操作的限制集要容易得多。因此,在未来,执行神经网络或其他ML模型的高成本实际上可以忽略不计。例如,Nvidia和谷歌的tpu已经能够在一个周期内执行数千甚至数万个神经网络操作[3]。此外,有人指出,到2025年,GPU的性能将提高1000倍,而CPU的摩尔定律基本上已经失效[5]。通过用神经网络取代重分支索引结构,数据库和其他系统可以从这些硬件趋势中受益。虽然我们看到了在专业硬件上学习索引结构(如tpu)的未来,但本文完全关注于cpu,令人惊讶的是,即使在这种情况下,我们也可以取得显著的优势。

        值得注意的是,我们并不主张用学习型索引完全取代传统的索引结构。相反,本文的主要贡献是概述和评估一种新的索引构建方法的潜力,这是对现有工作的补充,可以说,为一个已有数十年的领域开辟了一个全新的研究方向。这是基于一个关键的观察,即许多数据结构可以分解为一个学习模型和一个辅助结构,以提供相同的语义保证。这种方法的潜在能力来自这样一个事实:描述数据分布的连续函数可以用来构建更有效的数据结构或算法。在对只读分析工作负载的合成数据集和真实数据集进行评估时,我们从经验上获得了非常有希望的结果。然而,许多开放的挑战仍然存在,例如如何处理写繁重的工作负载,我们概述了未来工作的许多可能方向。此外,我们相信我们可以使用相同的原理来替换(数据库)系统中常用的其他组件和操作。如果成功的话,将学习到的模型深入嵌入到算法和数据结构中的核心思想可能会导致与当前系统开发方式的根本不同。

        本文的其余部分概述如下:在接下来的两部分中,我们将介绍以B树为例学习索引的思想。在第4节中,我们将此思想扩展到哈希映射,在第5节中扩展到Bloom过滤器。所有部分都包含单独的评估。最后在第六节中我们讨论了相关的工作,并在第七节中总结。

2范围索引

        范围索引结构,像B-树,已经是模型:给定一个键,它们“预测”一个值在键排序集中的位置。要了解这一点,请考虑内存分析数据库(即只读)中排序主键列上的B树索引,如图1(a)所示。在这种情况下,B树提供从查找键到排序记录数组中某个位置的映射,并保证该位置的记录键是等于或高于查找键的第一个键。必须对数据进行排序,以允许有效的范围请求。同样的一般概念也适用于二级索引,其中数据是对的列表,键是索引值,指针是对记录的引用。

        【ML模型为什么可以替换B】出于效率原因,通常不索引已排序记录的每个键,而只索引第n个记录的键,即页面的第一个键。这里我们只假设固定长度的记录和连续内存区域(即单个数组)上的逻辑分页,而不是位于不同内存区域的物理页(物理页和可变长度的记录在附录D.2中讨论)。仅为每个页面的第一个键编制索引有助于显著减少索引必须存储的键的数量,而不会造成任何显著的性能损失。因此,B-树是一个模型,或者用ML术语来说,是一个回归树:它将一个键映射到一个具有最小和最大错误(最小错误为0,最大错误为页面大小)的位置,并保证如果该键存在,它可以在该区域中找到。因此,我们可以用其他类型的ML模型来代替索引,包括神经网络,只要它们也能够提供关于最小和最大误差的类似的有力保证。

        【图1理解】乍一看,似乎很难与其他类型的ML模型提供相同的保证,但实际上它却异常简单。首先,B树只对存储的key提供强最小和最大错误保证,而不是对所有可能的key。对于新的数据,B-树需要重新平衡,或者在机器学习术语中重新训练,以便仍然能够提供相同的错误保证。也就是说,对于单调模型,我们唯一需要做的就是对每个键执行该模型,并记住最坏的高估和低估一个位置来计算最小和最大误差。第二,更重要的是,甚至不需要明显的误差界限。无论如何,必须对数据进行排序以支持范围请求,因此任何错误都可以通过围绕预测进行的局部搜索(例如,使用指数搜索)来轻松纠正,因此,甚至允许使用非单调模型。因此,我们能够用任何其他类型的回归模型(包括线性回归或神经网络)替换B-树(见图1(B))。

        【ML 模型代替 B+ 树的挑战】现在,在用学习索引替换B树之前,我们还需要解决其他技术挑战。例如,对于插入和查找,B树的成本是很小,并且特别擅长利用缓存。此外,B树可以将键映射到没有连续映射到内存或磁盘的页。所有这些都是有趣的挑战/研究问题,在本节和附录中都有更详细的解释,以及潜在的解决方案。【如果模型不是单调递增时,当 key 不存在于 set 中,模型可能会返回一个不在最大最小误差范围内的 position】

        【使用ML模型替代B树的好处】同时,使用其他类型的模型作为索引可以提供巨大的好处。最重要的是,它有可能将B树查找的log(n)开销转换为一个常量操作。例如,假设一个数据集有1M个唯一键,值分别为1M和2M(因此值1000009存储在位置10)。在这种情况下,一个简单的线性模型,由一个简单的乘法和加法组成,可以很好地预测点查找或范围扫描的任何键的位置,而B树则需要log(n)操作。机器学习,特别是神经网络的优点在于,它们能够学习各种各样的数据分布、混合和其他数据特性和模式。挑战在于平衡模型的复杂性和准确性。

        【本文基本假设】对于本文中的大多数讨论,我们保留本节的简化假设:我们只索引按键排序的内存密集数组。这似乎有限制性,但许多现代硬件优化的B-树,例如FAST[44],做出了完全相同的假设,这些索引对于内存中的数据库系统来说是非常常见的,因为它们比扫描或二进制搜索具有更高的性能[44,48]。然而,虽然我们的一些技术可以很好地转换为某些场景(例如,Bigtable[23]中使用的具有非常大块的磁盘驻留数据),但对于其他场景(细粒度分页、插入繁重的工作负载等),还需要更多的研究。在附录D.2中,我们将更详细地讨论其中的一些挑战和潜在的解决方案。

2.1我们能承受什么样的模型复杂性?

        为了更好地理解模型的复杂性,重要的是要知道在遍历B树所需的时间内可以执行多少个操作,以及模型需要达到什么样的精度才能比B树更高效。【下段介绍】

        考虑一个B树,它索引100M记录,其中每个页面大小为100。我们可以把每个B树节点看作是一种划分空间、减少“错误”和缩小区域以查找数据的方法。因此,我们说页面大小为100的B树每节点的精度增益为1/100,我们需要遍历总共log100N个节点。所以第一个节点将空间从100M分割到100M/100=1M,第二个节点从1M分割到1M/100=10M,以此类推,直到找到记录为止。现在,用二进制搜索遍历一个B树页面大约需要50个循环,而且众所周知很难并行。相比之下,现代CPU每周期可以执行8-16个SIMD【单指令多数据流】操作。因此,只要模型的精度增益大于每50*8=400次算术运算的1/100,它就会更快。请注意,此计算仍然假设所有B树页都在缓存中。一次缓存未命中将花费50-100个额外的周期,因此将允许更复杂的模型。

        【机器学习的性能较高】此外,机器学习加速器正在完全改变游戏。它们允许在相同的时间内运行更复杂的模型,并从CPU上卸载计算。例如,NVIDIA最新的Tesla V100 GPU能够实现120teraflops的低精度深度学习算术运算(大约60000次/周期)。假设整个学习的索引符合GPU的内存(我们在第3.7节中显示,这是一个非常合理的假设),在短短30个周期内,我们可以执行100万个神经网络操作。当然,从GPU传输输入和检索结果的延迟仍然要高得多,但是考虑到批处理和/或最近更紧密地集成CPU/GPU/TPU的趋势,这个问题并不是不可克服的[4]。最后,可以预期,GPU/TPU的能力和每秒浮点/int操作的数量将继续增加,而在提高CPU的if语句执行性能方面的进展基本停滞[5]。尽管我们认为GPU/TPU是在实际应用中采用学习型指标的主要原因之一,但本文将重点放在更有限的CPU上,以便更好地研究在不受硬件变化影响的情况下,通过机器学习替换和增强指标的含义。

2.2范围索引模型是CDF模型

        如本节开头所述的,索引是以键为输入并预测记录位置的模型。而对于点查询,记录的顺序无关紧要,对于范围查询,必须根据查找键对数据进行排序,以便能够有效地检索范围内的所有数据项(例如,在时间范围内)。这导致了一个有趣的观察:一个模型,它可以预测给定的键key在排序数组中的位置,有效地近似于累积分布函数(CDF)【概率密度函数的积分】。我们可以对数据的CDF进行建模,以预测位置:

        其中p是位置估计,F(Key)是估计数据的累积分布函数【即】,用于估计观察小于或等于查找键p(X≤Key)的键的可能性,N是键的总数(另请参见图2)。这个观察打开了一个全新的有趣方向:首先,它意味着索引实际上需要学习数据分布。B树通过建立回归树来“学习”数据分布。线性回归模型通过最小化线性函数的(平方)误差来学习数据分布。第二,估计数据集的分布是一个众所周知的问题,学习索引可以受益于数十年的研究。第三,学习CDF在优化其他类型的索引结构和潜在算法方面也起着关键作用,我们将在本文后面概述。第四,关于理论CDF与经验CDF的接近程度的研究由来已久,为理论上理解这种方法的好处奠定了基础[28]。我们在附录a中对我们的方法进行了高水平的理论分析。

2.3 首先,自然学习索引

        【ML模型替换B树的实验】为了更好地理解通过学习的模型替换B树的需求,我们使用了200M的web服务器日志记录,目的是使用Tensorflow在时间戳上构建一个二级索引[9]。我们使用ReLU激活函数训练了一个每层32个神经元的两层全连接神经网络,时间戳是输入特征,排序数组中的位置是标签。之后,我们以Tensorflow和Python为前端,测量随机选择的键(不考虑第一个数字,在几次运行中平均)的查找时间。

        在这个设置中,我们实现了大约1250个预测/秒,即使用Tensorflow执行模型需要大约80000纳秒(ns),而不需要搜索时间(从预测位置找到实际记录的时间)。作为比较点,对相同数据的B树遍历大约需要300ns,对整个数据的二进制搜索大约需要900ns。仔细观察,我们发现我们的原始方法在几个关键方面是有限的:

        1.Tensorflow的设计目的是高效地运行更大的模型,而不是小的模型,因此,它有很大的调用开销,特别是使用Python作为前端时。

        2.B-树,或者一般的决策树,在通过一些操作来过度拟合数据方面非常好,因为它们使用简单的if语句递归地划分空间。相比之下,其他模型可以更有效地近似CDF的一般形状,但在单个数据实例级别上存在精确性问题。要看到这一点,请再次考虑图2。图中显示从顶层视图来看CDF函数看起来非常平滑和规则。然而,如果一个点放大到单独的记录,就会显示越来越多的不规则现象;众所周知的统计效应。因此,像神经网络、多项式回归等模型可以更节省CPU和空间,将一个项目的位置从整个数据集缩小到数千个区域,但一个神经网络通常需要在“最后一英里”占用更多的空间和CPU时间,以将误差从数千降到数百。

        3.B-树非常高效地进行缓存和操作,因为它们总是将顶级节点保存在缓存中,并在需要时访问其他页面。相比之下,标准的神经网络需要所有的权值来计算一个预测,这在乘法的数量上有很高的成本

3 RM索引

        为了克服这些挑战,探索 所研究的模型 作为索引替换或优化的潜力,我们开发了学习索引框架(LIF)、递归模型索引(RMI)和 standard-error-based搜索策略。我们主要关注简单的、完全连接的神经网络,因为它们的简单性和灵活性,但我们相信其他类型的模型可能会提供额外的好处。

3.1学习索引框架(LIF)

        LIF可以看作是一个索引合成系统,给定一个索引规范,LIF生成不同的索引配置,对其进行优化,并自动进行测试。虽然LIF可以动态学习简单的模型(例如线性回归模型),但它依赖于Tensorflow来学习更复杂的模型(例如NN)。然而,它从不使用Tensorflow进行推理。相反,给定一个训练的张量流模型,LIF自动从模型中提取所有的权重,并基于模型规范在C++中生成有效的索引结构。我们的代码生成是专门为小模型设计的,它消除了Tensorflow必须管理大模型的所有不必要的开销和工具。在这里,我们利用了[25]中的思想,它已经展示了如何避免Spark运行时不必要的开销。因此,我们能够执行30纳米级的简单模型。然而,应该指出的是,LIF仍然是一个实验性的框架,它被工具化以快速评估不同的索引配置(例如ML模型、页面大小、搜索策略等),除了通过编译器,我们不使用特殊的SIMD intriniscs。虽然这些低效率在我们的评估中并不重要,因为我们总是使用我们的框架、生产环境或在将报告的性能数字与其他实现进行比较时,确保公平的比较,但这些低效率应该得到考虑/避免。

3.2递归模型索引

        如第2.3节所述,构建替代B-树的学习模型的关键挑战之一是最后一英里搜索的准确性。例如,使用单一模型将100M记录的预测误差减少到数百倍的程度往往是困难的。同时,将误差从100M减小到10k,例如,通过模型替换B树的前两层,精度增益为100*100=10000,即使使用简单的模型也更容易实现。类似地,将误差从10k减少到100是一个简单的问题,因为模型只能关注数据的一个子集。基于这一观察结果,并受到专家工作组合的启发[62],我们提出了递归回归模型(见图3)。也就是说,我们建立了一个模型的层次结构,在每个阶段,模型以键作为输入,并基于它选择另一个模型,直到最后阶段预测位置。更正式地说,对于我们的模型f(x),其中x是键,y∈[0,N)是位置,我们假设在阶段个模型。我们在阶段0训练模型,。因此,阶段中的模型(用表示)是用来表示损失训练的:

        注意,这里我们使用的符号递归地执行。总的来说,我们迭代训练每个阶段的损失建立完整的模型。考虑不同模型的一种方法是,每一个模型都对键key的位置进行一定误差的预测,并使用该预测来选择下一个模型,该模型负责键key空间的某个区域,以较低的误差做出更好的预测。但是,递归模型索引不必是树。

        如图3所示,一个阶段的不同模型有可能在下面的阶段选择相同的模型。此外,每个模型并不一定覆盖与B-树相同数量的记录(即页面大小为100的B-树覆盖100条或更少的记录)。最后,根据使用的模型,不同阶段之间的预测不一定可以解释为位置估计,相反,应该被视为挑选对某些key有更好知识的专家(另见[62])。

        该模型体系结构具有以下优点:(1)将模型规模和复杂度与执行成本分离开来。(2) 它利用了这样一个事实,即很容易了解数据分布的总体形状。(3) 它有效地将空间划分为更小的子范围,如B-树,以便更容易地以更少的操作实现所需的“最后一英里”精度。(4) 两个阶段之间不需要搜索过程。例如,的输出直接用于在下一阶段选择模型。这不仅减少了管理结构的指令数,还允许将整个索引表示为TPU/GPU的稀疏矩阵乘法。

3.3混合索引

        递归模型索引的另一个优点是,我们能够构建模型的混合体。例如,在顶层,一个小的ReLU神经网络可能是最好的选择,因为它们通常能够学习大量复杂的数据分布,而在模型层次结构的底层的模型可能是数千个简单的线性回归模型,因为它们在空间和执行时间上都很便宜。此外,如果数据特别难学,我们甚至可以在底层使用传统的B-

        在本文中,我们主要讨论两类模型,一类是具有0到2个全连通的隐藏层和ReLU激活函数的简单神经网络(其层宽可达32个神经元),一类是B-树(a.k.a.决策树)。注意,零隐藏层NN等价于线性回归。给定一个索引配置,它指定阶段个数和每个阶段的模型个数,混合索引的端到端训练如算法1所示:

        【传统的图像识别问题往往通过分治法将其分解为预处理,特征提取和选择,分类器设计等若干步骤。分治法的动机是将图像识别的母问题分解为简单、可控且清晰的若干小的子问题。不过分步解决子问题时,尽管可以在子问题上得到最优解,但子问题上的最优解并不意味着就能得到全局问题的最后解。深度学习提供了一种端到端的学习范式,整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模型直接学习从原始数据到期望输出的映射。对深度模型而言,其输入数据是未经任何人为加工的原始样本形式,后续则是堆叠在输入层上的众多操作层,这些操作层整体可以看作一个复杂的函数FCNN,最终的损失函数由数据损失data loss和模型参数的正则化损失(regularization loss)共同组成,模型深度的训练则是在最终损失驱动下对模型进行参数更新并将误差反向传播至网络各层。】

        【算法一解析】从整个数据集(第3行)开始,它首先训练顶级节点模型。基于这个顶级节点模型的预测,它从下一阶段(第9行和第10行)中选择模型,并添加所有属于那个模型(第10行)。最后,在混合索引的情况下,如果绝对最小/最大误差高于预定义的阈值(第11-14行),则通过用B-树替换NN模型来优化索引

        注意,我们存储了最后阶段每个模型的标准误差和最小和最大误差。这样做的好处是,我们可以根据每个键使用的模型单独限制搜索空间。目前,我们通过简单的网格搜索来调整模型的各种参数(即阶段数、每个模型的隐藏层等)。然而,为了加快从ML自动调整到采样的训练过程,存在许多潜在的优化。

        注意,混合索引允许我们将学习到的索引的最坏情况性能绑定到B树的性能。也就是说,在一个非常难以学习的数据分布的情况下,所有的模型都会被B树自动替换,使其实际上成为一个完整的B树。

3.4搜索策略和单调性

        范围索引通常实现一个上界(key)[lower bound(key)]接口,用于查找排序数组中第一个键的位置,该位置等于或高于查找键,以有效地支持范围请求。因此,对于已学习的范围索引,我们必须根据预测从查找键中找到第一个较高[较低]的键。尽管做了很多努力,但据大量报道,二分查找或扫描有效载荷较小的记录通常是在排序数组中查找键的最快策略,因为替代技术的额外复杂性很少有回报。然而,学习索引在这里可能有一个优势:模型实际上预测了键的位置,而不仅仅是键的区域(即页面)。这里我们讨论了利用这些信息的两种简单搜索策略:

        模型偏向搜索:我们的默认搜索策略,它只不同于传统的二进制搜索,因为第一个中间点被设置为模型预测的值

        有偏的四元搜索:四元搜索取代了一个点进行分割【分割成两部分】,而是三个点分割【分割成四部分】,希望在数据不在缓存中的情况下,硬件可以同时预取所有三个数据点,以获得更好的性能。在我们的实现中,我们将四元搜索的初始。三个中间点定义为pos-σ、pos、pos+σ。也就是说,我们猜测我们的大多数预测是准确的,我们的注意力首先集中在位置估计上,然后继续传统的四元搜索。

        【搜索区域,且RMI模型必须是单调的】在我们的所有实验中,我们使用最小和最大误差作为所有技术的搜索区域。也就是说,我们对每个key执行RMI模型,并在每个最后阶段模型中存储最坏的over-and-under预测。虽然这种技术保证了找到所有现有的key,但对于不存在的key,如果RMI模型不是单调的,它可能返回错误的上限或下限。为了克服这个问题,一个选择是强迫我们的RMI模型是单调的,正如机器学习中所研究的那样[41,71]。

        【两种自动调整搜索区域的方法】另外,对于非单调模型,我们可以自动调整搜索区域。也就是说,如果找到的上(下)界键位于 由最小和最大错误定义的搜索区域的边界上,我们将递增地调整搜索区域。然而,另一种可能性是,使用指数搜索技术。假设是一个正态分布的错误,这些技术的平均效果应该和其他搜索策略一样好,而不需要存储任何最小和最大错误。

3.5索引字符串

        我们主要关注实值键的索引,但许多数据库依赖于索引字符串,幸运的是,重要的机器学习研究集中在字符串的建模上。和以前一样,我们需要设计一个高效而富有表现力的字符串模型。为字符串做好这项工作会带来许多独特的挑战。

        第一个设计考虑是如何将字符串转换为模型的特性,通常称为标记化。为了简单和高效,我们将n长度的字符串视为特征向量,其中是ASCII十进制值(或Unicode十进制值,取决于字符串)。此外,如果所有输入大小相等,大多数ML模则操作效率更高。因此,我们将设置最大输入长度N。因为数据是按字典顺序排序的,所以我们将在标记化之前将key截断为长度N,对于字符串,它的长度应,当i>N时,设置

        为了提高效率,我们通常采用与实值输入类似的建模方法。我们学习一个相对较小的前馈神经网络的层次结构。一个区别是输入不是一个实值x而是一个向量x。线性模型w·x+b根据输入长度N线性地调整乘法和加法的数量。即使只有一个隐藏层宽度h的前馈神经网络也会调整O(hN)乘法和加法。

        【字符串键的学习索引的优化】最后,我们相信未来有重要的研究可以优化字符串键的学习索引。例如,我们可以很容易地想象其他的标记化算法。在自然语言处理中,有大量关于字符串标记化的研究,以将字符串分成对ML模型更有用的段,例如翻译中的词条[70]。此外,将后缀树的思想与学习索引结合起来,以及探索更复杂的模型结构(例如,递归和卷积神经网络)可能会很有趣。

3.6训练

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
## A C++11 implementation of the B-Tree part of "The Case for Learned Index Structures" A research **proof of concept** that implements the B-Tree section of [The Case for Learned Index Structures](https://arxiv.org/pdf/1712.01208.pdf) paper in C++. The general design is to have a single lookup structure that you can parameterize with a KeyType and a ValueType, and an overflow list that keeps new inserts until you retrain. There is a value in the constructor of the RMI that triggers a retrain when the overflow array reaches a certain size. The basic API: ```c++ // [first/second]StageParams are network parameters int maxAllowedError = 256; int maxBufferBeforeRetrain = 10001; auto modelIndex = RecursiveModelIndex recursiveModelIndex(firstStageParams, secondStageParams, maxAllowedError, maxBufferBeforeRetrain); for (int ii = 0; ii < 10000; ++ii) { modelIndex.insert(ii, ii * 2); } // Since we still have one more insert before retraining, retrain before searching... modelIndex.train(); auto result = modelIndex.find(5); if (result) { std::cout << "Yay! We got: " << result.get().first << ", " << result.get().second << std::endl; } else { std::cout << "Value not found." << std::endl; // This shouldn't happen in the above usage... } ``` See [src/main.cpp](src/main.cpp) for a usage example where it stores scaled log normal data. ### Dependencies - [nn_cpp](https://github.com/bcaine/nn_cpp) - Eigen based minimalistic C++ Neural Network library - [cpp-btree](https://code.google.com/archive/p/cpp-btree/) - A fast C++ implementation of a B+ Tree ### TODO: - Lots of code cleanup - Profiling of where the slowdowns are. On small tests, the cpp_btree lib beats it by 10-100x - Eigen::TensorFixed in nn_cpp would definitel

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值