単語埋め込み 入門

ニューラルネットは数値しか食べない、しかしテキストは記号。この溝を埋めるまで、 分野は何年もかかった。短い 4 トピックでその物語をたどる:one-hot エンコーディング、最初に思いつくがスケールしない方法;単語埋め込み(word embeddings)(Word2Vec、GloVe)、現代の NLP システムすべてを可能にした「密ベクトル」のアイデア;誰もがこのアイデアに恋した 有名な直感 —— king − man + woman ≈ queen;そして静的埋め込みの限界 —— 1 単語 1 ベクトル、文脈に依存しない —— これこそ次の primer(Transformer)が 解こうとする問題そのもの。

01

One-Hot 符号化

最も自明な第一案 —— そして今や誰も使わない。

ニューラルネットは数値しか食べない。テキストは記号。それを最も安価に橋渡しするのがone-hot 符号化:語彙サイズ V を選び、各単語を その単語のインデックスに 1 だけ立つ長さ V のベクトルで表す。 Bag-of-words と TF-IDF(テキスト primer §1、§2)はそれらの集計に過ぎない。

小さな語彙 —— ["the", "cat", "sat", "on", "mat"] —— の符号化はこう:

the  =  [1, 0, 0, 0, 0]
cat  =  [0, 1, 0, 0, 0]
sat  =  [0, 0, 1, 0, 0]
on   =  [0, 0, 0, 1, 0]
mat  =  [0, 0, 0, 0, 1]
one-hot 符号化 —— 5 単語の語彙語彙thecatsatonmat5 単語の語彙:the、cat、sat、on、mat。各 → 長さ 5 のベクトル。
1 / 3
各単語は 1 を 1 つだけ持つ疎ベクトル。メモリの大半が無駄になり、異なる 2 単語は数学的にどれも同じくらい別物。

何が悪いのか? 重大度順に 3 つ:

  • 疎で巨大。GPT-4 級の語彙はおよそ 100,000 トークン。 各単語は 100,000 次元のベクトルで非零要素は 1 つだけ。ほぼ全ビットが 無駄な記憶領域。フレームワークは疎表現を持つが、結局のところ埋め込み層はV × d_embed の巨大なテーブル;one-hot を掛けるのは行のルックアップに 過ぎず、現代のコードでは one-hot ベクトルを実際に作ることはない。だが概念上、 各トークンはこれだ。
  • 類似構造がない。異なる 2 つの one-hot ベクトルのコサイン類似度は 常に正確に 0。\"cat\" と \"kitten\" の数学的距離は、\"cat\" と \"calculator\" の 距離と同じ。両単語を似た文脈で何度も見るまで、モデルは関連性を知る術がない。
  • 汎化しない。\"dog\" を含む 100 万文と \"puppy\" を含む 0 文で 訓練すると、モデルは \"dog\" のすべてを知り、\"puppy\" のことは何も知らない —— 意味がほぼ同じでも。各単語をゼロから学習する必要がある。

Bag-of-words と TF-IDF はこの 3 問題を継承し、さらに語順を完全に失う(テキスト primer §2) という問題を加える。分野を一気に開いた修正は「one-hot をよりよく集計する」ことではなく —— one-hot 自体を小さな密ベクトルに置き換えること。それが §2。

Transformer では:トークンが Transformer に入って最初にすることは、 埋め込みテーブル —— (vocab_size, d_model) 行列で、各行が(学習済みの、 密な)埋め込み —— の参照。「one-hot ベクトル × 埋め込み行列」は数学的には今も真だが、 実装はその行を取り出すだけ。いずれにせよ:one-hot は薄いインデックス層に格下げされ、 モデルの残りに流れるのは次節の密ベクトルだ。

02

単語埋め込み —— Word2Vec と GloVe

学習された密ベクトル、似た単語が近くに置かれる。

各単語が大きな疎 one-hot ではなく、小さな密ベクトル —— 例えば 300 次元の 実数 —— だったらどうか? それらが「単語が現実のテキストでどう出るか」から 学習され、似た単語が似た位置に来るとしたら? それが単語埋め込み(word embedding)のアイデアであり、転換点だった。

Word2Vec(Mikolov et al.、2013)が世間に広めたレシピ。小さなニューラル ネットに、中心語から文脈を予測させる(skip-gram)、または文脈から中心語を 予測させる(CBOW)。隠れ層は d_embed 次元。訓練後に予測ヘッドは 捨て、残った隠れ層の重みが embedding —— 語彙の各単語に 1 ベクトル。

Skip-gram、位置 t の単語について:
  input  =  embedding[w_t]
  窓内の各文脈位置 w_{t±j} について:
      w_t を条件とした w_{t±j} の対数確率を予測

隠れ層は共有。予測信号が「似た文脈で現れる単語」を
似た埋め込みに押し寄せる。

GloVe(Pennington et al.、2014)は別ルートで同じゴールへ:大域的な 単語-単語共起行列を低ランク分解し、それを近似する低次元ベクトルを得る。数学は違うが 実用上は似た embedding。

