「電車で行く」と「列車に乗る」は、使っている文字が違っても、近い話をしています。文字の一致だけに頼らず、この関係を計算で扱うには、何を比べればよいのでしょうか。
埋め込みベクトルとは、特徴を数値の並びで表したもの
埋め込みベクトルは、言葉や画像などの特徴を、計算に使える数値の並びで表したものです。 英語ではembeddingと呼びます。たとえば文をベクトルに変換すると、別の文のベクトルとの近さを計算でき、関連する内容を探す手掛かりになります。
「ベクトル」と聞いて、数学の矢印を思い出した人もいるかもしれません。ここでは、まず順番の決まった数値の組として見てください。[1, 2]なら数が二つあるので2次元です。横に1、縦に2進んだ点として図にできます。
実際の埋め込みでは、もっと多くの数値を使います。一つの数値が必ず「乗り物らしさ」のような、人に分かる意味を担当するわけではありません。モデルがどんなデータで、何を目的に学んだかによって表現も変わります。
ただ数を付けるなら、通し番号でもよさそうです。ところが、番号だけでは扱いにくい関係があります。
トークンの番号と埋め込みベクトルは何が違う?
文章を処理するLLMでは、文字列をトークンという単位に分け、それぞれを語彙表のIDへ対応付けます。IDは「どのトークンか」を識別する番号です。番号が隣同士だから意味も近い、とは決まりません。
一般的なTransformerの入力では、そのIDに対応する埋め込みベクトルを表から取り出します。識別するための番号から、後の計算で組み合わせて使う表現へ進む段階です。文章の分け方やトークン数は、AIのトークンとはで扱います。
| 比べるもの | 主な役割 |
|---|---|
| トークンID | 語彙表のどの項目かを識別する |
| 埋め込みベクトル | 特徴を数値で表し、モデルの計算に使う |
なお、単語やトークンの表現と、検索用に文全体をまとめた表現は同じものではありません。次の例は、文同士の比較を見える大きさにした模型です。
ユイ
同じ数でも、番号は名前の代わりで、ベクトルは比べたり計算したりするためのものなんですね
マコト
そう。番号の近いカードと、座標の近いカードを見比べてみよう
2次元の例で、番号の近さとベクトルの近さを比べる
ラボで三つの文をカードにしました。下の登録番号も座標も、違いを示すために手で決めた架空の値です。登録番号は文の管理用で、実在するトークンIDではありません。座標も、モデルが計算した埋め込みの実測値ではありません。
登録番号だけを見ると、Aの100には、Bの900よりCの101が近くなります。でも、電車で行く話に近いのは、雨の話より列車に乗る話でしょう。
この模型では、その関係が座標に表れるようAを[1, 2]、Bを[2, 2]、Cを[5, 5]に置きました。AからBは横に1だけ離れています。AからCは横に4、縦に3離れ、直線距離は5です。何番かを比べることと、特徴の表現を比べることでは、近い相手が変わります。
ここで使った直線距離を、ユークリッド距離と呼びます。実際の文の比較では、ベクトルの向きの近さを見るコサイン類似度なども使われます。どの尺度を使うかはモデルや用途に合わせます。「近い」という言葉だけで、いつも同じ計算を指していると思わないでください。
では、この模型で人が置いた座標を、実際にはどうやって作るのでしょうか。
埋め込みの数値は、学習でどう決まる?
言葉の埋め込みを得る方法の一つは、ニューラルネットワークを使った学習です。与えられた課題の結果がよくなるように、表現を作るための数値を調整します。
たとえば、周囲にどんな言葉が現れるかを予測する課題や、関連する文の組を近づける課題があります。前の模型のように、人が一文ずつ場所を指定して回るわけではありません。学ぶ課題やデータが違えば、できあがる関係も変わります。
すでに学習したモデルへ新しい文を渡し、ベクトルを得ることもできます。この利用時の計算と、モデル自体を調整する学習は別の工程です。
比較するときは、同じ空間で比べられる表現を使う必要があります。数値の個数が同じでも、別々に学習したモデルの出力をそのまま混ぜれば、有用な近さになるとは限りません。
まだ一つ気になる点が残ります。同じ言葉が別の意味で使われたときも、同じ場所のままなのでしょうか。
同じ言葉でも、文脈によって表現は変わる?
「夜空の星を観察する」と「評価に星を付ける」では、同じ「星」でも指しているものが違います。周囲の言葉が、どちらの話かを考える手掛かりになります。
単語ごとに一つの固定ベクトルを持つ方式もあります。一方、Transformerでは、入力のトークン表現に周囲の情報を取り込み、層を通して更新していきます。同じトークンから始まっても、文脈を反映した表現は変わり得ます。
この更新に関わる仕組みの一つがAttentionです。ここで区別したいのは、入口で取り出した埋め込みと、文脈を取り込んだ後の内部表現です。「単語一つに、人間と同じ意味が丸ごと保存されている」と考えると、この変化を見落としてしまいます。処理全体の流れはTransformerの仕組みへつながります。
周囲の情報を取り込む一回の計算は、AttentionのQ・K・Vと重み付き和で追えます。三つの数値カードを使い、配分が変わると受け取る表現も変わる様子を確かめられます。
また、検索では文や段落全体を比較するためのモデルや処理を使います。LLM内部の好きな位置のベクトルを取り出せば、そのまま優れた検索になるという意味ではありません。
文脈に応じた近さまで扱えれば、正しい資料も選べそうに見えます。けれど、話題が近いことだけでは決まらないものがあります。
似ている資料が、正しい答えとは限らない
「見学会は予約が必要」と「見学会は予約不要」は、同じ見学会と予約の話です。表現の仕方によっては近くなる可能性がありますが、答えは反対です。昨年の案内と今年の案内も、似た言葉を使っていて内容が違うことがあります。
埋め込みの近さは、関係しそうな候補を探す手掛かりです。正しさ、更新時期、どの条件に当てはまるかまで、一つの類似度で保証するものではありません。検索で集めた後に、資料の日付や本文、例外を確かめる仕事が残ります。
図のAとBが近いと分かっても、それだけで「明日は電車が動く」とは答えられません。数値の関係から分かることと、実際の状況を知るために必要な情報を分けて考えましょう。
見つけた資料を、AIはどう回答に使う?
言葉を数値で表すと、文字が同じかどうかに加えて、関連する内容を探す手掛かりが得られます。登録番号と違う役割があるのは、そのためです。
次は、見つけた資料から回答を作る工程です。通常の案内に「14時開始」、祝日の変更案内に「13時開始」とあったら、AIには何を渡せばよいのでしょうか。RAGの記事では、検索した資料をLLMに渡し、回答の根拠を対応させる流れを、見学会の案内で追えます。
この記事について
LAB WHITEBOARD
自分の言葉で説明してみよう
「識別番号と埋め込みを区別し、近さはモデルと比べ方に依存し真偽を保証しないと説明できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。




