Page 52 - 《软件学报》2026年第3期
P. 52

王嘉翼 等: 向量数据库的      K  近邻图高效更新方法                                                 1015



                                                      表 1 实验数据集

                                       属性               Stack         Wiki        DigiFace
                                     数据类型               文本            文本           图像
                                     数据规模              1 000 000    1 000 000     144 000
                                     平均词数                296          715          N/A
                                     嵌入维度                768          768          768
                                微调前100近邻平均距离            0.941        0.927         6.35
                                微调后100近邻平均距离            0.985        0.976         8.74

                    文本语义表示方面, 本文采用         Sentence Transformer 中的  all-mpnet-base-v2  模型提取文本的语义嵌入, 每个嵌
                 入向量维度为     768. 我们使用  STS (semantic textual similarity) 数据集对该模型进行微调. STS  数据集由大量句子对
                 组成, 每对句子被标注了一个从         0 到  5 的相似度得分, 反映两个句子在语义上的接近程度. 该数据集覆盖了同义句、
                 翻译句和含义相近或相异的表达形式, 非常适合作为文本嵌入模型的微调数据. 对嵌入模型使用 STS 数据集进行
                 微调, 能够提升模型对语义相似度的判断能力. 这对于语义搜索、同义句检测和其他文本理解任务的应用具有重
                 要意义.
                    图像的嵌入向量方面, 本文采用          ViT (vision Transformer) 模型  [22] 计算图像的嵌入, 采用在  ImageNet-21K  上进
                 行过预训练的     vit-base-patch16-224-in21k  作为微调前的模型. DigiFace 数据集提供了不同图片中人物身份的标记,
                 我们使用数据集      DigiFace 中未被用于嵌入向量计算的部分, 使用对比学习对预训练的嵌入模型进行微调.
                                                                      −5
                                                                    10 , 默认以  16  的批大小 (batch size) 对嵌入模
                    在微调过程中, 我们采用余弦相似度损失函数, 设置学习率为
                 型训练   1  个轮次.
                    对于乘积量化, 我们设定划分数          M = 4, 即将每个  768 维嵌入向量分为     4 个子向量, 每个子向量聚类数        c = 256,
                 并在预处理阶段对每个子向量选取前             40%, 即  λ = 0.4c = 102 个距离最接近的聚类中心. 检查阈值默认   取   θ  0.2.
                    为了全面评估本文方法的效果, 我们将本文方法与以下                  3  种基线进行对比.
                    ● Stale: 直接使用微调前的嵌入向量构建的          K  近邻图, 未做任何调整.
                    ● NN-descent: 在微调后的嵌入向量上, 从头执行        NN-descent 算法构建  K  近邻图.
                    ● NN-descent-init: 以微调前的嵌入向量上建立的      K  近邻图作为初始图, 在微调后的嵌入向量上继续执行                NN-
                 descent 算法对  K  近邻图进行优化.
                    评估指标方面, 我们使用召回率 (Recall@100, 即前         100  个真实邻居中被正确检索出的比例) 衡量不同方法得
                 出的  K  近邻图的准确性, 数值越高表示         K  近邻图越准确. 我们使用欧氏距离衡量向量间的距离 (由于本文使用的
                 嵌入模型中, 嵌入向量会被标准化为单位长度, 使用欧氏距离与                   Cosine 距离等价). 为了评估建立出的       K  近邻图结
                 构上与真实的     K  近邻图的差异, 我们还计算了各个节点度数的均方根误差 (root mean square error, RMSE) 进行评
                 估. 此外, 为评估不同方法的执行效率, 我们记录每种方法在微调后调整                     K  近邻图所耗费的时间, 时间消耗越短表
                 示方法越高效.
                    所有实验均在一台       Ubuntu  服务器上完成, 服务器的配置参数为          256 GB  内存、4  张  NVIDIA RTX 3090  显卡,
                 以及  Intel(R) Xeon(R) Gold 6242R CPU @ 3.10 GHz 处理器.

                  4.2   K  近邻图准确度比较
                    本文对比分析了在嵌入向量微调后, K            近邻图执行更新      3 min  时, 不同方法所生成的    K  近邻图的召回率, 结果
                 如图  7  所示. 实验结果表明, FastAdjust 在各个数据集上均显著优于未对            K  近邻图进行调整的     Stale 以及采用  NN-
                 descent 进行增量更新的方法. 以      Stack  数据集为例, FastAdjust 的召回率达到了    96.4%, 而  Stale、NN-descent 和
                 NN-descent-init 的召回率分别仅为   84%、85%  和  89%.
                    Stale 方法的召回率较低, 主要原因在于其仍使用微调前的嵌入向量构建的                     K  近邻图. 由于微调后向量的空间
                 分布已发生改变, 原有的邻居关系失去了准确性, 导致检索性能下降. NN-descent 方法虽然重新构建了                          K  近邻图,
   47   48   49   50   51   52   53   54   55   56   57