🐈

ベクトルデータベースの特徴と用途

2023/07/16に公開

ベクトルデータベースの活用を検討するにあたり、最低限知っておきたかった知識をまとめました。自分と同じく、これから機械学習を使った類似性検索やレコメンドシステムを開発される方の参考になれば幸いです。

ベクトルデータベースとは

ベクトルデータベースとは、名前の通り、ベクトル[1]の検索に特化したデータベースです。

画像を入力として、最も似ている画像を検索するといった類似性検索や、ユーザーの好みを基に類似した商品を勧めるといったレコメンドシステムなどに活用されます。後述する「次元の呪い」を解決するために特殊なアルゴリズムが使われています。

次元の呪いとは

次元の呪いとは、データの次元が増えるにつれて発生する以下のような問題を指します。

  • データを扱うための計算量やストレージ量が指数的に増加し、多次元空間での検索や計算が困難になる
  • データ間の距離が均一化し、データ間の類似性の識別が困難になる

ベクトルデータベースでは、近似最近傍検索(ANN)という手法を用いて、この次元の呪いを解決しています。

ANNでは、すべてのデータ点間の距離を計算するのではなく、近いと推定される点の距離計算だけを行う方法です。具体的には、k-d treeやball treeなどのデータ構造を用いて空間を分割し、特定の領域内の点のみを検索対象としたりするようです。他にも、PCAなどの次元削減を利用したりもするようです。

リレーショナルデータベースではダメなのか

ベクトル同士の類似度は、Pythonのライブラリを使って計算することができます。

つまり、ベクトルを文字列としてリレーショナルデータベースに保存し、Pythonスクリプトでベクトルのパースとコサイン類似度の計算、検索を実行することも可能です。このアプローチでは何がいけないのか、ということを書きます。

結論からいうと、スケーラビリティの問題があるためです。

データ量が増えると、すべてのベクトルを取得してから類似性を計算する、というアプローチでは大量のリソース(CPU、メモリ、ディスクI/Oなど)が必要になります。検索対象のデータ量が少ないのであれば問題になりませんが、大量のベクトルデータから高速に検索する必要がある場合などはベクトルデータベースが適しています。

ベクトルデータベースは総当たり検索をしていない

先述の通り、ベクトルデータベースでは近似最近傍検索(ANN)という手法を用いています。
すべてのデータ点間の距離を計算するのではなく、近いと推定される点の距離計算だけを行うことで、大量のベクトルデータから高速に検索することができます。

ベクトルデータベースでは、k-d treeやball treeといった特殊なアルゴリズムを用いて、ベクトルのインデックスを作成します。リレーショナルデータベースでは、基本的にベクトル型の列にこのようなインデックスを作成する機能はありません。

ANNは「近似」であるため、必ずしも最も近いベクトルを検索できるわけではないらしいです。
しかし実際のアプリケーションでは、この精度の低下は許容範囲であることが多く、代わりに得られる計算速度の向上やリソース使用量の削減のメリットのほうが大きいようです。

まとめ

ベクトルデータベースについて書いたことを簡単にまとめてみます。

  • 大量のベクトルデータから高速に検索したいときに使う
  • 検索範囲を絞ることで計算速度の向上とリソース使用量の削減を実現している
  • RDBでも類似性検索はできるがスケーラビリティの問題がある

以上です。

脚注
  1. ベクトルとは、文章や音声のような非構造データを、機械学習モデルが理解できるように変換したものを指します。この変換のプロセスを埋め込みといい、自然言語処理や音声認識といった技術が利用されます。 ↩︎

Discussion