なぜ「お祭り」で検索すると「焼きそば」がヒットするのか?——数学なしでわかる、ベクトル検索のしくみ

なぜ「お祭り」で検索すると「焼きそば」がヒットするのか?——数学なしでわかる、ベクトル検索のしくみ

目次

    はじめに

    「ベクトル検索」では、文字が一致しなくても「意味が近い」データをヒットさせることができます。たとえばECサイトで「花粉がつらい」と検索したとき、「マスク」「空気清浄機」「目薬」がヒットするイメージです。商品名に「花粉がつらい」という文字は含まれていませんが、「意味が近い」という理由でヒットします。

    この技術は現在、RAGや画像・音楽の類似検索など、さまざまな場面で広く使われています。

    この記事では、【「お祭り」で検索し「焼きそば」がヒット】という例を使いながら、その仕組みを数学の知識なしに説明します。

    注記 概念のイメージをつかむことを優先しているため、技術的に簡略化・省略している箇所があります。

    1. ベクトル値とは何か

    ベクトル検索の仕組みを理解するカギが、ベクトル値です。

    ベクトル値とは一言でいうと、単語の「性質」を数値化したステータス表のようなものです。

    いくつかの「性質の軸」を用意して、各単語がその軸にどれだけ当てはまるかを-10〜+10の数値で表します。プラスが大きいほどその性質が強く、マイナスが大きいほどその性質が弱いという意味です。

      食べ物っぽさ 高級感 日本っぽさ
    お祭り +7 -7 +9
    焼きそば +9 -8 +7
    ハンバーガー +9 -5 -6
    ピアノ 0 +8 -5

    「お祭り」は食べ物っぽく、高級感がなく、日本的です。「焼きそば」もほぼ同じ方向性を持っています。「ピアノ」は食べ物でも日本的でもなく、高級感がある——お祭りとは真逆の性質です。

    このステータス表がベクトル値の正体です。

    補足① この「性質の軸」のことを、技術的には次元と呼びます。

    補足② 実際のAIモデルでは、このような軸(次元)が数百〜千以上あります。この記事では簡単に説明するために3次元だけにしています。

    補足③ ここでは「各単語にベクトル値がある」ことを前提として話を進めます。そのベクトル値がどのように算出されるかは、5章で説明します。

    補足④ この記事ではわかりやすさのために-10〜+10の整数で表していますが、実際のベクトル値は小数で、多くのモデルでは-1.0〜+1.0の範囲に収まります。

    2. どれが似ているかどうやって判断するか

    各単語がベクトル(ステータス表)で表せるなら、「ある2つの単語がどれだけ似ているか」も計算で出せます。

    ここでは内積という手法を使って説明します。計算の手順はシンプルで、各次元の数値を掛け算して、すべて合計するだけです。

    「お祭り」と「焼きそば」の類似度を計算してみましょう:

    次元 お祭り 焼きそば 計算結果
    食べ物っぽさ +7 +9 7×9=63
    高級感 -7 -8 (-7)×(-8)=56
    日本っぽさ +9 +7 9×7=63
    合計     182点

    「お祭り」と「ピアノ」の類似度も計算してみます:

    次元 お祭り ピアノ 計算結果
    食べ物っぽさ +7 0 7×0=0
    高級感 -7 +8 (-7)×8=-56
    日本っぽさ +9 -5 9×(-5)=-45
    合計     -101点

    この類似度スコアが高いほど「お祭り」との類似度が高い、つまりよく似ていて関連性が高いと判断できます。

    「お祭り」との類似度スコアは「焼きそば」が182点で関連性が高く、「ピアノ」が-101点で関連性が低いです。直感と一致する結果が出ました。

    この掛け算の計算には、関連度を自然に表す4つの性質があります。

    プラス同士 → 類似度スコア増
    食べ物っぽさ:お祭りは+7、焼きそばは+9。掛け算は63。「どちらもその性質が強い」という一致が類似度スコアに大きく反映されます。

    マイナス同士 → 類似度スコア増
    高級感:お祭りは-7、焼きそばは-8。掛け算は56。「どちらもその性質がない」という一致も同様に加算されます。

    プラスとマイナスが逆向き → 類似度スコア減
    高級感:お祭りは-7、ピアノは+8。掛け算は-56。性質が正反対なほど類似度スコアが大きく下がります。

    どちらかが0に近い → 類似度スコア影響小
    食べ物っぽさ:お祭りは+7、ピアノは0。掛け算は0。その次元があまり関係のない単語は類似度スコアにほとんど影響しません。

    詳細は省略しますが、この内積にさらに正規化の処理を加えたものがコサイン類似度と呼ばれる手法であり、実際のシステムで広く使われています。

    補足 類似度の計算方法は内積・コサイン類似度以外にも、ユークリッド距離などがあり、用途によって使い分けます。

    3. 大量データから、最も似ているものをどう見つけるか

    2章で2つの単語の類似度をスコアとして計算できました。では、データベースに何万件ものデータが保存されている場合、どうやって検索結果を返せばよいでしょうか。

    キーワード検索ではヒット・はずれが明確ですが、ベクトル検索にはそれがなく、すべてのデータに類似度スコアの高低があるだけです。そのため「類似度スコアランキング表の上位k件をヒットとして返す」というアプローチをとります。これをkNN(k近傍法)と呼びます。

    実際に「お祭り」と各単語の類似度スコアを並べると:

      類似度スコア
    焼きそば 182点
    ハンバーガー 44点
    ピアノ -101点

    「お祭り」で検索したら内部でこの類似度ランキング表を作り、その上位2件「焼きそば」と「ハンバーガー」をヒットとして返す、というイメージです。

    このランキング表の作り方は大きく2種類に分けられます。

    1. 全件探索(ブルートフォース) — 全データと類似度スコアを計算してランキングを作ります。正確ですが、データが増えるほど遅くなります。
    2. ANN(近似近傍探索) — あらかじめデータをグループに分けておき、関連しそうなグループだけに絞って類似度スコアを計算してランキングを作ります。わずかな取りこぼしはありますが大幅に速く、大規模なシステムではANNが選ばれることがほとんどです。

    補足 「上位k件を返す」という目的をkNNと呼び、その実現方法として「全件探索」と「ANN」があるという関係ですが、全件探索のことを慣習的に「kNN」と呼ぶことも多く、「kNN」か「ANN」かという選択肢で語られることも多いです。

    4. 次元を増やすとどうなるか

    ここで少し考えてみてください。このデータベースに「肉じゃが」を追加したとします。

      食べ物っぽさ 高級感 日本っぽさ
    お祭り +7 -7 +9
    焼きそば +9 -8 +7
    ✨ 肉じゃが(追加) +9 -6 +9
    ハンバーガー +9 -5 -6
    ピアノ 0 +8 -5

    「お祭り」との類似度スコアを計算すると:7 × 9 + (-7) × (-6) + 9 × 9 = 63 + 42 + 81 = 186点

    「焼きそば」の182点を上回り、肉じゃがが1位になってしまいました

      スコア
    肉じゃが 186点 ← 1位!
    焼きそば 182点
    ハンバーガー 44点
    ピアノ -101点

    これはつまり、このデータベースに対して「お祭り」で検索したら「焼きそば」じゃなくて「肉じゃが」がヒットする、という状況です。
    「お祭り」と「肉じゃが」——どちらも食べ物で、安くて、日本的です。確かに数値は似ています。でも「お祭り」で検索したときに「肉じゃが」が1位にヒットしてほしい人はほとんどいないでしょう。3つの次元だけでは分類しきれない性質の違いがあるようです。

    そこで4つ目の次元を追加しましょう。アウトドア感です。

      食べ物っぽさ 高級感 日本っぽさ アウトドア感
    お祭り +7 -7 +9 +8
    焼きそば +9 -8 +7 ⬆️ +7
    肉じゃが +9 -6 +9 ⬇️ -8
    ハンバーガー +9 -5 -6 -3
    ピアノ 0 +8 -5 -7

    お祭りのアウトドア感は+8。焼きそばも+7。しかし肉じゃがはアウトドア感-8——完全に家の中で作る料理です。

    4次元目を加えた新しいスコアを見てみましょう:

      3次元スコア 4次元スコア
    焼きそば 182点 238点
    肉じゃが 186点 122点 ↓大幅減
    ハンバーガー 44点 20点
    ピアノ -101点 -157点

    「お祭り」に対する類似度スコアで「焼きそば」が1位に返り咲き、「肉じゃが」は大幅に落ちました。アウトドア感という1つの次元を加えただけで、検索精度が大きく改善されました。

    このように、次元が少ないとざっくりとした分類しかできず、次元を増やすことで細かなニュアンスを捉えられるようになります。実際のAIモデルでは次元が数百〜千以上あり、それぞれが異なる側面を捉えることで高精度な判断を実現しています。

    ただし、次元を増やすとデータ量が増え、そのぶん処理が重くなります。 AIモデルによって出力する次元数は異なり、必要な精度と処理速度のバランスによって、どのAIモデルを使うかが選定基準の一つになります。

    5. ベクトル値はどうやって算出するか

    ここまでの説明では「各単語が性質ステータス表を持つ」ことを前提に話を進めてきました。では、そのステータス表の数値はどうやって決まるのでしょうか。


    穴埋め問題で学習する

    AIは大量の文章データを使って学習します。データの出所はWikipediaやニュース記事、書籍など、インターネット上に存在する膨大なテキストです。

    穴埋め問題はどうやって作るのか

    AIはこれらの文章から穴埋め問題を自動で作成します。たとえば:

    「お祭りの屋台で焼きそばを食べた」

    という文章から、「焼きそば」を空欄にして:

    「お祭りの屋台で_を食べた」

    という問題を自動生成します。空欄の前後にある「お祭り」「屋台」「を食べた」がヒントで、「焼きそば」が正解です。

    どうやって穴埋め問題の答えを出すのか

    「お祭りの屋台で_を食べた」という問題を解くとき、AIはヒント単語「お祭り」と学習データ中のすべての単語の類似度スコアを計算し、最もスコアが高い単語を答えとして選びます。

    ただし学習のはじめ、すべての単語はランダムなベクトル値から出発します。例として正解の「焼きそば」と、不正解の「ピアノ」の初期状態のスコアを見てみましょう:

      食べ物っぽさ 高級感 日本っぽさ お祭りとの類似度
    お祭り(ヒント) +3 -2 +5
    焼きそば(正解) -4 +6 -3 -39点
    ピアノ(はずれ) +6 -4 +8 +66点

    正解の「焼きそば」が-39点、無関係な「ピアノ」が+66点——ランダムなベクトルのせいで逆転しており、「お祭りの屋台でピアノを食べた」という間違った答えが出てしまいます。

    ベクトル値を調整する

    答えを出したあと、各単語のベクトル値に対して2種類の調整が行われます:

    • 正解の単語(焼きそば)のベクトルは、ヒント単語のベクトルに引き合わせる(近づける)
    • 不正解だった単語(ピアノなど)のベクトルは、ヒント単語のベクトルから反発させる(遠ざける)

    この「ヒント単語と正解単語の引き合い」「ヒント単語と不正解単語の反発」が何億回も積み重なることで、ベクトルは徐々に落ち着くべき方向へ収束していきます。

    途中経過:

      食べ物っぽさ 高級感 日本っぽさ お祭りとの類似度
    お祭り(途中) +5 -4 +6
    焼きそば(途中) +4 -2 +3 +46点
    ピアノ(途中) -1 +3 +2 -5点

    さらに学習を続けると:

      食べ物っぽさ 高級感 日本っぽさ お祭りとの類似度
    お祭り(完成) +7 -7 +9
    焼きそば(完成) +9 -8 +7 +182点
    ピアノ(完成) 0 +8 -5 -101点

    1章・2章で使っていたベクトル値はこうして出来上がったものです。

    「お祭り」と「焼きそば」が「屋台で_を食べた」のような文脈を共有することが多いため、何億回もの引き合いを経て二つのベクトルが近い方向を向くようになります。「ピアノ」はそのような文脈に登場しないため、反発が積み重なって遠ざかっていきます——これがベクトル値の正体です。

    補足 これは「Word2Vec」と呼ばれる一昔前に登場した手法を簡略化して説明したものです。現代の大規模AIモデル(BERTやGPTなど)はもっと複雑な仕組みを使っていますが、「大量の文章から文脈のパターンを学習する」という根本の考え方は共通しています。

    このような学習を経て、テキストをベクトルに変換する能力を持ったモデルのことをEmbeddingモデル(埋め込みモデル)と呼びます。OpenAI、Google、AWSなど各社がEmbeddingモデルを提供しており、ベクトル検索やRAGを実装する際はこれらのモデルを利用するのが一般的です。


    次元はAIが自動で作るもの

    実はここまで使ってきた「食べ物っぽさ」「高級感」「アウトドア感」という次元名は、この記事の説明のために筆者が仮につけたものです

    実際のAIモデルの各次元に名前はありません。学習を通じてベクトルの値が自動的に調整された結果、各次元は何らかの意味を帯びるようになりますが、それが「食べ物っぽさ」なのか何なのか、人間には解釈できません。


    文章をベクトル化する

    ここまでは単語単位の話でしたが、実際の検索では「お祭りで食べるのにおすすめのもの」のように文章で入力することの方が多いです。現代のAIモデルは文章全体を1つのベクトルとして出力できます。

    イメージとしては、文章に含まれる各単語のベクトルの平均が文章全体のベクトルです。ただし実際には語順や文脈も考慮したより複雑な処理が行われており、詳細はこの記事では省略します。

    補足 単語の平均ベクトルでは語順が無視されるため、「ライオンがうさぎを食べた」と「うさぎがライオンを食べた」は、同じ単語で構成されているため同じベクトルになってしまいます。意味はまったく異なるのに同じベクトルでは困ります。現代のAIモデルはこの点も考慮し、語順が違えば異なるベクトルを出力します。

    まとめ

    「お祭り」で検索したときに「焼きそば」がヒットする理由を振り返ってみましょう。

    1. ベクトル化 — 「お祭り」も「焼きそば」も、AIが学習した多次元のステータス表(ベクトル)で表されています
    2. 類似度計算 — 内積やコサイン類似度を使って、どれだけ似ているかを数値化します
    3. 検索(kNN) — データベース内の全データと類似度を計算し、スコアが高い順に上位k件(例えば上位10件)を返します。大規模なシステムでは高速化のためANNが使われることがほとんどです
    4. 精度向上 — 次元を増やすことで、「食べ物でも日本的でも高級感がなくても、お祭りとは違う」という微妙な違いも捉えられるようになります

    テキストに「お祭り」という文字がなくても、ベクトルの方向性が似ていればヒットする——これがベクトル検索の核心です。

    このベクトル技術はベクトル検索だけでなく、ChatGPTやGeminiなどのLLMにも使われています。「LLMとベクトル検索は別物」と思われがちですが、「言葉を数値で表す」という考え方は共通しています。

    おまけ:AIは言葉の「足し算・引き算」ができる!?

    AI・機械学習の世界に、こんな有名な式があります。

    「王様」 − 「男」 + 「女」 = 「女王」

    この式を見れば、答えが「女王」だと直感でわかると思います。 実は、AIもこのように言葉の足し算・引き算ができます。 この記事でベクトルの仕組みを理解した方なら、AIがどうやって解くのかも理解できます。 単純に、王様のベクトルから「男」という単語のベクトルをまるごと引いて「女」という単語のベクトルを足せば、結果として「女王」のベクトルに近づく——それだけのことです。

    では、例として 「焼きそば」 − 「日本」 = ? の式を解いてみましょう。「焼きそば」から「日本」という単語のベクトルをまるごと引き算します。

      食べ物っぽさ 高級感 日本っぽさ アウトドア感
    焼きそば +9 -8 +7 +7
    日本 0 +2 +10 +1
    焼きそば − 日本 +9 -10 -3 +6

    AIはこの「焼きそば − 日本」の計算結果のベクトルに最も近い単語をデータベースから探します。 食べ物で、庶民的で、外国っぽくて、アウトドア感がある——この結果ベクトルに最も近い単語として例えば「ホットドッグ」が返ってきます。

    この「言葉の算数」は実際に活用されており、現代のAI技術を支える重要な土台になっています。

    アジアクエスト株式会社では一緒に働いていただける方を募集しています。
    興味のある方は以下のURLを御覧ください。