树的数量和搜索 k 对准确性和速度的影响 在 Annoy(Approximate Nearest Neighbors Oh Yeah)中,森林中树的数量和搜索 k
参数直接影响查询准确性和速度。更多的树可以提高准确性,因为每棵树以不同的方式划分数据,从而增加找到真正最近邻居的可能性。但是,更多的树也意味着更大的索引和更慢的查询时间,因为在搜索期间必须遍历每棵树。相反,更少的树可以减少内存使用并加快查询速度,但由于划分不够彻底,可能会错过相关的邻居。k
参数(查询期间检查的节点数)也起作用:更高的 k
值会迫使算法探索更多路径,从而提高召回率,但会增加延迟。例如,使用 k=100
,Annoy 会检查树中的 100 个节点,这比 k=10
慢,但更准确。
选择树和 k 的值 树和 k
的最佳值取决于您在准确性和速度之间的权衡。首先使用适量的树(例如,10–50),并根据您的数据集大小和维度进行调整。对于高维数据(例如,300+ 维度),可能需要更多树(例如,50–100)来捕获复杂的关系。使用召回率@N(找到的真实 top-N 邻居的百分比)等验证指标来测试准确性。对于 k
,一个经验法则是将其设置为接近树的数量或更高 - 例如,50 棵树对应 k=50
。如果速度至关重要,则降低 k
(例如,k=10
),但预计准确性会下降。逐步进行实验:增加树的数量直到召回率稳定,然后调整 k
以平衡延迟。例如,一个包含 100 万个项目的推荐系统可能会从 50 棵树和 k=50
开始,如果查询速度太慢但准确性仍然可以接受,则将树的数量减少到 30。
实际示例和场景 考虑一个具有 50 万个向量的 100 维数据集。使用 30 棵树和 k=30
,查询可能需要 5 毫秒,召回率为 85%。将树的数量增加到 50 可以将召回率提高到 92%,但会将查询时间延长到 8 毫秒。如果延迟是不可协商的(例如,实时搜索),将树的数量减少到 20,并将 k
减少到 20 可能会将时间缩短到 3 毫秒,但会将召回率降低到 78%。对于批处理(例如,离线分析),更高的树(100+)和 k=100
可以最大限度地提高准确性,但代价是每次查询 20 毫秒。始终使用数据集的子集进行基准测试:以 10 为增量测试树的数量,并以 10-20 为增量测试 k
。网格搜索或贝叶斯优化等工具可以自动执行此操作,但手动调整通常就足够了。关键是将参数与应用程序的优先级对齐 - 无论是面向用户的速度还是后端准确性。