第3章: 文脈で意味が変わる — 静的から動的へ
英語の bank という単語を眺める。
① I deposited money at the bank.(銀行に預けた) ② We had lunch on the bank of the river.(川の土手で昼食をとった)
人間にとっては、瞬時に区別がつく。前者は銀行、後者は土手だ。
ところが前章の Word2Vec は、bank というトークンに 唯一のベクトル を割り振っていた。
だから両者を 同じ点 として扱うしかなかった。
これは明らかに、言葉の現実と合っていない。 意味は、文脈の中で動く生き物 だ。
本章は、その「動く意味」を機械にどう扱わせるか ── 静的な埋め込みから動的な埋め込みへの転換の話だ。 ここを乗り越えると、その先に Transformer が待っている。
3.1 同じ単語でも、文脈で別物になる
「言葉の意味が文脈で動く」という現象は、英語でも日本語でも至るところに転がっている。 代表例をいくつか並べてみる。
英語:同じ綴り、別の意味
| 単語 | 文脈① | 文脈② |
|---|---|---|
| bank | 銀行に預けた | 川の土手で休んだ |
| bat | バットでボールを打つ | 洞窟のコウモリ |
| light | 部屋の明かり | 軽い荷物 |
| bass | ベース(低音楽器) | スズキ(魚) |
英語ではこの現象を 多義語 (polysemy)、または別語源だが綴りが同じものを 同形異義語 (homonym) という。
日本語:もっと厄介
日本語は表記と意味の対応がさらに緩い。
| 表記 | 文脈① | 文脈② |
|---|---|---|
| はし | 橋を渡る | 箸で食べる |
| かける | 走りかける | お湯をかける |
| あつい | 暑い夏 | 厚い本 |
| Apple | 新型 iPhone を発売した Apple | リンゴ(果物) |
文脈次第で、ベクトルは違う場所にあってほしい
前章で「埋め込み空間内で、意味の近いトークンは近くに住む」と書いた。
ところが、bank を 1 つのベクトルに固定すると、「銀行」の意味と「土手」の意味の両方の中間 という、どっちつかずの位置に居座ってしまう。
理想は、こうだ:
- 「I deposited money at the bank」の
bank→ 「銀行」近辺のベクトル - 「We had lunch on the bank of the river」の
bank→ 「土手」近辺のベクトル
同じ単語でも、文脈次第でベクトルが動く。 これが本章のテーマ ── 文脈埋め込み (contextual embedding) だ。
静的埋め込み(前章): 1 トークン = 1 ベクトル。文脈に関係なく不変。 文脈埋め込み(本章): 同じトークンでも、周囲の単語次第で別のベクトル を返す。
「意味は文脈で動く」という言語の本質を、ベクトル表現側で初めて受け止めた発想だ。
3.2 「文脈で動く」を、機械が実現するには
「ベクトルが文脈次第で変わる」と言うのは簡単だが、機械はどうやってそれを計算するのか。
カギは、「単語単独」ではなく「単語 + 周囲の単語列」を見て、その場でベクトルを作る という発想だ。
従来: bank → vec(bank) (いつも同じ)
新方式: I deposited money at the bank → vec(bank | 文脈①)
lunch on the bank of the river → vec(bank | 文脈②)
つまり、ベクトルは 「単語 × 文脈」 の関数として計算される。
同じ単語 bank でも、周りの語並び(context)が変われば、出てくるベクトルも変わる。
このアイデアを実現するには、機械が 文を頭から順に読み、各位置で「ここでのこの単語は、何という意味か」を計算する 仕組みが要る。
そのための仕組みが ── まさに本書の主舞台、ニューラルな系列モデル だ。
3.3 文脈埋め込みの夜明け ── ELMo
文脈埋め込みを実用レベルで初めて示したのは、2018 年の ELMo(Embeddings from Language Models) という手法だった。
ELMo の発想を、本書なりに乱暴に要約するとこうなる:
ELMo のレシピ(雰囲気だけ)
- 「次の単語を当てる」という単純な予測タスクを設定する
- 機械(ニューラルネット)に、大量のテキストでこのタスクを延々と練習させる
- 練習を通じて、機械の内部は「文を読みながら各位置で生まれる中間状態」を持つようになる
- その中間状態を その単語の文脈埋め込み として取り出す
つまり、機械が「次の単語を当てるために頭の中で組み立てた表現」を、副産物として埋め込みとして使う。
ELMo の重要なポイント:
- 同じ
bankでも、直前までの単語列が違えば、ベクトルも違う ものが出てくる - 多義語や同形異義語が、ようやく正面から扱えるようになった
- 各種 NLP タスク(質問応答、感情分析、固有表現抽出)の精度が一気に底上げされた
ELMo は文脈埋め込みという発想を 「論文の夢」から「実用ツール」に変えた 記念碑的存在だ。
補足ELMo は LSTM というニューラルネット構造(第5章で扱う)を使っている。本書では深入りしないが、「前から読み進めながら、各位置で中間状態を保つ」という性質が文脈埋め込みの核になっている、という点だけ押さえておきたい。
3.4 文脈埋め込みが扱える、もう一段深い現象
文脈埋め込みは、多義語の区別だけでなく、もっと繊細な現象も扱えるようになる。
例①: 代名詞の解決
「犬 が 猫 を追いかけた。それ はとても速かった。」
それ は犬か猫か。
人間は文脈から犬と判定する。文脈埋め込みは、同じ それ でも、前文の構成次第で 犬寄りのベクトル にも 猫寄りのベクトル にもなれる。
例②: 言外の感情・極性
「映画は 良かった ね(皮肉)」
「映画は 良かった ね(素直な称賛)」
同じ 良かった というトークンでも、文脈や前後文によって、皮肉のニュアンスを帯びるか純粋な肯定かが変わる。
文脈埋め込みはこの差を、ベクトルの位置のわずかなずれとして表現できる。
例③: 専門用語の文脈依存
「Python で書いたスクリプト」(プログラミング言語)
「Python はジャングルに住む」(ニシキヘビ)
同じ Python というトークンでも、スクリプト 関数 import の隣にいるときと、ジャングル 蛇 の隣にいるときで、まったく別の領域にベクトルが置かれる。
こうした例は、人間にとっては「言われてみればそうだね」程度の自明さだ。
だが機械にとって、「同じ文字列だが、別の意味で扱う」 ことは、文脈埋め込みの登場まで途方もなく難しい問題だった。
3.5 でも、ELMo にもまだ限界があった
ELMo は革命的だったが、まだ 2 つの大きな制約があった。
制約①: 「前から順に」しか読めない
ELMo は文を 左から右に(と右から左に)読みながら埋め込みを作る。 これは人間の読み方に近いが、機械的には不便な制約になる。
たとえば「それ はとても速かった。犬 が 猫 を追いかけた」(順序を入れ替えた文)のように、後ろの情報 が前の単語の意味を確定する場合、左→右の処理だけでは扱いにくい。 「全文を一度に眺めて、どこと どこを関連付けるか自由に決める」ような仕組みがあれば、もっと柔軟になる。
制約②: 長距離の関係が苦手
「作家ヘミングウェイ は若い頃にパリで多くの作品を書き、その後アメリカへ戻り、晩年はキューバの海辺で釣りを楽しんだ。彼の文章 は今も世界中で読まれている。」
彼の文章 は冒頭の 作家ヘミングウェイ を指す。
こうした 長距離の依存関係 を捉えるのは、ELMo(および後章で出る RNN/LSTM)が苦手としていた領域だ。
この 2 つの制約を、ガツンと一気に解いた のが、第6〜7章で登場する Attention と Transformer だ。 そして Transformer ベースの文脈埋め込みを、超大規模に学習したものが、第8章の BERT であり、第9章の GPT だ。
つまり、ここまでの本書の物語は、こう繋がっている:
トークン化(第1章)
↓
静的埋め込み(第2章)── 単語に固定ベクトル
↓
文脈埋め込み(第3章)── 文脈で動くベクトル ← イマココ
↓
系列モデル(第4-5章)── 文を順に読む
↓
Attention と Transformer(第6-7章)── 並列に全文を見る
↓
BERT / GPT(第8-9章)── 大規模文脈埋め込みの完成形
現代の LLM は、巨大な「文脈埋め込み機械」だと言っていい。
ChatGPT が単語の意味を文脈に応じて正確に解釈できるのは、本章で扱った「文脈埋め込み」の発想を、超大規模に拡張した結果に過ぎない。
逆に言えば、文脈埋め込みの動機と限界を理解した時点で、現代 LLM の半分を理解したことになる。
3.6 「言葉を数にする」編、ここまでの整理
第1〜3章で、本書の最初のグループ「言葉を数にする」を走り切った。 この 3 章でやったことを、もう一度地図にしておく。
| 章 | 解いた問題 | 残った課題 |
|---|---|---|
| 第1章 トークン化 | 文字列を機械が扱える単位に切る | (次の表現方法が必要) |
| 第2章 埋め込み | トークンを意味のある空間に置く | 文脈で動かない |
| 第3章 文脈埋め込み | 文脈次第でベクトルを動かす | どうやって計算するか |
最後の「どうやって文脈に応じてベクトルを計算するか」が、次のグループ「系列を扱う」(第4〜5章)と「注意機構と Transformer」(第6〜7章)の主題になる。
3.7 この章の振り返り
- 同じ単語でも、文脈で意味は動く(
bank= 銀行 or 土手、Apple= 会社 or 果物) - 静的埋め込み(Word2Vec)は 1 トークン 1 ベクトルしか持てず、この現象を扱えなかった
- 文脈埋め込み (contextual embedding) ── 同じトークンでも周囲の単語列次第で別のベクトルを返す
- 2018 年の ELMo が文脈埋め込みを実用化、各種 NLP タスクの精度を一気に底上げした
- ただし ELMo にも「左→右の読み順」「長距離依存の弱さ」という制約があった
- 現代の LLM は、本質的にすべて 超大規模な文脈埋め込み機械 と言える
次章からは、文脈を扱う 系列モデル の世界に入る。 まずは第4章で、もっとも素朴な「頻度から考える」言語モデル ── n-gram の発想を見にいく。 これが現代 LLM のもっとも遠い祖先だ。