JA EN
体系RAG・検索拡張
·無料·論文·9分で読めます

埋め込み(Embedding)を1から理解する — word2vecの直感から文脈化埋め込みまで

「王様 − 男 + 女 ≈ 女王」はなぜ成り立つのか。単語を数値の座標に変える埋め込みを、地図の比喩→分布仮説→word2vecの式→numpyコード→BERT以降の文脈化埋め込み→RAG実務の順で、前提知識ゼロから解説します。

対象textタスクragretrieval

Efficient Estimation of Word Representations in Vector Space


言葉を「地図の座標」にする

コンピュータは文字が読めません。「犬」という文字列は、機械にとってはただの記号であり、「猫」と近い意味だという情報はどこにも含まれていません。

そこで発想を変えます。すべての単語を、巨大な地図の上の1点として配置するのです。意味が近い単語は近くに、遠い単語は遠くに置く。「犬」のすぐ隣には「猫」や「ペット」がいて、「確定申告」は地図の反対側にいる——そんな地図が作れれば、「意味の近さ」は「地図上の距離」という計算できる量に化けます。

この地図上の座標こそが埋め込み(Embedding)です。実際の地図は2次元ですが、言葉の意味は2軸では収まらないので、数百〜数千次元の空間を使います。つまり埋め込みとは「単語(や文)を、意味を保ったまま数百個の数値の並び=ベクトルに変換したもの」です。ChatGPTのようなLLMも、検索拡張生成(RAG)の文書検索も、入口は全部この変換から始まります。

直感: 意味は「隣にくる単語」で決まる

では、その地図をどうやって作るのか。人間が「犬と猫は近い」と1個ずつ教えるのは不可能です。鍵になるのが、言語学で古くから知られる分布仮説です。

単語の意味は、その単語と一緒に現れる単語たちによって決まる。

「__にえさをやる」「__を散歩に連れて行く」という穴に入る単語は、「犬」でも「猫」でもだいたい自然です。つまり似た文脈に現れる単語は、意味も似ている。逆に言えば、大量の文章から「どの単語がどの単語の近くに現れるか」を数えれば、意味の地図は人手なしで作れるはずです。

2013年にGoogleのMikolovらが発表したword2vecは、この仮説を単純なニューラルネットで実装し、普通のPCでも大規模コーパスから高品質な単語ベクトルを学習できることを示しました。埋め込みブームの起点です。

仕組み: word2vecは「穴埋めクイズ」を解いているだけ

word2vecの代表的な学習方式skip-gramがやることは、拍子抜けするほど単純です。

  1. 文章から単語を1つ選ぶ(中心語 cc、例:「犬」)
  2. その周囲数単語(文脈語 oo、例:「散歩」「えさ」)を当てるクイズを解く
  3. 当てられるように、各単語のベクトルを少しずつ動かす

これを何億回も繰り返すだけです。「散歩」を当てるには「犬」と「猫」のベクトルが似た答えを出す必要があるので、似た文脈を持つ単語は自然と地図上で寄っていく——分布仮説がそのまま学習になっています。

クイズの「答え合わせ」を式にしたものがこちらです。

P(oc)=exp(uovc)wVexp(uwvc)P(o \mid c) = \frac{\exp(\mathbf{u}_o^\top \mathbf{v}_c)}{\sum_{w \in V} \exp(\mathbf{u}_w^\top \mathbf{v}_c)}
(1)

言い換えると「中心語 cc の隣に単語 oo が来る確率は、2つのベクトルの内積が大きいほど高い」という式です。vc\mathbf{v}_c は中心語のベクトル、uo\mathbf{u}_o は文脈語のベクトル、uovc\mathbf{u}_o^\top \mathbf{v}_c はその内積(相性スコア)。分母は語彙 VV の全単語のスコアを足したもので、全体を「合計1の確率」に直すためのsoftmaxです。

FIG 1内積で付けた「相性スコア」をsoftmaxが確率分布に変換する。スコアの差が大きいほど分布は一部の単語に集中する——スライダーで尖り方を体感できます

実務上の重要な工夫が1つあります。分母は「全語彙分の計算」を要求するので、語彙が数十万語あると1回の更新が重すぎます。そこで続編論文では、正解1個とランダムに選んだ偽物数個だけを見分ける2値クイズに置き換える負例サンプリング(negative sampling)が導入されました。「全員と比較」を「正解と数人の偽物の識別」に変えることで、計算量を桁違いに減らしています。

