なぜLLMは、こんなに何でもできるのかで、「言葉は意味を表す座標に変換される」と一段落で流したところがあります。この記事は、そこだけを取り出して掘り下げたものです。
疑問は2つに分かれます。
- どうやって言葉を数字にするのか
- 「犬と猫は近い」という関連性を、どうやって学習するのか
順番に見ていきます。2つ目のほうが面白いので、先に予告しておくと——関連性は、誰も教えていません。 別のことをやろうとした結果、勝手に生まれます。
第1部:どうやって数字にするのか
なぜ、数字にしないといけないのか
大前提として、コンピュータは計算しかできません。「犬」という文字のままでは、足すことも、引くことも、似ているかどうかを測ることもできません。
だから最初にやることは決まっています。意味を、計算できる形に置き換える。 これが出発点です。
素朴なやり方と、その行き詰まり
まず思いつくのは、辞書の全単語に通し番号を振ることでしょう。「犬」は1234番、「猫」は5678番、というふうに。
これを数字の列で表すと、こうなります。語彙が10万語なら、長さ10万の列を用意して、1234番目だけを1、残りを全部0にする。
犬 → [0, 0, 0, ... , 1, ... , 0, 0, 0] ← 1234番目だけ1
猫 → [0, 0, 0, ... , 0, ... , 1, 0, 0] ← 5678番目だけ1
やり方としては成立しています。が、致命的な問題が2つあります。
- 無駄が大きい。 1語を表すのに10万個の数字を使い、そのうち99,999個が0
- 意味がまったく含まれていない。 これが本当の問題です。この表し方だと、「犬」と「猫」の距離も、「犬」と「行政手続き」の距離も、まったく同じになります。どの2語も等しく無関係、という世界です
私たちが欲しいのは逆です。犬と猫は近く、犬と行政手続きは遠い。 そういう数字の並びが要る。
埋め込み——短くて、意味の詰まったベクトル
そこで使うのが埋め込み(embedding)です。Anthropicの公式ドキュメントには、こう定義されています。
“Text embeddings are numerical representations of text that enable measuring semantic similarity.”
(テキスト埋め込みとは、意味的な近さを測ることを可能にする、テキストの数値表現である)
先ほどの10万個ではなく、数百から数千個の数字で1語を表します。しかも0だらけではなく、全部の数字が意味を担います。同ドキュメントに載っている実例では、1つの文章が1024個の小数の並びになっています。
[-0.013131560757756233, 0.019828535616397858, ... ] ← これで1つ分
この1024個の数字が、地図の緯度経度のように意味空間の中の位置を指しています。ただし2次元の地図ではなく、1024次元の空間です。想像はできませんが、「近い・遠い」を計算することはできます。 それで十分なのです。
「ベクトル」という言葉で、高校の数学で習った矢印を思い浮かべた方へ。 あれと同じものです。矢印を (x, y, z) と3つの数字で表したのがベクトルで、ここではその数字が1024個に増えただけです。矢印としては描けませんが、矢印でやっていた計算はそのまま使えます。 2本の矢印のなす角が小さいほど向きが近い——この「向きの近さ」が、そのまま「意味の近さ」にあたります。
ここで押さえておきたいのは、この数字は、設計者が決めたものではないということ。「犬の3番目の数字は0.7にしよう」と誰かが設計したわけではありません。学習の結果、勝手にそうなった値です。
だから、1つ1つの数字が何を意味しているのかは、基本的に誰にも分かりません。 分かるのは「近いか遠いか」だけ。ここが伝統的なデータベースとまったく違うところです。
第2部:関連性は、どうやって学習されるのか
さて、本題です。誰も設計していないのに、なぜ「犬」と「猫」が近い場所に落ち着くのでしょうか。
手がかりは「一緒に登場する言葉」
土台になっている考え方があります。分布仮説と呼ばれるもので、一言でいうとこうです。
言葉の意味は、その言葉が現れる文脈で決まる。
言語学者ジョン・R・ファースの「You shall know a word by the company it keeps(言葉は、それが連れている仲間によって知られる)」という一句がよく引かれます。1957年の言葉です。ただし正確を期すと、この考え方の中身を先に組み立てたのはゼリグ・ハリス(1954年)で、ファースのほうは覚えやすい標語のほうを残した、という関係にあります。
具体的に考えてみてください。
- 「____ が吠えた」
- 「____ に餌をやる」
- 「____ の散歩に行く」
ここに当てはまる言葉は、限られます。そして「犬」と「猫」は、当てはまる場所がかなり重なります。 一方「行政手続き」はまず当てはまりません。
つまり、意味を直接教わらなくても、「どんな文の、どんな位置に登場するか」を大量に観察すれば、意味の近さは推測できる。 これが出発点です。
学習の正体は「外した分だけ、つまみを回す」
では実際の学習はどう進むのか。驚くほど単純な繰り返しです。
- 文章の途中まで見せて、次に来る語を予測させる
- 正解と比べて、どれくらい外したかを測る
- 「どの数字を、どっちに、どれだけ動かせば、外し方が減るか」を計算する
- その方向に、ほんの少しだけ動かす
- 1〜4を、天文学的な回数くり返す
3番目が数学的にいちばん重要なところ(誤差逆伝播と呼ばれます)ですが、感覚としてはつまみの調整です。無数のつまみが付いた機械があって、音がずれるたびに全部のつまみを正解の方向へほんの少し回す。それを何十億回やる。
ただし、この比喩を持ちすぎないでください。 ここで「つまみ」と呼んでいるものの正体は、ファイルの中に並んだただの数字です。オーディオ機器のつまみと違って、回す人はおらず(計算が自動で動かします)、1つ1つに担当はありません(音量つまみのような役割は決まっておらず、1個だけ取り出しても何も意味しません)。動かし方の感じをつかむための言い方だと思ってください。
そして肝心なのは、言葉のベクトルも「回されるつまみ」の一つだということです。埋め込みは、モデルとは別に用意された固定の辞書ではありません。予測の訓練と一緒に、同時に育っていきます。
なぜ、似た言葉が近くに集まるのか
ここが核心です。理由は2つあります。
理由1:同じ向きの修正が、繰り返しかかるから。
「犬」が登場する文と「猫」が登場する文では、その後に続きやすい言葉が似ています。 すると、予測を外したときにかかる修正も似た向きになります。似た向きに何度も何度も押され続ければ、当然、近い場所に寄っていきます。
誰も「犬と猫は似ている」と教えていません。似た場所で使われる語には似た修正がかかる、というだけのことが、何十億回も積み重なった結果です。
理由2:そのほうが「得」だから。
「犬」と「猫」を近くに置いておくと、「動物は餌を食べる」という一つの規則で、両方をまとめて扱えます。 バラバラの場所に置くと、同じことを二度覚えないといけません。
モデルの容量には限りがあります。限られた容量で予測精度を上げようとすると、まとめられるものはまとめたほうが有利です。応用編で「圧縮は理解に似ている」と書いたのは、まさにこのことです。
関連性は、教えられたものではなく、予測をうまくやろうとした副産物として現れる。 ここがいちばん面白いところだと思います。
方向にも、意味が宿る
このやり方で学習させると、位置だけでなく「向き」にも意味が現れます。
有名なのがword2vec(Mikolovら、2013年)の例です。「王」のベクトルから「男」を引いて「女」を足すと、「女王」の近くに着く。同じように「東京」-「日本」+「フランス」が「パリ」の近くに来る。
これが意味するのは、「性別」や「首都であること」といった概念が、空間の中の特定の方向として表現されているということです。言葉の意味が足し引きできる量になっている——衝撃的な発想です。
ただし、ここは正直に但し書きを付けておきます。 この足し算は、宣伝されているほどきれいには成り立ちません。Fair is Better than Sensational(Nissimら、2019年)などの検証によると、この計算は「入力に使った語を答えの候補から除外する」という処理をして初めて成立することが多く、除外しないと「王」-「男」+「女」の答えはたいてい元の「王」に戻ってしまうといいます。
つまり、方向に意味が乗っているのは本当だが、教科書の例ほど鮮やかではない。 ベクトルの直感的な説明としては優秀ですが、きれいな数式が成り立っていると思い込まないほうがいい、というのが実際のところです。
第3部:現代版——文脈で姿を変えるベクトル
「はし」問題
ここまでの説明には、大きな穴があります。1つの語に1つのベクトルを割り当てる、という前提です。
日本語なら、すぐ問題が見えます。
- 川にはしが架かっている
- はしでご飯を食べる
- テーブルのはしに置く
橋・箸・端。同じ「はし」なのに、意味はまったく別です。固定のベクトルでは、この3つを区別できません。 英語の「bank」(銀行/土手)も同じ問題です。
初期の埋め込みは、実際にこの弱点を抱えていました。
Attentionが、これを解いた
解決したのが、応用編で紹介したTransformerとAttentionです。
今のLLMでは、ベクトルは固定ではありません。 文の中を通していく過程で、Attentionが「この語を理解するには、周りのどの語を見るべきか」を判断し、周囲の情報を混ぜ込んでいきます。
結果として、
- 「川にはしが架かっている」の「はし」は、「川」「架かる」の情報が混ざったベクトルになる
- 「はしでご飯を」の「はし」は、「ご飯」「食べる」の情報が混ざったベクトルになる
同じ文字なのに、違う座標に着く。 これが「文脈に応じたベクトル」で、辞書引き型の初期の埋め込みと、今のLLMの決定的な違いです。
そしてこれは、そのまま汎用性の話でもあります。文脈次第で表現が変わるということは、一つの語の意味を、状況ごとに使い分けられるということですから。
この「混ぜ込む」が具体的にどういう計算なのかは、AttentionとTransformer——LLMの中で実際に起きている計算にまとめました。点数の付け方に、この記事の「ベクトルの近さ」がそのまま使われています。
言語も、形式もまたいでいる
最後にもう一段。応用編でも触れた、AnthropicのMapping the Mind of a Large Language Modelによれば、モデル内部の概念に対応する特徴は多言語かつマルチモーダルで、ゴールデンゲートブリッジの特徴は英語での言及だけでなく、日本語や中国語での議論、さらには橋の画像にも反応したといいます。
これを第2部の理屈で読み直すと、腑に落ちます。「日本語のはし」と「英語のbridge」は、似た文脈で使われる。 似た文脈で使われるものは、似た場所に集まる。だから、言語をまたいでも同じ座標に落ち着く。
言葉のベクトルというより、概念のベクトルになっている。 汎用性の、いちばん深い根はここにあります。
まとめ
- 「犬」のままでは計算できないので、数百〜数千個の数字の並び(ベクトル)に置き換える。これが埋め込み
- 通し番号方式(0だらけの長い列)では、どの語も等しく無関係になってしまう。だから密なベクトルが要る
- 数字の中身は人が設計したものではない。だから1つ1つの意味は分からない。分かるのは近いか遠いかだけ
- 関連性の学習は「次の語を当てて、外した分だけ数字を動かす」の繰り返し
- 似た文脈に登場する語には似た修正が繰り返しかかるので、近くに寄っていく。さらにまとめたほうが容量的に得でもある
- 誰も「犬と猫は似ている」とは教えていない。 予測をうまくやろうとした副産物
- 方向にも意味が乗る(王-男+女≒女王)。ただし宣伝ほどきれいには成り立たない
- 今のLLMのベクトルは固定ではなく、Attentionによって文脈ごとに変わる。だから「はし」を橋と箸に区別できる
このベクトルは、モデルの中だけの話ではありません。取り出して、自分の資料を検索するのに使えます。 そこから「自分の分野に特化したエージェント」を作る話に繋がります——自分の資料で、専門特化のエージェントを作るへどうぞ。