埋め込みベクトルとは?言葉を数値で表し、近さを比べる仕組み

30秒でわかる答え

埋め込みベクトルは、言葉などの特徴を数値の並びで表したものです。識別するための番号と違い、表現同士の近さを計算する手掛かりになります。近さはモデルと比べ方に依存し、内容の正しさまでは保証しません。

「電車で行く」と「列車に乗る」は、使っている文字が違っても、近い話をしています。文字の一致だけに頼らず、この関係を計算で扱うには、何を比べればよいのでしょうか。

埋め込みベクトルとは、特徴を数値の並びで表したもの

埋め込みベクトルは、言葉や画像などの特徴を、計算に使える数値の並びで表したものです。 英語ではembeddingと呼びます。たとえば文をベクトルに変換すると、別の文のベクトルとの近さを計算でき、関連する内容を探す手掛かりになります。

「ベクトル」と聞いて、数学の矢印を思い出した人もいるかもしれません。ここでは、まず順番の決まった数値の組として見てください。[1, 2]なら数が二つあるので2次元です。横に1、縦に2進んだ点として図にできます。

実際の埋め込みでは、もっと多くの数値を使います。一つの数値が必ず「乗り物らしさ」のような、人に分かる意味を担当するわけではありません。モデルがどんなデータで、何を目的に学んだかによって表現も変わります。

ただ数を付けるなら、通し番号でもよさそうです。ところが、番号だけでは扱いにくい関係があります。

トークンの番号と埋め込みベクトルは何が違う?

文章を処理するLLMでは、文字列をトークンという単位に分け、それぞれを語彙表のIDへ対応付けます。IDは「どのトークンか」を識別する番号です。番号が隣同士だから意味も近い、とは決まりません。

一般的なTransformerの入力では、そのIDに対応する埋め込みベクトルを表から取り出します。識別するための番号から、後の計算で組み合わせて使う表現へ進む段階です。文章の分け方やトークン数は、AIのトークンとはで扱います。

比べるもの主な役割
トークンID語彙表のどの項目かを識別する
埋め込みベクトル特徴を数値で表し、モデルの計算に使う

なお、単語やトークンの表現と、検索用に文全体をまとめた表現は同じものではありません。次の例は、文同士の比較を見える大きさにした模型です。

ユイ

同じ数でも、番号は名前の代わりで、ベクトルは比べたり計算したりするためのものなんですね

マコト

そう。番号の近いカードと、座標の近いカードを見比べてみよう

2次元の例で、番号の近さとベクトルの近さを比べる

ラボで三つの文をカードにしました。下の登録番号も座標も、違いを示すために手で決めた架空の値です。登録番号は文の管理用で、実在するトークンIDではありません。座標も、モデルが計算した埋め込みの実測値ではありません。

架空の座標で三つの文を比べるAは横1、縦2。Bは横2、縦2でAから距離1。Cは横5、縦5でAから距離5。軸は説明用で意味の尺度ではありません。0123456123456ABC距離1距離5
横と縦の単位をそろえた、説明用の2次元模型です。軸に「電車らしさ」などの意味を割り当てた図ではありません。
カードの文登録番号仮の座標
A 電車で行く100[1, 2]
B 列車に乗る900[2, 2]
C 雨が降る101[5, 5]

考えてみる:Aの登録番号だけを2000へ変えたら、AとBのベクトルの距離も変わるでしょうか。

答えを確かめる

変わりません。登録番号を変えても座標は同じなので、距離は1のままです。番号と、比べるための数値表現を分けて考えます。

登録番号だけを見ると、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

自分の言葉で説明してみよう

「識別番号と埋め込みを区別し、近さはモデルと比べ方に依存し真偽を保証しないと説明できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。