LoginSignup
10
12

Embeddingモデルを使ったベクトル検索

Posted at

はじめに

ベクトル検索の一連の流れを確認し、各プロセスの処理内容と登場する用語の意味を解説します。次に、各プロセスで使用される機械学習モデルやアルゴリズムの例を挙げ、それらの特徴について一覧化しました。
この記事の続きとして後日、紹介した機械学習モデルとアルゴリズムの一部を使った実験の結果を共有しようと思います。

ベクトル検索とは?

ベクトル検索はテキストや画像、音声などの非構造化データを分散表現(ベクトル)に変換することによって、関連性の高いコンテンツを探し出す検索手法の一つです。従来のキーワード検索ではその事柄を説明でき、理解していたとしても、語彙が分からない場合に検索精度が思うように出ない可能性があります。一方、ベクトル検索は意味内容からコンテンツを検索できることから、これらの制約を受けづらいという特徴があります。

ベクトル検索のフロー

image.png

  1. 非構造化データのベクトル化
    テキストや画像、音声といった非構造化データを分散表現(ベクトル)に変換する処理のことをEmbeddingと呼びます。このプロセスでは予めインデックスに登録するためのデータに対してベクトル化(Embedding)します。Embeddingの処理にはそれ専用の機械学習モデル(Embeddingモデル)が必要で、モデルによってベクトルの次元数が異なる場合もあります。この工程で作成したベクトルをここでは"コンテンツベクトル"と呼ぶことにします。
  2. インデックスの定義
    インデックスとは、情報検索を効率化するためのデータ構造です。DBや検索エンジンなど、膨大なデータの中から素早くデータを探し出したいときに登場します。今回もベクトル化(Embedding)したテキストや画像、音声はインデックスに登録し、検索時に利用します。
  3. 検索クエリの作成
    ユーザが該当データを探すためのヒントとなる情報を作成します。ベクトル検索のユースケースとして有名な RAG(Retrieval Augmented Generation)などではチャットボットへの質問文がこれにあたります。
  4. 検索クエリをベクトルに変換する
    ユーザが入力した検索クエリをEmbeddingして分散表現(ベクトル)に変換します。ここで使用するEmbeddingモデルはインデックスに登録するデータに対して使用したものと同じものを使います。この工程で作成したベクトルはインデックスに登録してあるコンテンツベクトルと区別するために"クエリベクトル"と呼ぶことにします。
  5. インデックスから該当データを探す
    クエリベクトルと類似性の高いコンテンツベクトルをインデックスの中から探します。この類似性を測るための尺度と、該当データをインデックスの中から効率的に探索するアルゴリズムを併せて、最近某探索という最適化の問題として学術的に扱われています。類似性の高いコンテンツベクトルがどれか分かれば、元の非構造化データの中のどれを指し示しているかは明白です。

ベクトル検索を支える技術

Embeddingモデル

前述のとおり、Embeddingモデルを使って、非構造化データを分散表現(ベクトル)に変換していきます。このEmbeddingモデル選びはベクトル検索の精度と性能に大きく関わってきます。

No. モデル名 詳細
1 Word2Vec Googleのトマス・ミコロフらによって2013年に提案された、単語の分散表現を得るためのモデル群である。浅い2層ニューラルネットワークを使って大きなコーパスから1つのベクトル空間を生成する。
2 GloVe GloVeはスタンフォード大学のマニングらの研究室から提案された、より局所的な単語間の共起関係と、大域的な単語間の共起関係の両方を考慮できる学習モデルである。
3 BERT 2018年にGoogleが公開した自然言語処理モデルである。Transformerと呼ばれる深層学習モデルを採用し、双方向タスクを可能したことで話題となった。
4 SimCSE Dropout層を利用した対象学習と呼ばれる学習手法が特徴的な言語モデルである。BERTの抱える異方性の問題を解決するアイデアが学習時に施されています。
5 text-embedding-ada-002 OpenAI社が提供するEmbeddingモデルであり、以前まで提供されていた「davinci」よりも多くのタスクで性能が上回っている。

類似性尺度

Embeddingモデルによって分散表現になったデータを、似ているか似ていないか判断するためには 類似性尺度 というものを使います。例えば、分散表現によって数値化されたデータをそれぞれ1つの点として考え、データ点がお互いにどのくらい近しいかによって判断する方法があります。

No. 名称 詳細
1 ユークリッド距離 2つのデータをそれぞれ点として考え、いわゆる「通常の」2点間の距離を計算する。2つのデータA、Bの距離は、AとBの分散表現の各次元の差を二乗和平方根にして計算する。
2 コサイン類似度 2つのデータをベクトルとして考え、2つのベクトルのなす角を計算する。扱えるベクトルは零でないものに限り、とりえる値の範囲は-1~1までと決まっている。

探索アルゴリズム

インデックスに登録した膨大なデータすべてに対して類似性尺度の計算するのはとてもコストがかかってしまいます。なるべく効率的に所望データを見つけるためのアイデアが探索アルゴリズムです。

No. 名称 詳細
1 HNSW 階層型のグラフ構造を持たせたインデックスによって効率的にクエリベクトルと近しいコンテンツベクトルを探索するアルゴリズムである。階層の上位レイヤーを使って目的のコンテンツベクトルまで大まかに接近し、下位レイヤーで詳細に迫るという手順を踏む。
2 IVF ベクトル空間をセル分割し、各セルの代表値(もしくは代表となるベクトル)とクエリベクトルとの類似性を比較することで大まかに対象を絞り込む。その後、対象セル内のコンテンツベクトルから詳細に所望のコンテンツベクトルを探索する。

まとめ

ベクトル検索は、 Embeddingモデル によって分散表現(ベクトル化)されたデータを、 類似性尺度探索アルゴリズム によって効率的に検索する仕組みのことでした。この記事で紹介した要素技術の組み合わせによってベクトル検索の精度は変化します。
こうしたベクトル検索の仕組みを実際に試してみるときは、ぜひこの記事で紹介したような要素技術に対して、パラメータをちょうせいしてみたり、採用するアルゴリズムやモデルを変更してみるなど試行錯誤を加えてみてください。

10
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12