どちらも、よく John Firth に帰せられる言語学的事実を活用する:「単語の素性は、それが連れ歩く者によって知れ。」似た文脈で現れる単語は似た意味を持つ傾向があり、損失関数が一方から他方を予測することを 報酬とするなら、得られるベクトルはその類似性を自然に捉える。

Word2Vec / GloVe —— 学習埋め込みの 2D 投影未訓練 —— 散らばりcatdogkittenkingqueenprincerunwalkjump訓練前。各埋め込みはランダム —— "cat" と "kitten" は離れる。
1 / 3
小さなネットに文脈語を予測させると、副産物として:意味的に近い単語がベクトル空間で近くに置かれる。

単語埋め込みを約 5 年間の既定表現にした性質:

  • 密。典型サイズ:100 〜 300 次元。各成分は意味を持ち非零。 100,000 次元の one-hot と比べ、メモリは何桁も少ない。
  • 似た単語 → 似たベクトル。cosine(v(\"cat\"), v(\"kitten\"))は大きく、cosine(v(\"cat\"), v(\"calculator\")) は小さい。\"cat\" を 見た下流分類器は \"kitten\" について何かを無料で学ぶ。
  • 汎化。\"the cat sat\" で訓練したモデルが、訓練中に \"kitten\" を 見たことがなくても \"the kitten sat\" をそれなりに扱える —— kitten のベクトルが cat の隣にいるからだ。
  • 転移可能。巨大なテキスト(Wikipedia、Web)で 1 度 embedding を訓練し、 ダウンロードしてタスクに差し込む。NLP における最初期の事前学習成果物の 1 つで、 現代の「事前訓練 → ファインチューニング」ワークフローの哲学的祖先だ。

実用上知っておくべきこと:Word2Vec / GloVe の embedding は訓練データのバイアスをそのまま符号化する —— 職業のジェンダー連想、人種ステレオタイプなど —— 訓練コーパス自体にそれらがあるからだ。2010 年代初頭の NLP 文献にはデバイアス技法の論文が 多数ある。文脈的埋め込みになっても問題は消えず、むしろより繊細になった。

Transformer では:現代 Transformer 冒頭の (vocab_size, d_model)埋め込みテーブルは、機能的には学習済みの Word2Vec 風のもの —— ただし別の前処理として ではなく、モデルの他部分と共に言語モデリング損失で同時訓練される。このテーブルから取り出した ベクトルがアテンションの入力。Word2Vec のアイデアは生きており、変わったのは訓練レシピだけ。

03

king − man + woman ≈ queen

誰もが単語埋め込みに恋した直感。

Word2Vec / GloVe の埋め込みは「似た単語が近くに置かれる」より奇妙な何かを符号化する —— 方向を符号化するのだ。最も有名な例、もはやミーム:

v(king) − v(man) + v(woman) ≈ v(queen)

\"king\" のベクトルから \"man\" を引き、\"woman\" を足す —— ほぼ正確に \"queen\" の ベクトルに着地する。\"man\" から \"woman\" へのベクトルは埋め込み空間における 一貫した方向で、同じ方向を \"king\" に適用すると \"queen\" に到達する。性別は方向であって座標ではない。

king − man + woman ≈ queen4 つの単語点manwomankingqueen4 つの埋め込み:man、woman、king、queen。実際は 300 次元。
1 / 4
埋め込み空間内の方向には意味がある。"man" から "woman" へのベクトルは、"king" から "queen" へのベクトルとほぼ同じ —— 学習可能で一貫した「性別」方向。

意外なほど成立する他のアナロジー:

  • 首都。v(Paris) − v(France) + v(Italy) ≈ v(Rome)。 「~の首都である」方向は複数の国で一貫する。
  • 動詞の時制。v(walking) − v(walk) + v(swim) ≈ v(swimming)。 \"-ing\" 屈折が学習可能な方向になる。
  • 比較級。v(big) → v(bigger)v(fast) → v(faster) と平行。
  • 単数 / 複数。v(dogs) − v(dog) ≈ v(cats) − v(cat)

なぜ機能するのか? Word2Vec と GloVe は「似た文脈で現れる単語を似たベクトルへ押す」 ように訓練される。\"King\" と \"queen\" は指す対象の性別を除き似た文脈に 現れる。\"Man\" と \"woman\" も大半の文脈属性(主語、有情、人称名詞性)を共有し、 性別で異なる。だからベクトル空間では、性別軸は man / woman と king / queen が同じ やり方で変化する次元。ベクトル減算がその軸を切り出し、ベクトル加算が他所へ運ぶ。

正直な注意点をいくつか。アナロジーは常に成立するわけではない —— 厳選されたペア、 最もきれいで頻度の高い単語で最も機能しやすい。最近の批判的分析は、有名な demo の いくつかは部分的に「工夫された」ものだと指摘した(元 demo の最近傍ルールは入力語を 除外していて、答えを偏らせる)。文脈的埋め込み(§4 と次の primer の話題)は、各出現が 独自のベクトルを持つためこの綺麗な構造を部分的に壊す —— 単一の \"v(king)\" は もう存在しない。だが核心の観察は今も真:埋め込み空間の方向には意味がある。

2013 年の一瞬、これは衝撃だった。分野が偶然にもコンピュータにアナロジー推論を 教えてしまったかに見えた。後に我々が学んだ真実はもっと退屈で面白い:コンピュータが 学んだのは共起統計の近似で、アナロジーはその統計的規則性の副作用だった。いずれにせよ、 この demo は正しい意味でバイラルだった —— その後 10 年の進歩を支えた。

Transformer では:入力埋め込み行列は今も学習可能で、単語類似性を 符号化し、ある程度はベクトル算術で探れるアナロジー構造も持つ。ただしモデルの知識の 大半は静的埋め込みからアテンションと FFN 層へ移った —— §4 の論点であり、 Transformer への橋だ。

04

静的埋め込みでは足りない

どんなに意味があっても、どんな文脈でも、1 単語 1 ベクトル。

Word2Vec と GloVe は巨大な飛躍であり、NLP の頂点に数年座った。だが 2018 年頃には 根本的な限界が明らかだった:単語のあらゆる出現が同じベクトルを得る、 どの文に現れようとも。LLM のテキスト primer §3 でも触れたが、ここで最も鮮明な実演。

単語 \"bank\" を考える:

  • \"She sat by the river bank.\" —— 川岸、水際の斜面。
  • \"She walked into the bank.\" —— 金融機関。
  • \"He works at the blood bank.\" —— 医療用の保存施設。

3 つの意味。Word2Vec はこれらに 1 ベクトルを与える。訓練手続きは 3 つ(以上)の語義に わたって平均する必要があるので、得られる \"bank\" 埋め込みは「川岸クラスタ」と 「金融クラスタ」の間のどこかに落ちる —— どちらにとっても役に立たない。

静的「bank」 vs 文脈的「bank」静的 —— 「bank」は 1 点she sat by the river bank.she walked into the bank.blood bank, on call.embedding spacebank静的。Word2Vec はすべての意味の「bank」に同じ 1 ベクトル。
1 / 3
Word2Vec はあらゆる「bank」の出現に同じベクトルを与える。3 つの文と 3 つの意味が 1 点に潰れる。文脈的埋め込みはこれを修正する —— 出現ごと、文ごとに 1 点。

静的埋め込みができないことの完全リスト:

  • 多義性。\"bank\"、\"bat\"、\"Apple\"、\"rose\"、\"lead\" —— 辞書にある「1 単語多義」のページの内容は Word2Vec から見えない。
  • 語彙外の語(OOV)。語彙は訓練時に固定。新語(\"ChatGPT\"、 ブランド名、人名)には埋め込みが存在しない。サブワード分割(BPE、SentencePiece)が 未知語を既知のかけらに割って助けるが、回避策に過ぎない。
  • 句の合成。\"New York\" は 1 つの都市だが、v(\"New\") + v(\"York\") は別物。Transformer 以前の NLP は別途 「句検出」パイプラインを必要とした。
  • 統語的役割。名詞の \"run\" と動詞の \"run\" は同じベクトル。 モデルは下流で文脈から曖昧性を解消するしかなく、埋め込み自体は助けない。
  • 長距離文脈。段落前にミシシッピ川沿いのハイキングを言及していたから \"bank\" は川岸の意味であるはずでも、静的埋め込みはそれを知る術がない。

修正策を一言で:単語を 1 度埋め込んで終わりにしない。文ごとに 1 度埋め込み、 文に依存させる。\"bank\" の各出現は、周囲のトークンから計算された自分のベクトルを 生む。文脈的埋め込み(contextual embeddings)。ELMo(2018)は単語埋め込みの 上に双方向 LSTM を積んでこれを実現した。BERT と GPT(2018)は Transformer で行った。 下流タスクでの改善があまりに大きく、2 年以内に NLP ベンチマークの上位はすべて文脈的 モデルになった —— 静的埋め込みは「文脈モデルの入力層」に格下げされた。

その格下げこそが現代 Transformer の構造そのもの。最初の層は今でも学習可能な埋め込み テーブル(本質的に Word2Vec、本体と同時訓練)。その上に積まれた数十の層が、この静的 ベクトルを取り、系列内の他のトークンに注目することで段階的に文脈化する。 最終層では、入力の位置 47 の \"bank\" ベクトルは系列内のすべての他トークンに依存する —— 固定の意味はなく、「この特定の文での意味」だけ。

これが橋だ。静的単語埋め込みは 2013–2018 時代の正解だった —— 密で、意味的で、 アナロジー的で、美しかった。1 つだけ —— 文脈 —— で躓き、それを修すのが次の primer の全内容。

Transformer では:埋め込みテーブルの上にアテンション層を積む唯一の 目的は、各トークンの文脈非依存の入力埋め込みを文脈依存の出力ベクトルに変換すること。 最終層に到達する頃、入力中の各 \"bank\" は川岸か銀行か血液バンクかを反映した ベクトルを持ち —— その違いは下流層が各々に異なる挙動を取れるほど鮮明だ。