第2章: 単語に座標を与える — 埋め込み
前章で文字列をトークンに切れた。
たとえば [東京, タワー, は, 高い] のように。
ところがこの状態の機械は、まだ「東京」と「大阪」が 似ている都市の名前 だということを何も知らない。 彼にとって「東京」はトークン番号 4218、「大阪」はトークン番号 9802、ただの整数だ。 「東京 = 4218」と「東京 = 9802」を入れ替えても、何の違いもない。
ここから先で機械が 意味を扱えるように なるには、各トークンを ただの番号ではなく、もっと豊かな表現 に変える必要がある。 その答えが、本章のテーマ ── 埋め込み (embedding) だ。
2.1 トークン番号だけでは何も分からない
前章でトークン化を済ませると、文は 整数の並び になる。
[東京, タワー, は, 高い] → [4218, 1903, 7, 5567]
しかしこの整数は、ただの背番号 だ。 番号 4218 と 9802 のあいだに「意味的に近い/遠い」という関係は何もない。 番号同士を足したり比べたりしても、言葉の意味についての情報は何も出てこない。
これではまずい。 機械に翻訳・要約・対話をさせたいのに、入力が「ただの背番号」なら、機械が言葉の 意味の構造 を学ぶ足場がない。
背番号は 「区別はできるが、関係を表せない」 表現だ。 言葉の意味を扱うには、トークン同士の 類似性・対比・関係 が反映できる表現が要る。 それを与えるのが「埋め込み」だ。
2.2 ベクトルを与えるという発想
そこで採用するのが、各トークンに「数の並び(ベクトル)」を割り当てる という方針だ。 たとえば、各トークンに 300 個の数の並びを与える。
| トークン | 与えるベクトル(300次元の数値) |
|---|---|
| 東京 | [0.21, -0.83, 0.15, …, 0.04] |
| 大阪 | [0.19, -0.79, 0.18, …, 0.02] |
| 猫 | [-0.55, 0.30, -0.41, …, 0.81] |
| 犬 | [-0.51, 0.28, -0.39, …, 0.78] |
| バナナ | [0.62, 0.91, -0.10, …, -0.33] |
このベクトルが 300 次元空間の「座標」 だと思えばいい。 すると、各トークンは 空間内の点 として暮らすことになる。
この「トークン → ベクトル」の変換、つまり トークンを高次元空間に住まわせる操作 を、埋め込み (embedding) と呼ぶ。 住まわせた先のベクトルそのものを、埋め込みベクトル ともいう。
最初に聞くと「なぜ突然 300 次元の話?」と戸惑うが、ここはぐっと飲み込んでほしい。 実は、この「意味を空間の座標に置く」という素朴な発想が、近代 NLP の魔法の入口だった。
2.3 似た意味のトークンは、近い場所に住む
ここまでは「ベクトルを割り当てる」だけの話だった。 肝心なのは、そのベクトルを「意味的に良い感じ」に決められるか だ。
良い埋め込みとは何か。一言で言うとこうだ:
意味が似ているトークンは、空間内で近くに置かれる。
「東京」と「大阪」は近く。 「猫」と「犬」も近く。 「東京」と「バナナ」は遠い場所に。
これさえ実現できれば、機械にとって 「東京 と 大阪 は似ている」 という事実が、ベクトル間の距離 として自動的に表現される。 言語学者がルールで教えなくても、空間の幾何学が意味を背負ってくれる。
実際の埋め込み空間は 300〜数千次元あるので、人間が直接眺めることはできない。 だが「意味の近いものは近く、遠いものは遠く という配置になっている」という性質さえ守られていれば、機械は十分にその構造を活用できる。
2.4 ベクトルをどうやって決めるか ── Word2Vec の発想
「意味的に良い埋め込み」を、人間が手で決めるのは無理だ。語彙が数万〜数十万あれば、ひとつずつ「東京は [0.21, -0.83, …]」なんて書いていられない。
そこで、大量のテキストからベクトルを自動学習 する手法が 2013 年に登場した。 代表選手が Word2Vec(Google の Tomas Mikolov らによる)だ。
Word2Vec の発想は、言語学の古いスローガンに根拠を置く:
「単語の意味は、その周りに現れる単語によって決まる」(J.R. Firth, 1957)
たとえば「猫」という単語の周りには、「鳴く」「ふわふわ」「飼う」「ペット」がよく現れる。 「犬」の周りにも、ほぼ同じ単語が現れる。
ということは、周辺に現れる単語の傾向が似ているトークン同士は、意味が近い はずだ。 だから「周辺単語をうまく予測できるベクトル」を学習すれば、自然と意味が空間に埋め込まれる。
Word2Vec はこの直観を、「ある単語が与えられたとき、その周辺に出る単語を予測する」 という機械学習タスクに落とし込んだ。 予測がうまくいくようにベクトルを調整していくと、副産物として「意味的に良い空間」が手に入る。
ニューラルネットワーク本書ではここから先、頻繁に ニューラルネットワーク(神経網) という言葉が出てくる。文系読者には未知の道具なので、ここで最低限の定義を置く。
大量の数値(パラメータと呼ぶ)を内部に抱えた計算装置で、入力 → 出力の変換規則を、データから自動で身につける仕組み。
「学習」とは、データを見ながら 内部の数値(パラメータ)を少しずつ動かす 作業のことを指す。予測が外れたら、外れにくくなる方向にパラメータを動かす ── これを延々と繰り返す。本書では数式の中身に深入りしないが、「学習 = パラメータを少しずつ調整する作業」とだけ覚えておけば、以降の章はすべて読める。
補足Word2Vec の内部もニューラルネットワークが使われている。「穴埋めや次単語予測のような小さなタスクで予測誤差を計算し、その誤差を埋め込みベクトル(パラメータの一部)に反映させていく」── これが具体的な学習の流れだ。
同じ発想が、第8〜9章で出てくる BERT や GPT の事前学習の根本にもなっている。「予測タスクで副産物として表現を学ぶ」── これが現代 NLP の通奏低音だ。
2.5 「王 − 男 + 女 ≈ 女王」の魔法
Word2Vec で学習した埋め込みを眺めると、人々を驚かせた現象が起きていた。
ベクトル演算
vec(王) − vec(男) + vec(女) ≈ vec(女王)
つまり「王 から 男らしさ の方向を引き、女らしさ の方向を足すと、女王 にたどり着く」。 言葉の意味の引き算と足し算が、ベクトルの足し引きで模擬できてしまった。
同様に:
| 演算 | 結果 |
|---|---|
| vec(パリ) − vec(フランス) + vec(日本) | ≈ vec(東京) |
| vec(歩く) − vec(現在) + vec(過去) | ≈ vec(歩いた) |
| vec(Microsoft) − vec(Windows) + vec(iOS) | ≈ vec(Apple) |
これが意味するのは:
埋め込み空間には、意味の「方向」が刻まれている。
「男性 → 女性」「首都 → 国」「現在形 → 過去形」のような 意味的な軸 が、空間内のある方向ベクトルとして実在する。 だから、ベクトルを足し引きするだけで、意味の関係を辿れる。
意味は、距離だけでなく 方向 にも宿っているのだ。
これが、本書冒頭で予告した「意味が幾何学になる」瞬間だ。 言語学者でなく機械が、テキストの大量読み込みだけで、こうした構造を勝手に取り出してくる。
2.6 埋め込みは「意味の地図」── でも欠点もある
ここまでで、トークンが空間の点になり、意味的に似たもの同士が近く、意味の関係が方向として刻まれていることを見た。
しかし、Word2Vec 系の埋め込みには 致命的な欠点 がある。それは:
欠点①: 1 トークン = 1 ベクトル (静的)
Word2Vec は「東京タワー」というトークンに、ただ 1 つの固定ベクトル を割り当てる。 たとえば次の 2 文:
- 「bank に預金した」(銀行)
- 「川の bank で休む」(土手)
英単語 bank には少なくとも 2 つの意味がある。
ところが Word2Vec の vec(bank) は 唯一のベクトル。両者の意味を区別できない。
これを 「静的埋め込み (static embedding)」 という。
欠点②: 文脈で意味が動かない
人間は文脈で意味を切り替える。「Apple の新製品」と「Apple とオレンジ」では、Apple が別物だ。
Word2Vec はそれをやれない。文の中で Apple がどんな顔をしているかに関わらず、いつも同じベクトル を返す。
これが Word2Vec の限界だった。 意味は文脈で動く生き物なのに、座標は固定 ── どうしても不器用だ。
2.7 「文脈で動く埋め込み」への扉
この欠点を埋めるために、次に登場するのが 文脈埋め込み (contextual embedding) という発想だ。
トークンに与えるベクトルを、その都度の文脈に応じて動的に計算する。
bank というトークンが「預金した」の隣にあるときと「川の」の隣にあるときで、別のベクトルを返す。
これにより、機械が初めて「文脈で意味が変わる」現象を正面から扱えるようになる。
この文脈埋め込みを実現する道具立てが、後の章で出てくる RNN、Transformer、BERT といったモデルだ。 次章では、文脈埋め込みの考え方そのものを、もう一段深く見ていく。
ここで一度、立ち止まって俯瞰しておこう。 本書の階段は「トークンに切る → ベクトルを与える → 文脈で動かす」の 3 段で構成されている。 ちょうど真ん中の踊り場まで来た。
2.8 この章の振り返り
- トークン番号だけでは、意味の関係を表せない
- 各トークンに ベクトル(高次元の座標) を割り当てる工程が 埋め込み (embedding)
- 良い埋め込みでは、意味の近いトークンが空間内で近くに集まる
- Word2Vec (2013年)は、周辺単語予測の副産物としてベクトルを自動学習する手法
- 埋め込み空間には 意味の方向 が刻まれ、「王 − 男 + 女 ≈ 女王」のような演算が成立する
- ただし Word2Vec は 静的埋め込み — 1 トークン 1 ベクトル、文脈で動かないという致命的欠点があった
- 次章では、文脈で意味が動く 文脈埋め込み へ進む
次章のテーマは、「bank が銀行か土手か、機械はどう区別するのか」。 意味が文脈で動き出す瞬間の話だ。