<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Valentin Crettaz - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Valentin Crettaz - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/jp/search-labs/author/valentin-crettaz</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/author/valentin-crettaz</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/author/valentin-crettaz.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 03:58:21 GMT</lastBuildDate>
  <item>
    <title><![CDATA[ベクトル探索の簡単な紹介]]></title>
    <description><![CDATA[この記事は、セマンティック検索とも呼ばれるベクトル検索の複雑さと、それが Elasticsearch でどのように実装されるかを詳しく説明する 3 部構成の記事の第 1 部です。]]></description>
    <content:encoded><![CDATA[<p>この記事は、セマンティック検索とも呼ばれるベクトル検索の複雑さと、それが Elasticsearch でどのように実装されるかを詳しく説明する 3 部構成の記事の第 1 部です。</p><p>この最初の部分では、埋め込みベクトルの基本とベクトル検索が内部でどのように機能するかについて、一般的な紹介を提供することに重点を置いています。</p><p>最初の記事で学んだ知識をすべて活用して、第<a href="https://www.elastic.co/search-labs/blog/vector-search-set-up-elasticsearch">2 部で</a>は Elasticsearch でベクトル検索を設定する方法を詳しく説明します。</p><p><a href="https://www.elastic.co/search-labs/blog/hybrid-search-elasticsearch">パート 3</a>では、パート 1 と 2 で学んだ内容を活用し、その知識を基にして、Elasticsearch で強力なハイブリッド検索クエリを作成する方法を詳しく検討します。</p><p>この記事の本題に入る前に、時間をさかのぼって、セマンティック検索の重要な概念であるベクトルの歴史を少し振り返ってみましょう。</p><h2>ベクトルは新しいものではない</h2><p>2022年11月にChatGPTが登場して以来、「ベクトル検索」について聞いたり読んだりしない日はないということは、誰もが同意するでしょう。これはどこにでも存在し、広く普及しているため、つい最近登場した最先端技術であるという印象を受けることがよくありますが、実際にはこの技術は 60 年以上前から存在しているのです。このテーマに関する研究は 1960 年代半ばに始まり、最初の研究論文は 1978 年に情報検索の専門家である Gerard Salton 氏とコーネル大学の同僚によって発表されました。Salton の密ベクトル モデルと疎ベクトル モデルに関する研究は、現代のベクトル検索テクノロジの根幹を成しています。</p><p>過去 20 年間で、彼の研究に基づいたさまざまな<a href="https://db-engines.com/en/ranking/vector+dbms/all">ベクトル DBMS が</a>作成され、市場に投入されました。これらには、2019 年に<a href="https://issues.apache.org/jira/browse/LUCENE-9004">ベクター検索の取り組み</a>を開始した Apache Lucene プロジェクトを搭載した Elasticsearch が含まれます。</p><p>ベクトルは現在どこにでも存在し、広く普及しているため、ベクトルを扱う前に、まずその基礎となる理論と内部の仕組みをしっかり理解することが重要です。その詳細に入る前に、語彙検索とベクトル検索の違いを簡単に確認して、それらの違いと相互補完性について理解を深めましょう。</p><h2>ベクトル検索と語彙検索</h2><p>ベクトル検索を紹介する簡単な方法は、おそらく慣れている従来の語彙検索と比較することです。ベクトル検索 (セマンティック検索とも呼ばれます) と語彙検索の動作は大きく異なります。字句検索は、Elasticsearch で長年使用されてきた種類の検索です。簡単にまとめると、インデックスされてクエリされた内容の本当の意味を理解しようとするのではなく、ユーザーが<strong>クエリに</strong>入力した単語のリテラルまたはその変形（語幹、同義語など）を、TF-IDFなどの類似性アルゴリズムを使用して以前にデータベースにインデックスされたすべてのリテラルと語彙的に一致させることに多大な努力を払います。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfbb8e150865a5ec8/6a17e0c725daab50f408a16e/a4f3eba19599e5330e9b0d29ecdbbeac211cdab0-1600x583.png" alt="語彙検索の例" /><p>ご覧のとおり、左上の 3 つのドキュメントはトークン化され、分析されています。次に、結果の用語は転置インデックスにインデックス付けされ、分析された用語がそれらを含むドキュメント ID に単純にマッピングされます。すべての用語は 1 回だけ存在し、どのドキュメントでも共有されないことに注意してください。「nice german teacher」を検索すると、いずれもクエリの真の意味を捉えていないにもかかわらず、さまざまなスコアで 3 つのドキュメントすべてが一致します。</p><p>下の図 2 に見られるように、多義語や同音異義語、つまり綴りは同じだが<strong>意味が異なる</strong>単語 (right、palm、bat、mean など) を扱う場合はさらに複雑になります。3 つの異なる意味を持つ「right」という単語を取り上げ、何が起こるかを見てみましょう。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltea0cc829ff2c8029/6a17e0c92f4a5c8107fa8811/ebb9cc1be03475bbf68269a8dcea5f08bcda0b64-1594x754.png" alt="語彙検索による同音異義語の検索" /><p><em>「I'm not right」</em>を検索すると、最初に返された結果とはまったく逆の意味を持つ文書が返されます。まったく同じ用語を検索しても、順序を変えて意味を変えた場合（たとえば、 <em>「右折する」</em>と<em>「右折する」）、</em>まったく同じ結果（つまり、3 番目のドキュメント「右折する」）が返されます。確かに、クエリは過度に単純化されており、フレーズ マッチングなどのより高度なクエリは使用されていませんが、これは、語彙検索ではインデックスされている内容と検索されている内容の背後にある真の意味を理解していないことを示しています。それが明確でなくても心配しないでください。3 番目の記事でこの例を再度取り上げ、この場合にベクトル検索がどのように役立つかを確認します。</p><p>語彙検索を正当に評価するには、<strong>構造化</strong>データのインデックス作成方法 (マッピング、テキスト分析、取り込みパイプラインなど) とクエリの作成方法 (巧みに作成された DSL クエリ、クエリ用語分析など) を制御できる場合、語彙検索エンジンで驚くべき成果を上げることができ、それに疑問の余地はありません。Elasticsearch の語彙検索機能に関する実績は実に素晴らしいものです。過去数年間にそれが達成したこと、そして語彙検索の分野をどれだけ普及させ、改善したかは、実に注目すべきことです。</p><p>ただし、自由形式のテキストで質問する必要があるユーザーに対して、<a href="https://www.elastic.co/what-is/unstructured-data"><strong>非構造化</strong></a><a href="https://www.elastic.co/what-is/unstructured-data">データ</a>(画像、ビデオ、音声、生のテキストなど) のクエリをサポートするタスクを課せられる場合、語彙検索では不十分です。さらに、クエリがテキストではなく、画像である場合もあります。これについては後ほど説明します。このような状況で語彙検索が不十分な主な理由は、非構造化データは構造化データと同じようにインデックス付けもクエリもできないことです。非構造化データを扱う場合には、<strong>セマンティクスが</strong>重要になります。セマンティクスとはどういう意味ですか?とても簡単に言えば、意味です！</p><p>画像検索エンジン（Google Image Search や Lens など）の簡単な例を見てみましょう。画像をドラッグ アンド ドロップすると、Google セマンティック検索エンジンが検索した画像に最も類似した画像を見つけて返します。下の図 3 では、左側にジャーマン シェパードの写真が表示され、右側には取得されたすべての類似写真が表示されています。最初の結果は、提供された写真と同じ写真 (つまり、最も類似した写真) です。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3e0a0fb3c300537a/6a17e0cbe8fbce69d13a185d/c0dff24d4379141abd1038c9c4b5577fd2dca802-1600x657.png" alt="セマンティック検索の例: 画像の検索" /><p>これは人間にとっては単純かつ論理的に聞こえますが、コンピューターにとっては全く別の話です。これを可能にするのがベクトル検索です。世界が最近目撃したように、ベクトル検索によって解き放たれる力は莫大です。ではボンネットを開けて、下に何が隠れているか見てみましょう。</p><h2>埋め込みベクトル</h2><p>前に説明したように、語彙検索エンジンを使用すると、テキストなどの構造化データは、用語の実際の意味に関係なく、検索時に一致できる用語に簡単にトークン化できます。ただし、非構造化データは、大きなバイナリ オブジェクト (画像、ビデオ、オーディオなど) などのさまざまな形式をとることができるため、同じトークン化プロセスにはまったく適していません。さらに、セマンティック検索の目的は、データが表す意味に基づいて検索できるようにデータをインデックス化することです。どうすればそれを達成できるでしょうか?答えは2つの言葉です:<strong>機械学習です</strong>!もっと正確に言えば、ディープラーニングです!</p><p><strong>ディープラーニングは</strong>、データの真の意味を段階的に抽出できる複数の処理層で構成された人工ニューラル ネットワークに基づくモデルに依存する機械学習の特定の領域です。これらのニューラル ネットワーク モデルの動作方法は、人間の脳に大きく影響を受けています。下の図 4 は、入力層と出力層、および複数の隠し層を持つニューラル ネットワークの概要を示しています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ca5fd8f0e61d939/6a17e0cd7f6f152a67c09a53/aeea3bab3c29e1c591a9c9082f2e73e7d3990ef1-1600x1116.png" alt="ベクトル探索におけるニューラルネットワーク層" /><p>ニューラル ネットワークの真の偉業は、単一の非構造化データを、<strong>埋め込みベクトル</strong>または単に<strong>埋め込み</strong>と呼ばれる浮動小数点値のシーケンスに変換できることです。人間は、ベクトルを 2 次元または 3 次元の空間で視覚化すると、ベクトルが何であるかをかなりよく理解できます。ベクトルの各成分は、2D xy 平面または 3D xyz 空間内の座標を表します。</p><p>ただし、ニューラル ネットワーク モデルが動作する埋め込みベクトルは、数百または数千の次元を持つ場合があり、単純に多次元空間内の点を表します。各ベクトル次元は、非構造化データの<strong>機能</strong>または特性を表します。これを、画像を 2048 次元の埋め込みベクトルに変換するディープラーニング モデルで説明しましょう。このモデルは、図 3 で使用したジャーマン シェパードの写真を、下の表に示す埋め込みベクトルに変換します。最初と最後の 3 つの要素のみが表示されていますが、テーブルにはさらに 2,042 の列/ディメンションがあることに注意してください。</p><p></p><p>赤い</p><p>犬です</p><p>青空</p><p>…</p><p>グラスなし</p><p>ジャーマンシェパード</p><p>木</p><p>ジャーマンシェパード 埋め込み</p><p>0.0121</p><p>0.9572</p><p>0.8735</p><p>…</p><p>0.1198</p><p>0.9712</p><p>0.0512</p><p>各列はモデルの次元であり、基礎となるニューラル ネットワークがモデル化しようとする機能または特性を表します。モデルに与えられた各入力は、その入力が 2048 次元のそれぞれにどの程度類似しているかに応じて特徴付けられます。したがって、埋め込みベクトルの各要素の値は、その入力と特定の次元の<strong>類似性</strong>を示します。この例では、モデルが犬とジャーマンシェパードの間に高い類似性があること、また青空が存在することを検出したことがわかります。</p><p>語彙検索では用語が一致するか一致しないかのどちらかになりますが、ベクトル検索では、非構造化データがモデルでサポートされている各次元とどの程度<em>類似している</em>かをより正確に把握できます。そのため、埋め込みベクトルは、非構造化データの優れたセマンティック表現として機能します。</p><h2>秘密のソース</h2><p>非構造化データがディープラーニング ニューラル ネットワークによって、多数の次元に沿ったデータの類似性を捉える埋め込みベクトルに細分化される仕組みがわかったので、それらのベクトルのマッチングがどのように機能するかを理解する必要があります。答えは非常に簡単であることがわかりました。互いに<strong>近い</strong>埋め込みベクトルは、<strong>意味的に類似した</strong>データ部分を表します。したがって、ベクトル データベースをクエリする場合、検索入力 (画像、テキストなど) は、まず、すべての非構造化データのインデックス作成に使用されたのと同じモデルを使用して埋め込みベクトルに変換され、最終的な目標はそのクエリ ベクトルに<strong>最も近い隣接ベクトルを</strong>見つけることです。したがって、必要なのは、クエリ ベクトルとデータベースにインデックスが付けられた既存のすべてのベクトルとの間の「距離」または「類似性」を測定する方法を見つけることだけです。</p><h3>距離と類似性</h3><p>幸いなことに、2 つのベクトル間の距離を測定することは、ベクトル演算のおかげで簡単に解決できる問題です。それでは、Elasticsearch などの最新のベクトル検索データベースでサポートされている、最も人気のある距離と類似度の関数を見てみましょう。警告、これから数学の話になります!</p><h4>L1距離</h4><p>2 つのベクトル x と y の L1 距離 (マンハッタン距離とも呼ばれる) は、それらのすべての要素のペアワイズ絶対差を合計することによって測定されます。明らかに、距離 d が小さいほど、2 つのベクトルは近くなります。式は以下のように非常にシンプルです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2df2e9bc20883491/6a17e0ce033c8d006a6bb0bf/2b17bcedfbedde61117a3e7970af55bc62318c6c-312x102.png" alt="ベクトル探索におけるL1距離式" /><p>視覚的に、L1 距離は以下の図 5 のように表すことができます。</p><p></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb90a33e6b1cbe00b/6a17e0d0414c64eb76945096/52075441892151536ed216081817a8e852566daa-474x464.png" alt="2つのベクトル間のL1距離を視覚化する" /><p>2 つのベクトル x と y、たとえば x = (1, 2) と y = (4, 3) を取ると、両方のベクトルの L1 距離は | 1 - 4 | + | 2 - 3 | = 4 になります。</p><h4>L2距離</h4><p>2 つのベクトル x と y の L2 距離 (ユークリッド距離とも呼ばれます) は、まずそのすべての要素のペアワイズ差の 2 乗を合計し、その結果の平方根を取ることによって測定されます。基本的には 2 点間の最短経路 (斜辺とも呼ばれます) です。L1と同様に、距離dが小さいほど、2つのベクトルは近くなります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltae9b63fb593ae225/6a17e0d1af47b68379cddea8/b7675aa41f4f381e954c21dacd23a51a2dde6780-384x112.png" alt="ベクトル探索におけるL2距離" /><p>L2距離は以下の図6に示されています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt32d913b46e07e79d/6a17e0d27f6f1582f7c09a57/bac99d08d6cf8a3a387a8acdc2e8f67357dad235-448x456.png" alt="2つのベクトル間のL2距離を視覚化する" /><p>L1距離に使用したのと同じ2つのサンプルベクトルxとyを再利用すると、L2距離はとして計算できます。10 の平方根を取ると 3.16 になります。</p><p></p><h4>ライン距離</h4><p>2 つのベクトル x と y の Linf (L 無限大) 距離は、チェビシェフ距離またはチェス盤距離とも呼ばれ、任意の 2 つの要素間の最長距離、または軸/次元の 1 つに沿って測定された最長距離として定義されます。式は非常にシンプルで、次のようになります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt863411e15de16fa3/6a17e0d4505ac30939ad8a48/179ea6c6520a59acd97638313a2fb1b105e2ffed-436x82.png" alt="ベクトル探索におけるLinf距離の式" /><p>Linf 距離の表現を以下の図 7 に示します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt863ee7b51fd5fc15/6a17e0d56864a4772db686af/b75540d793cdc0645244d77dc36da9d5734ccbac-548x560.png" alt="2つのベクトル間のLinf距離" /><p>ここでも、同じ 2 つのサンプル ベクトル x と y を取ると、L 無限大距離を max ( | 1 - 4 | 、 | 2 - 3 | ) = max (3, 1) = 3 として計算できます。</p><h4>コサイン類似度</h4><p>L1、L2、Linf とは対照的に、コサイン類似度は 2 つのベクトル x と y 間の距離を測定するのではなく、それらの相対的な角度、つまり両方がほぼ同じ方向を向いているかどうかを測定します。類似度が高いほど、2 つのベクトルは「近い」ことになります。式も非常にシンプルで、次のようになります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61d55341a6457ab7/6a17e0d7e9ea872b4ea9c4e2/931b6b90f0ee83e63a66496d06d6b4cef3affddd-304x72.png" alt="ベクトル検索におけるコサイン類似度の式" /><p>2 つのベクトル間のコサイン類似度を表す方法を以下の図 8 に示します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt50eb6399510b5380/6a17e0d83e9e45302cba139a/52092e8b5d366178e50a35f8c954ee8eaca76965-582x586.png" alt="2つのベクトル間のコサイン類似度" /><p>さらに、コサイン値は常に [-1, 1] の範囲内にあるため、図 9 に示すように、-1 は反対の類似性 (つまり、両方のベクトル間の角度が 180°)、0 は無関係の類似性 (つまり、角度が 90°)、1 は同一 (つまり、角度が 0°) を意味します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt785e195c75a5089e/6a17e0da1d1b8355bc93e398/fd2690a845b89b69ff202bd04192893638538aec-1600x456.png" alt="ベクトル探索におけるコサイン類似度スペクトル" /><p>
もう一度、同じサンプルベクトル x と y を再利用し、上記の式を使用してコサイン類似度を計算してみましょう。まず、両方のベクトルのドット積をとして計算します。次に、両方のベクトルの長さ（大きさとも呼ばれます）を掛けます： 最後に、ドット積を乗算した長さ 10 / 11.18034 = 0.894427 (つまり、角度 26°) で割ります。これは 1 に非常に近いため、両方のベクトルは非常に似ていると見なすことができます。</p><h4>ドット積類似度</h4><p>コサイン類似度の欠点の 1 つは、2 つのベクトル間の角度のみが考慮され、大きさ (長さ) は考慮されないことです。つまり、2 つのベクトルがほぼ同じ方向を指していても、一方が他方よりもはるかに長い場合、両方とも類似していると見なされます。ドット積類似度 (スカラーまたは内積とも呼ばれる) は、ベクトルの角度と大きさの両方を考慮することで類似度を改善し、より正確な類似度メトリックを提供します。</p><p>ドット積類似度を計算するために、2 つの同等の式が使用されます。1 つ目は、先ほどコサイン類似度の分子で見たものと同じです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f1c3369f8628457/6a17e0db1d1b832a1893e39c/52e2723926ab27cd96b688e805fae15f607073c8-482x104.png" alt="ベクトル検索におけるドット積類似度式" /><p>2 番目の式は、両方のベクトルの長さにそれらの間の角度の余弦を掛けるだけです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt136dd2a749c2398a/6a17e0dc6df73108a80a0e1f/dc9b11fc67dd748d9f1f29b735f4726138cb7d39-452x70.png" alt="ベクトル検索における内積類似度公式の簡略化" /><p>ドット積の類似性は、以下の図 10 に視覚化されています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb2c095e1c1948752/6a17e0dd6df731e30b0a0e23/1bda38cf82a1e1037f44b6e9657602c9efe1c0a6-558x574.png" alt="2つのベクトル間のドット積類似度" /><p>最後にもう一度、サンプルの x ベクトルと y ベクトルを取り、最初の式を使用して、(1  4) + (2  3) = 10 として、先ほどコサイン類似度を計算したのと同じように、ドット積類似度を計算します。</p><p>2 番目の式を使用して、両方のベクトルの長さを掛けます: これに両方のベクトル間の角度 26° のコサインを掛けると、11.18034  cos(26°) = 10 になります。</p><p>注目すべき点は、すべてのベクトルが最初に<strong>正規化されて</strong>いる場合（つまり、長さが 1 の場合）、ドット積類似度はコサイン類似度（|x| |y| = 1 であるため）、つまり両方のベクトル間の角度のコサインとまったく同じになることです。後で説明するように、ベクトルを正規化することは、ベクトルの大きさを無関係にして類似性が角度のみに焦点を当てるようにするために採用する良い方法です。また、インデックス作成時およびクエリ時の距離計算も高速化されますが、これは数十億のベクトルを操作するときに大きな問題になる可能性があります。</p><h3>簡単な要約</h3><p>さて、これまで非常に多くの情報を見てきましたが、ここで少し立ち止まって、これまでの状況を簡単に振り返ってみましょう。私たちは次のことを学びました…</p><ul><li><p>…セマンティック検索は、非構造化データを多次元埋め込みベクトルに変換することに優れたディープラーニング ニューラル ネットワーク モデルに基づいています。</p></li><li><p>…モデルの各次元は、非構造化データの機能または特性を表します。</p></li><li><p>…埋め込みベクトルは、特定の非構造化データが各次元にどの程度類似しているかを表す類似度値のシーケンス（各次元に 1 つずつ）です。</p></li><li><p>… 2 つのベクトルが「近い」ほど（つまり、最も近い隣り合うベクトルほど）、意味的に類似した概念を表していることになります。</p></li><li><p>…距離関数 (L1、L2、Linf) を使用すると、2 つのベクトルがどれだけ近いかを測定できます。</p></li><li><p>…相似関数 (コサインとドット積) を使用すると、2 つのベクトルが同じ方向にどれだけ進んでいるかを測定できます。</p></li></ul><p></p><p>さて、最後に掘り下げる必要があるのは、ベクター検索エンジンそのものです。クエリが送られてくると、まずクエリがベクトル化され、次にベクトル検索エンジンがそのクエリ ベクトルに最も近い隣接ベクトルを見つけます。クエリ ベクトルとデータベース内のすべてのベクトル間の距離または類似性を測定するブルート フォース方式は、データ セットが小さい場合には有効ですが、ベクトルの数が増えるとすぐに不十分になります。言い換えれば、数百万、数十億、あるいは数兆ものベクトルをインデックス化し、クエリベクトルの最近傍を妥当な時間内に見つけるにはどうすればよいでしょうか。そこで私たちは賢くなって、ベクトルをインデックスする最適な方法を見つけ出し、精度をあまり落とさずにできるだけ早く最近傍に焦点を絞る必要があります。</p><h3>ベクトル探索アルゴリズムと技術</h3><p>長年にわたり、さまざまな研究チームが、非常に巧妙なベクトル検索アルゴリズムの開発に多大な労力を費やしてきました。ここでは、主なものを簡単に紹介します。使用ケースに応じて、他のものよりも適しているものがあります。</p><h4>線形探索</h4><p>先ほど、クエリ ベクトルをデータベース内に存在するすべてのベクトルと比較するブルート フォース手法について説明した際に、線形検索、つまりフラット インデックスについて簡単に触れました。小さなデータセットではうまく機能する可能性がありますが、ベクトルと次元の数が増えるとパフォーマンスが急激に低下します (O(n) の複雑度)。</p><p>幸いなことに、<strong>近似最近傍法</strong>(ANN) と呼ばれるより効率的なアプローチがあります。この方法では、埋め込みベクトル間の距離が事前に計算され、類似のベクトルが、たとえばクラスター、ツリー、ハッシュ、グラフなどを使用して、互いに近くなるように保存および整理されます。このようなアプローチは、通常 100% の精度を保証しないため、「近似」と呼ばれます。最終的な目標は、類似のベクトルが含まれる可能性が最も高い領域のみに焦点を当てるために、<strong>検索範囲をできるだけ早くできるだけ小さく</strong>するか、<strong>ベクトルの次元を減らす</strong>ことです。</p><h4>K次元ツリー</h4><p>K 次元ツリー (KD ツリー) は、k 次元空間にポイントを格納するバイナリ検索ツリーの一般化であり、検索空間をベクトルがインデックス付けされた小さな左ツリーと右ツリーに連続的に二分することによって機能します。検索時には、アルゴリズムは、クエリ ベクトル (図 11 の赤い点) の周囲のいくつかのツリー ブランチを訪問するだけで、最も近い近傍 (図 11 の緑の点) を見つけることができます。k 個を超える近傍が要求された場合、アルゴリズムがさらに多くの近傍を見つけるまで黄色の領域が拡張されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt55e01707cd9fca57/6a17e0dfbe60866a90004653/e21af2d613112279089b6fa2166359233b10019d-829x860.png" alt="ベクトル探索におけるKD木アルゴリズム" /><p>KD ツリー アルゴリズムの最大の利点は、一部のローカライズされたツリー ブランチのみに素早く焦点を当てることができるため、ほとんどのベクトルを考慮から除外できることです。ただし、次元数が増えると、低次元空間よりも多くの分岐を訪問する必要があるため、このアルゴリズムの効率は低下します。</p><h4>逆ファイルインデックス</h4><p>逆ファイルインデックス (IVF) アプローチも、互いに近いベクトルを共有の重心に割り当てる<strong>空間分割</strong>アルゴリズムです。2D 空間では、図 12 に示すように、ボロノイ図でこれを視覚化するのが最適です。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7b7e4fe6deff5ef3/6a17e0e17b54f940eb8b381c/33ddaaa818ab2f2a5fc87982c82c2a34cb849e33-640x640.png" alt="2次元空間における逆ファイルインデックスのボロノイ表現 " /><p>上記の 2D 空間は 20 個のクラスターに分割されており、それぞれのクラスターの重心は黒い点で示されています。空間内のすべての埋め込みベクトルは、それらの重心が最も近いクラスターに割り当てられます。検索時に、アルゴリズムはまず、クエリ ベクトルに最も近い重心を見つけることで、焦点を当てるクラスターを判断し、次に、その領域と、必要に応じて周囲の領域に焦点を絞って、最も近い近傍を見つけます。</p><p>このアルゴリズムは、高次元空間で使用する場合、KD ツリーと同じ問題が発生します。これは次元の呪いと呼ばれ、空間の体積が非常に大きくなり、すべてのデータがまばらに見え、より正確な結果を得るために必要なデータの量が指数関数的に増加する場合に発生します。データがまばらな場合、これらの空間分割アルゴリズムでデータをクラスターに整理することが難しくなります。幸いなことに、この問題を軽減する他のアルゴリズムとテクニックが存在します。以下に詳細を説明します。</p><h4>量子化</h4><p>量子化は<strong>圧縮</strong>ベースのアプローチであり、埋め込みベクトルの精度を下げることでデータベースの合計サイズを削減できます。これは、浮動小数点ベクトル値を整数値に変換することにより<strong>、スカラー量子化 (SQ)</strong>を使用して実現できます。これにより、データベースのサイズが 8 分の 1 に縮小されるだけでなく、メモリ消費も減少し、検索時のベクトル間の距離計算が高速化されます。</p><p>もう 1 つの手法は<strong>積量子化 (PQ) と呼ばれ、</strong>最初に空間を低次元のサブスペースに分割し、次にクラスタリング アルゴリズム (k 平均法に類似) を使用して各サブスペース内で互いに近いベクトルをグループ化します。</p><p>量子化は<strong>次元削減</strong>とは異なることに注意してください。次元削減では次元数が削減され、ベクトルが単に短くなります。</p><h4>階層的にナビゲート可能なスモールワールド（HNSW）</h4><p>名前だけ読むと複雑に思えても心配しないでください。実際はそうではありません。つまり、Hierarchical Navigable Small Worlds は、非常に人気があり効率的な多層グラフベースのアルゴリズムです。Apache Lucene を含むさまざまなベクター データベースで使用されます。HNSW の概念的表現を以下の図 13 に示します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f4f4a8e393c8d53/6a17e0e3e8fbcefa193a1861/189ef9a8bec476e379222c454644ba4c1f952085-1400x840.png" alt="階層的にナビゲート可能なスモールワールド（HNSW）" /><p>最上層には、ベクトル間のリンクが最も長い少数のベクトルのグラフ、つまり、類似性が最も低い接続されたベクトルのグラフが表示されます。下の層に進んでいくと、見つかるベクトルの数が増え、グラフの密度が増し、ベクトル同士がどんどん接近していきます。最下層では、すべてのベクトルを見つけることができ、最も類似したベクトルが互いに最も近く配置されます。</p><p>検索時に、アルゴリズムは任意のエントリ ポイントの最上位レイヤーから開始し、クエリ ベクトル (灰色の点で表示) に最も近いベクトルを見つけます。次に、1 つ下のレイヤーに移動して、上のレイヤーに残したのと同じベクトルから始めて、同じプロセスを繰り返します。これを 1 レイヤーずつ続けて、最下層に到達してクエリ ベクトルに最も近い近傍を見つけます。</p><h4>局所性依存ハッシュ（LSH）</h4><p>これまでに紹介した他のすべてのアプローチと同様に、局所性に敏感なハッシュは、検索速度を向上させるために検索スペースを大幅に削減することを目指しています。この技術では、類似性情報を保持したまま埋め込みベクトルがハッシュ値に変換されるため、検索空間は最終的に、トラバースする必要のあるグラフやツリーではなく、検索できる単純なハッシュ テーブルになります。ハッシュベースの方法の主な利点は、任意の（大きな）数の次元を含むベクトルを固定サイズのハッシュにマッピングできるため、精度をあまり犠牲にすることなく検索時間が大幅に短縮されることです。</p><p>一般的にデータのハッシュ方法、特にベクトルの埋め込み方法は多種多様ですが、この記事ではそれぞれの詳細については説明しません。従来のハッシュ方法では、通常、非常に類似しているように見えるデータに対して非常に異なるハッシュが生成されます。埋め込みベクトルは浮動小数点値で構成されているため、ベクトル演算で互いに非常に近いと考えられる 2 つのサンプル浮動小数点値 (たとえば、0.73 と 0.74) を取り、いくつかの一般的なハッシュ関数を実行してみましょう。以下の結果を見ると、一般的なハッシュ関数では入力間の類似性を保持していないことは明らかです。</p><p>ハッシュ関数</p><p>0.73</p><p>0.74</p><p>MD5</p><p>1342129d04cd2924dd06cead4cf0a3ca</p><p>0aec1b15371bd979cfa66b0a50ebecc5</p><p>SHA1</p><p>49d2c3e0e44bff838e1db571a121be5ea874e8d9</p><p>a534e76482ade9d9fe4bff3035a7f31f2f363d77</p><p>SHA256</p><p>99d03fc3771fe6848d675339fc49eeb1cb8d99a12e6358173336b99a2ec530ea</p><p>5ecbc825ba5c16856edfdaf0abc5c6c41d0d8a9c508e34188239521dc7645663</p><p>従来のハッシュ方式では、類似したデータ間の<em>ハッシュ衝突を最小限に抑えよ</em>うとしますが、局所性に敏感なハッシュの主な目的は、まさにその逆、つまり、類似したデータが高い確率で同じバケット内に含まれるように<em>ハッシュ衝突を最大化する</em>ことです。そうすることで、多次元空間内で互いに近接する埋め込みベクトルは、同じバケットに含まれる固定サイズの値にハッシュされます。LSH ではハッシュされたベクトルの近接性を維持できるため、この手法はデータのクラスタリングや最近傍検索に非常に便利です。</p><p>すべての面倒な作業は、ハッシュを計算する必要があるインデックス作成時に発生しますが、検索時には、最も近い埋め込みベクトルを含むバケットを検索するためにクエリ ベクトルをハッシュするだけで済みます。候補バケットが見つかると、通常は 2 回目のラウンドが実行され、クエリ ベクトルに最も近い隣接ベクトルが識別されます。</p><h2>まとめましょう</h2><p>ベクトル検索を紹介するために、この記事ではかなり広範囲にわたる内容を扱う必要がありました。語彙検索とベクトル検索の違いを比較した後、ディープラーニング ニューラル ネットワーク モデルが非構造化データのセマンティクスを捕捉し、その意味を高次元埋め込みベクトル (モデルの各次元に沿ったデータの類似性を表す浮動小数点数のシーケンス) に変換する方法を学びました。また、ベクトル検索と語彙検索は競合するものではなく、補完的な情報検索手法であることも注目に値します (このシリーズの第 3 部でハイブリッド検索について詳しく説明するときに説明します)。</p><p>その後、ベクトル検索の基本的な構成要素である距離 (および類似度) 関数を導入しました。これにより、2 つのベクトルの近接性を測定し、それらが表す概念の類似性を評価できるようになります。</p><p>最後に、ツリー、グラフ、クラスター、ハッシュをベースにした、最も人気のあるさまざまなベクトル検索アルゴリズムとテクニックを確認しました。その目的は、線形ブルート フォース検索のように空間全体を調べなくても、多次元空間の特定の領域をすばやく絞り込み、最も近い近傍を見つけることです。</p><p>この記事が気に入ったら、ぜひこのシリーズの他の部分も読んでみてください。</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/vector-search-set-up-elasticsearch">パート2：Elasticsearchでベクトル検索を設定する方法</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/hybrid-search-elasticsearch">パート3: Elasticsearchを使用したハイブリッド検索</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/introduction-to-vector-search</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/introduction-to-vector-search</guid>
    <category><![CDATA[Vector Database]]></category>
    <dc:creator><![CDATA[Valentin Crettaz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt70da374b8dc0c490/6a17e0e46864a473aab686b3/63eea8ea95b49e7241e539f65bf5aa3bb8823fff-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[ベクトル類似度測定とスコアリング]]></title>
    <description><![CDATA[Elasticsearchにおけるベクトル類似度尺度とスコアリングについて、L1距離、L2距離、コサイン類似度、ドット積類似度、最大内積類似度などを含めて検討します。]]></description>
    <content:encoded><![CDATA[<p>フリーテキストを検索する必要が生じ、Ctrl+F / Cmd+F では不十分になった場合、通常、次に思い浮かぶ論理的な選択肢は語彙検索エンジンの使用です。語彙検索エンジンは、検索対象のテキストを分析し、検索時に一致可能な用語にトークン化することに優れていますが、インデックス付けおよび検索対象のテキストの真の意味を理解し、意味を成すという点では、通常、不十分です。</p><p>まさにここでベクター検索エンジンが活躍します。同じテキストをインデックス化して、そのテキストが表す意味と、類似または関連する意味を持つ他の概念との関係の両方に基づいて検索できるようにすることができます。</p><p>このブログでは、ベクトルがテキストの意味を伝えるための優れた数学的概念である理由について簡単に触れたいと思います。次に、近隣ベクトルの検索、つまり類似の意味を持つベクトルの検索と、それらのスコア付けの方法について、Elasticsearch がサポートするさまざまな類似性テクニックについて詳しく説明します。</p><h2>ベクトル埋め込みとは何ですか？</h2><p>この記事では、ベクトル埋め込みの複雑な部分については詳しく説明しません。このトピックをさらに詳しく調べたい場合、または続行する前に入門書が必要な場合は、<a href="https://www.elastic.co/jp/what-is/vector-embedding">次のガイド</a>を確認することをお勧めします。</p><p>簡単に言えば、ベクトル埋め込みは機械学習プロセスを通じて得られる（例えばあらゆる種類の非構造化入力データ (生のテキスト、画像、ビデオ、音声など) を、意味と関係性を持つ数値データに変換する AI (人工知能) です。非構造化データの種類によって、各データの種類を「理解」するようにトレーニングされたさまざまな種類の機械学習モデルが必要です。</p><p>各ベクトルは、特定のデータ部分を多次元空間内の点として配置し、その位置はモデルがデータを特徴付けるために使用する一連の機能を表します。次元の数は機械学習モデルによって異なりますが、通常は数百から数千の範囲です。たとえば、 <a href="https://platform.openai.com/docs/guides/embeddings">OpenAI Embeddings モデルは</a>1536 次元を誇りますが、 <a href="https://docs.cohere.com/reference/embed">Cohere Embeddings モデルは</a>382 から 4096 次元の範囲になります。Elasticsearch の dense_vector フィールド タイプは、最新リリース時点で最大 4096 次元をサポートします。</p><p>ベクトル埋め込みの本当の特徴は、同様の意味を共有するデータ ポイントが空間内で互いに接近していることです。もう 1 つの興味深い点は、ベクトル埋め込みがデータ ポイント間の関係を捉えるのにも役立つことです。</p><h2>ベクトルをどのように比較するのでしょうか?</h2><p>非構造化データは機械学習モデルによって、多数の次元に沿ったデータの類似性を捉えるベクトル埋め込みに細分化されることがわかったので、次にそれらのベクトルのマッチングがどのように機能するかを理解する必要があります。答えは非常に簡単であることがわかりました。</p><p>互いに<strong>近い</strong>ベクトル埋め込みは<strong>、意味的に類似した</strong>データ部分を表します。したがって、ベクトル データベースをクエリする場合、検索入力 (画像、テキストなど) は、すべての非構造化データのインデックス作成に使用されたのと同じ機械学習モデルを使用して、まずベクトル埋め込みに変換され、最終的な目標はそのクエリ ベクトルに<strong>最も近い隣接ベクトル</strong>を見つけることです。したがって、必要なのは、クエリ ベクトルと、データベースにインデックスが付けられた既存のすべてのベクトルとの間の「距離」または「類似性」を測定する方法を見つけることだけです。とても簡単です。</p><h2>距離、類似性、スコアリング</h2><p>幸いなことに、ベクトル演算のおかげで、2 つのベクトル間の距離または類似性を測定することは簡単に解決できる問題です。それでは、Elasticsearch でサポートされている最も人気のある距離と類似度の関数を見てみましょう。警告、この先は数学です!</p><p>始める前に、スコアリングについて簡単に見てみましょう。実際のところ、Lucene ではスコアは正の値のみが許可されます。これから紹介するすべての距離関数と類似度関数は、2 つのベクトルがどれだけ近いか、または類似しているかの尺度を生成しますが、それらの生の数値は負になる可能性があるため、スコアとして使用するのに適することはほとんどありません。このため、最終スコアは、スコアが正になり、スコアが大きいほどランキングが高くなる（つまり、ベクトルが近い）ように、距離または類似度の値から導き出す必要があります。</p><h3>L1距離</h3><p>2 つのベクトルとの L1 距離 (マンハッタン距離とも呼ばれます) は、それらのすべての要素のペアワイズ絶対差を合計することによって測定されます。明らかに、距離が小さいほど、2つのベクトルは近くなります。L1距離の式（1）は、以下に示すように非常に単純です。</p><p>視覚的に、L1 距離は以下の図 (赤) のように表すことができます。</p><p>次の2つのベクトルとのL1距離を計算するととなる。</p><p><strong>重要:</strong> L1<a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/current/query-dsl-script-score-query.html#vector-functions-l1"> </a>距離関数は、<code>script_score</code> DSL クエリを使用した<a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.11/dense-vector.html#dense-vector-params"> 正確なベクトル検索(別名、ブルート</a> フォース検索) でのみサポートされ、<a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.11/knn-search.html#approximate-knn"><code>knn</code></a><a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.11/knn-search.html#approximate-knn"> 検索オプション</a> または<a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html"><code>knn</code></a><a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html"> DSL クエリ を使用した 近似</a> kNN 検索 ではサポートされないことに注意してください。</p><h3>L2距離</h3><p>2 つのベクトルとの L2 距離 (ユークリッド距離とも呼ばれます) は、まずそれらのすべての要素のペアワイズ差の 2 乗を合計し、次にその結果の平方根をとることによって測定されます。基本的には 2 点間の最短経路です。L1と同様に、距離が小さいほど、2つのベクトルは近くなります。</p><p>L2 距離は、下の画像で赤で示されています。</p><p> 距離に使用したのと同じ 2 つのサンプル ベクトル と 距離を として計算できるようになります。</p><p>スコアリングに関しては、2 つのベクトル間の距離が小さいほど、それらのベクトルは近い (つまり、類似している) と言えます。したがって、スコアを導き出すには、距離の測定を逆転させて、最小の距離で最高のスコアが得られるようにする必要があります。L2距離を用いた場合のスコアの計算方法は、以下の式（3）のようになります。</p><p>前の例のサンプルベクトルを再利用すると、スコアはになります。互いに非常に近い 2 つのベクトルのスコアは 1 に近づきますが、互いに非常に離れた 2 つのベクトルのスコアは 0 に近づく傾向があります。</p><p>L1 距離関数と L2 距離関数についてまとめると、これらを比較する良い例えは、A と B をニューヨーク市マンハッタンの 2 つの建物として考えることです。A から B まで行くタクシーは L1 パス (街路や大通り) に沿って走行する必要がありますが、鳥はおそらく L2 パス (直線) を使用するでしょう。</p><h3>コサイン類似度</h3><p>L1 および L2 とは対照的に、コサイン類似度は 2 つのベクトルと間の距離を測定するのではなく、それらの相対的な角度、つまり両方がほぼ同じ方向を向いているかどうかを測定します。類似度が高いほど、2 つのベクトル間の角度が小さくなり、したがって、それらのベクトルは「近く」なり、伝えられる意味は「似ている」ことになります。</p><p>これを説明するために、野外でそれぞれ異なる方向を見ている 2 人の人物を考えてみます。下の図では、青い人物はベクトルで示される方向を向いており、赤い人物はベクトルの方向を向いています。視線を同じ方向に向けるほど（つまり、ベクトルが近づくほど）、青と赤の領域で表された視野の重なり合う部分が大きくなります。視野がどの程度重なるかがコサイン類似度です。ただし、人物 B は人物 A よりも遠くを見ていることに注意してください (つまり、ベクトルが長い)。人 B は地平線の遠くの山を眺めているかもしれませんが、人 A は近くの木を眺めているかもしれません。コサイン類似度の場合、角度だけが関係するため、コサイン類似度は役割を果たしません。</p><p>それでは、コサイン類似度を計算してみましょう。式（4）は非常に単純で、分子は2つのベクトルのドット積で構成され、分母にはベクトルの大きさ（つまり長さ）の積が含まれます。</p><p>と間のコサイン類似度は、それらの間の角度の尺度として以下の画像に示されています (赤で表示)。</p><p>これらのコサイン類似度値が具体的に何を意味するのかを説明するために、少し回り道をしてみましょう。下のコサイン関数を示す画像に見られるように、値は常に範囲内で振動します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc0e4eb98ebb64cf3/6a17da287b54f983818b3783/e31145284b8c27d0bd9e3d2831f811388134fd83-1188x272.png" alt="余弦関数" /><p>2 つのベクトルが類似しているとみなされるためには、その角度が可能な限り鋭角で、理想的には角度に近く、完全な類似度がになる必要があることに注意してください。つまり、ベクトルは...</p><ol><li><p>...互いに<strong>近づくと</strong>、角度の余弦は近づきます（つまり、 に近づきます）。</p></li></ol><ol><li><p>...<strong>無関係ですが</strong>、角度の余弦は近づきます（つまり、 に近づきます）。</p></li></ol><ol><li><p>...<strong>反対に</strong>、その角度の余弦はに近づきます（つまり、 に近づきます）。</p></li></ol><p>2つのベクトル間のコサイン類似度を計算する方法がわかり、結果の値をどのように解釈するかもよくわかったので、同じサンプルベクトルとを再利用し、先ほど見た式（4）を使用してコサイン類似度を計算できます。</p><p>コサイン類似度は となり、これは よりも に近いため、 2 つのベクトルは<strong> 多少類似して</strong> いる、つまり完全に類似しているわけではないが、完全に無関係でもなく、明らかに反対の意味を持っていないことを意味します。</p><p>任意のコサイン類似度値から正のスコアを導き出すには、次の式（5）を使用する必要があります。この式は、 範囲内で振動するコサイン類似度値をの範囲内のスコアに変換します。</p><p>したがって、サンプルベクトルとのスコアは次のようになります:  。</p><h3>ドット積類似度</h3><p>コサイン類似度の欠点の 1 つは、2 つのベクトル間の角度のみが考慮され、大きさは考慮されないことです。つまり、2 つのベクトルがほぼ同じ方向を指していても、一方が他方よりもはるかに長い場合、両方とも類似していると見なされます。ドット積類似度 (スカラー類似度または内積類似度とも呼ばれる) は、ベクトルの角度と大きさの両方を考慮することで類似度を改善し、より正確な類似度メトリックを提供します。ベクトルの大きさを無関係にするために、ドット積類似性では、まずベクトルを正規化する必要があります。そのため、最終的には単位長さ 1 のベクトルのみを比較することになります。</p><p>先ほどと同じ 2 人の人物でもう一度これを説明してみます。ただし今回は、彼らを円形の部屋の中央に配置し、彼らの視界の範囲 (つまり、部屋の半径) がまったく同じになるようにします。コサイン類似度と同様に、同じ方向を向くほど（つまり、ベクトルが近づくほど）、視野の重なり合う部分が多くなります。しかし、コサイン相似とは逆に、両方のベクトルの長さは同じで、両方の領域の表面積も同じなので、2 人の人物は同じ距離にあるまったく同じ画像を見ていることになります。これら 2 つの領域がどの程度重なり合っているかは、それらのドット積の類似性を示します。</p><p>ドット積の類似度の式を紹介する前に、ベクトルを正規化する方法を簡単に見てみましょう。これは非常に簡単で、2 つの簡単な手順で実行できます。</p><ol><li><p>ベクトルの大きさを計算する</p></li><li><p>各成分を1で得られた大きさで割ります。</p></li></ol><p>例として、ベクトルを取ります。コサイン類似度を確認したときに見たように、その大きさを計算できます。つまり、 。次に、ベクトルの各成分をその大きさで割ると、次の正規化ベクトルが得られます。</p><p>2番目のベクトルに対して同じプロセスを実行すると、次の正規化されたベクトルが生成されます。</p><p>ドット積類似度式を導くために、正規化されたベクトルと間のコサイン類似度を式(4)を用いて以下のように計算することができる。</p><p>そして、両方の正規化されたベクトルの大きさがなったので、ドット積の相似式（6）は単純に、両方の正規化されたベクトルのドット積になります。</p><p>下の図では、正規化されたベクトルとを示しており、1 つのベクトルを他のベクトルに投影することで、それらのドット積の類似性を示しています (赤で表示)。</p><p>新しい式（6）を使用すると、2つの正規化されたベクトルのドット積類似度を計算することができ、当然のことながら、コサインの類似度とまったく同じ類似度値が得られます。</p><p>ドット積類似性を活用する場合、ベクトルに浮動小数点値が含まれているかバイト値が含まれているかに応じて、スコアの計算方法が異なります。前者の場合、スコアはコサイン類似度の場合と同じ方法で以下の式（7）を使用して計算されます。</p><p>しかし、ベクトルがバイト値で構成されている場合、スコアリングの計算方法は以下の式（8）に示すように少し異なります。ここで、 ベクトルの次元数です。</p><p>また、正確なスコアを生成するための制約の 1 つは、クエリ ベクトルを含むすべてのベクトルの長さが同じである必要があるが、必ずしも 1 である必要はないということです。</p><h3>最大内積類似度</h3><p>リリース 8.11 以降では、ベクトルを正規化する必要がないという点で、ドット積類似度よりも制約が少ない新しい類似度関数があります。この主な理由は<a href="https://www.elastic.co/jp/search-labs/blog/lucene-bringing-maximum-inner-product-to-lucene">以下の記事</a>で詳しく説明されていますが、簡単にまとめると、特定のデータセットはベクトルの正規化にあまり適しておらず (例: <a href="https://www.elastic.co/jp/search-labs/blog/elasticsearch-cohere-embeddings-support">Cohere 埋め込み</a>)、正規化すると関連性の問題が発生する可能性があります。</p><p>最大内積類似度を計算する式は、ドット積の式とまったく同じです（6）。変わるのは、以下の式(9)に示すように、類似性が正か負かによって式が変わる区分関数を使用して最大内積類似度をスケーリングしてスコアを計算する方法です。</p><p>この区分関数は、 区間内のすべての負の最大内積類似度値と、 区間内のすべての正の値をスケーリングします。</p><h2>要約すれば</h2><p>数学的に言えば、これはかなり大変な話ですが、役に立つと思われるポイントをいくつか挙げておきます。</p><p>どの類似度関数を使用できるかは、最終的にはベクトル埋め込みが正規化されているかどうかによって決まります。ベクトルがすでに正規化されている場合、またはデータ セットがベクトルの正規化に依存しない場合 (つまり、関連性が損なわれない場合)、ベクトルを正規化してドット積類似度を使用できます。これは、各ベクトルの長さを計算する必要がないため、コサイン積類似度よりもはるかに高速に計算できるためです。何百万ものベクトルを比較する場合、それらの計算量は非常に多くなることがあります。</p><p>ベクトルが正規化されていない場合は、次の 2 つのオプションがあります。</p><ol><li><p>ベクトルを正規化できない場合はコサイン類似度を使用する</p></li><li><p>ベクトルの大きさが意味を持つため、それをスコアリングに反映させたい場合には、新しい最大内積類似度を使用します（例：Cohere埋め込み）。</p></li></ol><p>この時点で、ベクトル埋め込み間の距離または類似性を計算し、そのスコアを導き出す方法が理解できるはずです。この記事がお役に立てれば幸いです。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/vector-similarity-measures-and-scoring</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/vector-similarity-measures-and-scoring</guid>
    <category><![CDATA[Vector Database]]></category>
    <dc:creator><![CDATA[Valentin Crettaz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte5a3e9d39849d3ed/6a17da31a2929960a3d02b3f/4d9e89678798b9de68357b5cc06dbbd8b9c6e5e8-1440x823.webp" length="0" type="image/webp"/>
    <pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>