「近さ」の測り方: 内積とコサイン類似度

できあがった地図で「犬に近い単語」を探すには、ベクトル同士の近さを測る物差しが要ります。定番はコサイン類似度です。

sim(a,b)=abab\text{sim}(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\|\,\|\mathbf{b}\|}

読み下すと「2本のベクトルの内積を、それぞれの長さで割ったもの」=2本のベクトルがなす角度のコサインです。同じ方向を向いていれば1、直角なら0、正反対なら−1。長さの影響を消して「向き=意味の方向」だけを比べる物差しです。

FIG 22本のベクトルをドラッグして、角度が縮まると内積とコサイン類似度が大きくなることを確かめてください。埋め込み検索の「類似度」の正体はこれです

word2vecが有名になった逸話がベクトルの足し算引き算です。学習済みの空間では、kingman+woman\vec{king} - \vec{man} + \vec{woman} を計算して最近傍を探すと queen\vec{queen} が出てくる、という現象が原論文で報告されました。「性別」や「首都と国」のような意味の関係が、空間内の一定方向のずれとして学習されているためです。誰も「王の女性形は女王」と教えていないのに、共起の統計だけからこの構造が浮かび上がるのが埋め込みの面白さです。

コードで書く「意味検索」(numpy)

近傍検索の心臓部は数行で書けます。

import numpy as np

def nearest(query_vec, vectors, words, k=5):
    V = vectors / np.linalg.norm(vectors, axis=1, keepdims=True)
    q = query_vec / np.linalg.norm(query_vec)
    sims = V @ q                      # 全単語とのコサイン類似度を一括計算
    top = np.argsort(-sims)[:k]      # 類似度の高い順にk件
    return [(words[i], float(sims[i])) for i in top]

先にベクトルを長さ1に正規化してしまえば、コサイン類似度はただの内積=行列積1回で全件計算できます。ベクトルデータベースが内部でやっていることも、本質はこの行列積の高速化・省メモリ化です。

一語一ベクトルの限界と、文脈化埋め込み

word2vecには構造的な弱点があります。1つの単語に1本のベクトルしか割り当てないことです。「銀行の口座」の bank と「川の土手」の bank は同じベクトルになり、多義語の意味を文脈で使い分けられません。

これを破ったのが文脈化埋め込み(contextual embedding)です。2018年のELMoはRNN/LSTMベースの言語モデルで、同年のBERTはAttention機構を積んだTransformerで、文全体を読んでから各単語のベクトルをその場で計算する方式に切り替えました。同じ bank でも、周囲の単語次第で毎回違うベクトルが出力されます。word2vecが「紙の辞書」なら、文脈化埋め込みは「文脈を見て意味を選んでくれる翻訳者」です。

さらに現在の主流は、単語ではなく文や段落を丸ごと1本のベクトルにする文埋め込みです。BERT系モデルを「意味が近い文ペアは近いベクトルに」という目標で追加学習したもの(Sentence-BERTなど)が広く使われ、これがRAGの検索部分を支えています。質問文と文書チャンクを同じ空間に埋め込み、コサイン類似度で照合する——この記事で積み上げた道具立てそのものです。

現場ではこう使う

埋め込みを日常的に触るのは、RAG・セマンティック検索・レコメンドを作る機械学習/バックエンドエンジニアと、検索品質を評価するデータサイエンティストです。現場で実際に決めるのは次のあたりです。

面接で「コサイン類似度と内積の使い分けは?」と聞かれたら、「正規化済みなら両者は同じ。未正規化なら内積は長さの影響を受けるので、意味の近さを比べたい検索ではコサイン(または正規化+内積)を使う」と答えられれば筋が通っています。

まとめ

次は、この埋め込みを検索パイプラインに組み込むRAGの基礎へ進むと、今日の道具がそのまま実戦投入されるのが見えるはずです。

参考文献

  1. Efficient Estimation of Word Representations in Vector Space. arXiv:1301.3781論文ページ·PDF
  2. Distributed Representations of Words and Phrases and their Compositionality. arXiv:1310.4546論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

コメント

コメントにはログインが必要です