竞品分析

本文讨论PostgreSQL相似图像搜索插件imgsmlr和文本转化为向量插件word2vec对比分析型数据库MySQL版向量分析在使用过程中存在哪些问题。

PostgreSQL imgsmlr

imgsmlr是PostgreSQL上的一个以图搜图插件,实现了从图片转向量和向量检索的功能,且所有操作都使用SQL封装,您可以很容易地搭建一个简易的以图搜图应用。

使用过程中存在的问题

imgsmlr存在以下问题:

  • 图片特征提取算法粗燥,准确率和数据召回率较低。

    imgsmlr抽取图像特征的算法,以64*64的图像为例,imgsmlr取16个区域的平均值,生成16个浮点数,作为图像特征值。这种特征抽取算法,只适用于对图像检索准确度要求极低的情况,对目前广泛使用的基于卷积神经网络图像识别来说,完全无法实现其要求。

  • imgsmlr图片检索算法使用Gist索引,仅适用于向量维度较低的情况,例如16维,而人脸识别基本在256维以上。

    低维度的向量对索引非常友好,但是维度较低会丢失大量的图像信息,导致检索精度显著下降。维度上升对数据存储和计算提出了巨大的挑战,显然imgsmlr无法胜任。

  • 只支持数据批量导入,不支持数据实时更新。

PostgreSQL word2vec

word2vec支持使用Python实现文本转向量功能,且集成Facebook AI Research(简称FAIR)开源的Faiss向量索引库,实现了多种向量索引算法,例如Product quantizer (PQ) in flat mode(简称PQ)、IVFADC (coarse quantizer+PQ on residuals)(简称IVFADC)。

word2vec还具备向量分析能力,提供了KNN-Join,详情请参见FREDDY

实现逻辑

word2vec的实现逻辑较为简洁:

  1. 通过封装的Python接口把文本转为向量。

  2. 通过调用Faiss封装的Python接口提取向量的索引数据,例如量化编码,粗聚类。

  3. 建立两张表:向量表、向量索引表。

    向量表保存向量、文本以及文本id。

    向量索引表保存PQ编码和粗聚类。

  4. 导入数据时,同时写入向量表和向量索引表。

  5. 检索时提供一个用户自定义函数,首先通过向量索引表做检索,查询粗聚类中心;然后做PQ扫描,得到top k向量id;最后通过向量ID到向量表检索得到文本。

使用过程中存在的问题

word2vec可以快速实现向量检索功能,但是存在下列问题:

  • word2vec使用PostgreSQL PG的块页式内存和磁盘管理,性能较低。

    PostgreSQL的内存page只有8k,而修改page size需要重新编译代码,加大page size对磁盘刷盘效率的影响。以128 Byte的代码为例,PostgreSQL的内存page只能保存64条记录,扫描PG编码时,会有多次page访问。

  • 使用方式不够友好,不支持数据实时写入。

    向量和索引作为一个独立的表,需要额外写入。 还需要先计算好粗中心和PG编码,然后写入数据库,而不是把粗中心和编码作为索引由PostgreSQL来生成,增加了额外工作。

  • Faiss索引的效率较低,分析型数据库MySQL版向量分析是基于图的索引算法,其性能是Faiss索引性能的10倍。

阿里云首页 云原生数据仓库AnalyticDB MySQL版 相关技术圈