👏

【Transformerとは? - 第四回】自然言語処理とは何をしているのか

に公開

1. はじめに

本記事は、「機械学習素人が Transformer を理解するまでの記録」 という連載の第四回です。
ChatGPT は使っているものの、Transformer の中身はよく分かっていない、という立場から、基礎に立ち返って理解していく過程をまとめています。

※ 本記事を読むと、
「なぜ言語モデルは“次の単語予測”で成り立つのか」
が数式レベルで腹落ちします。

1.1. 今回の内容

本記事は、
「機械学習素人が Transformer を理解するまでの記録」
という連載の第四回です。

これまでの記事では、

  • Transformer とは何か(概要)
  • ニューラルネットワークの構成要素
  • 推論と学習で何が起きているか

といった内容を整理してきました。

前回までは、どちらかというと
「モデルの中身」
── ノード、重み、活性化関数、誤差逆伝播
といった話が中心でした。


1.2. 今回は「中身」ではなく「何をしているか」

今回のテーマは、
「自然言語処理とは、結局何をしているのか」
です。

Transformer の構造そのものには、まだ踏み込みません。

  • なぜ言葉を数値にするのか
  • 何を予測しようとしているのか
  • なぜこんな数式が出てくるのか

を理解していこうと思います。

その中心にあるのは以下の式です。

P(\bm{Y})=\prod_{t=1}^{T}P(\bm{y}_t|\bm{Y}_{0:t-1})

この式を読み解いていくことで
「自然言語処理とは、結局何をしているのか」
を理解していこうと思います。

1.3. シリーズの内容

導入回:【Transformerとは? - 導入回】機械学習素人が Transformer を理解するまでの記録

  1. Transformerとは(概要)
  2. ニューラルネットワークとは何か
    • 重み・バイアス・活性化関数
    • 脳との関係(比喩として)
  3. ニューラルネットワークの「推論」と「学習」
  4. 自然言語処理とは何をしているのか 👈 今回
  5. 文章の意味と系列モデル(RNN)
  6. 言語モデル・系列変換モデル
  7. Transformerを改めて見る
  8. モデルのチューニング手法の整理
  9. RAGとは何をしているのか
  10. PEFT / Fine Tuning
  11. なぜプロンプトエンジニアリングは効くのか

なお、本シリーズは完成された解説ではなく、学習ログとして公開しています。
理解が更新された場合、過去記事を修正することもあります。


2. まず用語整理

自然言語処理を考えていくと様々な用語が出てきます。
まずはこれらの用語を整理しましょう。

用語 意味
自然言語 人間が日常的に使っている言葉(日本語・英語など)。プログラミング言語のように厳密な文法ではなく、曖昧さや揺れを含む。
自然言語処理(NLP) 自然言語を 計算機で扱える形に変換し、処理・予測する技術分野。翻訳・要約・対話などを含む。
言語モデル 単語列に対して「どれくらいそれらしいか」を確率で評価し、次に来る単語を予測するモデル。
語彙(Vocabulary) モデルが扱える単語の集合。語彙数が増えるほど表現力は増すが、計算量も増える。
トークン モデルが実際に処理する最小単位。必ずしも「単語」とは限らず、文字やサブワードの場合もある。Transformer では『サブワード(単語をさらに細かく分けた単位)』がよく使われる。
one-hot 表現 語彙サイズと同じ次元を持ち、該当する単語の位置だけが 1、他は 0 になるベクトル表現。
埋め込み(Embedding) one-hot のような高次元表現を、低次元で意味を含むベクトルに変換したもの。学習によって更新される。
文脈(Context) ある単語の前後に現れる単語の並び。分布仮説では、意味を決める重要な手がかりになる。
分布仮説 「単語の意味は、その単語が使われる文脈によって決まる」という考え方。
系列データ 順序を持つデータ。文章は単語が並んだ系列データとして扱われる。

3. 自然言語処理のゴールを数式で見る

3.1. 言語モデルとは何を予測しているのか

まず結論から書きます。

自然言語処理、特に 言語モデル がやっていることは、極端に言えばこれです。

「次に来る単語は何か?」を予測する

例えば、

私は昨日、映画を____

と来たら、

  • 見た
  • 観た
  • 見に行った

などが続きそうだ、と予測します。

ChatGPT も、本質的にはこれを超巨大なスケールでやっています。


3.2. 言語モデルの式が意味するもの

その「次を予測する」を、数式で書いたものが次です。

P(\bm{Y})=\prod_{t=1}^{T}P(\bm{y}_t|\bm{Y}_{0:t-1})

ぱっと見、拒否反応が出るかもしれませんが、
これから噛み砕いていきますので、今は眺めるだけでOKです。

ここで言いたいのは、
我々が扱っている言語を数式で表現できる
という点です。
この点に私は感動しました。


3.3. 直感的な言い換え

この式を日本語にすると、だいたいこうなります。

文章全体が現れる確率は、
「これまでの単語を見たときに、次の単語が出る確率」
を順番に掛け合わせたもの

例えば、

私は / 昨日 / 映画を / 見た

という文があると、

  • 「私は」が出る確率
  • 「私は」の次に「昨日」が出る確率
  • 「私は 昨日」の次に「映画を」が出る確率
  • 「私は 昨日 映画を」の次に「見た」が出る確率

を全部掛け算して、

「この文章らしさ」を評価している

と考えることができます。


4. なぜ「言葉」を数値にする必要があるのか

4.1. ニューラルネットワークは数値しか扱えない

ここで、一歩立ち止まります。

ニューラルネットワークは、

  • 数値を入力として受け取り
  • 数値を計算し
  • 数値を出力する

装置です。

「犬」「猫」「嬉しい」といった
言葉そのもの
を直接扱うことはできません。


4.2. 「意味」を直接理解しているわけではない

これは重要なポイントです。

モデルは、

  • 犬が何か
  • 嬉しいとはどういう感情か

を 理解しているわけではありません。

あくまで、

  • どんな数値が入力され
  • どんな数値が出てきたか

だけを見て学習します。

だからまず、

言葉 → 数値

に変換する必要があります。


5. 単語を数値で表す最初の試み:one-hot

5.1. one-hot 表現とは何か

一番単純な方法が one-hot 表現 です。

語彙が 5 個あるとします。

["犬", "猫", "車", "走る", "食べる"]

このとき、

犬     = [1,0,0,0,0]
猫     = [0,1,0,0,0]
車     = [0,0,1,0,0]
走る   = [0,0,0,1,0]
食べる  = [0,0,0,0,1]

という表し方をします。

5.1.1. なぜ one-hot と言う?

one-hot の語源は元々デジタル回路から来ているそうです。
多数のビット列の中で、たった一つだけが「高電圧 (1) = hot」であり、その他は「低電圧 (0)=cold」である状態を指して、
one-hot
と言うのだそうです。


5.2. one-hot 表現の単語はIDにすぎない

ここで重要なのは、

one-hot は「意味」を表していない

という点です。

これは実質、

犬 = ID:1
猫 = ID:2

を、ベクトルにしただけです。

この点は大事だと思っています。
そもそも数値の羅列にどうやって単語に意味を付与するのか。
これから整理する各種の方法で様々な工夫がされています。

しかし、one-hot 表現では意味を付与するという概念がなく、
ただ、単語に ID をつけている方法です。


5.3. 次元爆発と「意味がない」問題

one-hot には致命的な問題があります。

5.3.1. 次元爆発

語彙が 3 万語あれば、ベクトル表現が3 万次元になります。
しかもそのほとんどの値が 0 であるので、非常に無駄が多い表現方法です。

5.3.2. 意味がない

上述したように one-hot 表現には意味を持たせられません。
そのため、

犬 と 猫 の距離
犬 と 車 の距離

は、one-hot 上では すべて同じ です。

人間が感じる
「犬と猫は近い」
という感覚は、全く反映されません。


6. 人が意味を与える:特徴量表現

6.1. 特徴量とは何か

そこで数値に意味を持たせようと考えられたのが、

人が意味の軸を決めてしまおう

という発想です。


6.2. 具体例で見る特徴量表現

例えば、

単語 動物 哺乳類 乗り物
犬 1 1 0
猫 1 1 0
車 0 0 1

ベクトル表現だと

犬 = [1,1,0]
猫 = [1,1,0]
車 = [0,0,1]

こうすれば、

  • 犬と猫は近い
  • 車は遠い

という、意味を含んだ 関係を表現できます。


6.3. 設計者依存・スケールしない問題

意味を表現できるようになった一方で、問題もあります。

  • 特徴を誰が決めるのか?
  • 何個用意すれば十分なのか?

語彙が増えるたびに、
人が設計し直す必要があります。

例えば上の例だと、犬と猫が全く同じベクトルになっているので良い特徴量の設計だとは言えません。
このような見直しを単語が増える度に行う必要があります。

また「未知語に弱い」という点もデメリットです。


6.4. 未知語に弱いとはどういうことか

例えば、

スーパーカー

という単語が出てきたとき、

  • 動物?
  • 乗り物?
  • 高級?

どの特徴を 1 にするか、
事前に決めていないと扱えません。

特徴量表現は「意味を扱える」という点では素晴らしいのですが、まだ欠点のある手法のようです。


7. 発想の転換:分布仮説

7.1. 「意味は使われ方で決まる」

ここで登場するのが 分布仮説 です。
分布仮説とは、

単語の意味は、その単語が使われる文脈で決まる

という考え方です。

これは設計者が単語の意味を決めるのではなく、単語の使われ方から意味を抽出するため、
特徴量表現の欠点を補う手法といえます。


7.2. 分布仮説の直感的な例

例えば、

私は犬を飼っている
私は猫を飼っている

犬と猫は、
ほぼ同じ位置で使われています。

一方、

私は車を飼っている

は不自然です。

ということで、
使われ方が似ていれば、意味も似ているはず

ただ、分布仮説はこの段階ではまだ「仮説」です。
これを実装して使えるようにしたのが、word2vec であり、具体的な手法として CBoW と Skip-Gram があります。


8. 分布仮説の実装:word2vec

word2vec は、分布仮説を計算機で実現しました。
分布仮説をニューラルネットワークでモデル化しました。

8.1. CBoW と Skip-Gram

CBoW と Skip-Gram の違いは以下です。

  • CBoW (Continuous Bag-of-Words):周囲 → 中央を予測
  • Skip-Gram:中央 → 周囲を予測

8.2. 何が画期的だったのか

単語のベクトル化にニューラルネットワークを用いていると言うことは、
学習できる
と言うことです。

学習については 【Transformerとは? - 第三回】ニューラルネットワークの「推論」と「学習」 でも整理しましたが、
あるデータを入れて、推論させた出力と正解との差分(損失)をニューラルネットワークを逆伝搬させることで、ニューラルネットワークのパラメータ(重みとバイアス)を更新します。
これは特徴量表現とは異なり、

  • 人が特徴を設計しなくていい
  • 自動で意味空間ができる
  • 類義語が近くに並ぶ

という特徴があります。

king - man + woman ≈ queen

のような現象も生まれました。

ある単語を表現するには word2vec で十分そうに思えます。


8.3. それでも残る限界

しかし、「単語」ではなく「文章」を見る時に、word2vec には限界がありました。
それは、

  • bank(銀行)
  • bank(川岸)

のような 多義語 は、同じベクトルになるということです。
つまり単語単体を表すことはできても、
文章の中でどのような「文脈」で使われているのかがまでは表現できない
ということです。

この点は Transformer で対策されているのですが、少し話が逸れるので後に回そうと思います。


9. 最初の数式に戻る

ここで、最初の式に戻ろうと思います。
その式とは以下でした。

P(\bm{Y})=\prod_{t=1}^{T}P(\bm{y}_t|\bm{Y}_{0:t-1})

今回の記事では、この式を読み解いていくことで
「自然言語処理とは、結局何をしているのか」
を理解していくことが目的でした。

9.1. \bm{Y} とは何か(系列としての単語)

\bm{Y} は、単語の並び です。

「私はひたまです」
を \bm{Y} に入れると以下のようになります。

\begin{equation} \begin{split} \bm{Y} &= ("私", "は", "ひたま", "です")\\ &= (\bm{y}_1="私", \bm{y}_2="は", \bm{y}_3="ひたま", \bm{y}_4="です") \\ &= (\bm{y}_1, \bm{y}_2, \bm{y}_3, \bm{y}_4) \end{split} \end{equation}

これを少し一般化して書くと以下になります。

\bm{Y} = (\bm{y_1}, \bm{y_2}, ..., \bm{y}_t)

長さが T の単語列を表しています。


9.2. \bm{y_1}, \bm{y_2}, ... は何を表しているのか

各 \bm{y_1}, \bm{y_2}, ... は、

これまでの章で学習した、

  • one-hot
  • もしくはその埋め込み

で表された 単語の数値表現 です。

わかりやすさのために one-hot 表現で書くと以下です。

\begin{equation} \begin{split} 私 &= [1,0,0,0] = \bm{y}_1\\ は &= [0,1,0,0] = \bm{y}_2\\ ひたま &= [0,0,1,0] = \bm{y}_3\\ です &= [0,0,0,1] = \bm{y}_4 \end{split} \end{equation}

ですので、上記を踏まえると Y は以下となります。

\begin{equation} \begin{split} \bm{Y} &= (\bm{y}_1, \bm{y}_2, \bm{y}_3, \bm{y}_4)\\ &=( \begin{bmatrix}1\\0\\0\\0\end{bmatrix}, \begin{bmatrix}0\\1\\0\\0\end{bmatrix}, \begin{bmatrix}0\\0\\1\\0\end{bmatrix}, \begin{bmatrix}0\\0\\0\\1\end{bmatrix} ) \end{split} \end{equation}

9.3. 条件付き確率と同時確率

確率は P で表し、事象 A の確率は P(A) と書きます。
そして、ある B という条件の下で、A が起こる確率を 条件付き確率 と言い、P(A|B) と書きます。

私の理解では、不幸が重なる確率がイメージしやすいなと思いました。
例えば、「泣きっ面に蜂」が起こる確率は、

P(蜂に刺される|転けて泣く)

と表せます。

言語処理の話に戻ると、
ある単語 \bm{y_1} が与えられたときに、単語 \bm{y_2} が選ばれる確率は、

P(y_2 | y_1)

となります。


9.4. 冒頭の式を理解する

またまた冒頭の式を書きます。
それは以下でした。

P(\bm{Y})=\prod_{t=1}^{T}P(\bm{y}_t|\bm{Y}_{0:t-1})

ここまで来ると、ほとんどが読み解けると思います。
ただ、\prod_{t=1}^{T} だけ先に触れておきます。

\prod_{t=1}^{T} この記号、私はこの式で初見でした。
これは、\sum の積バージョンだそうです。
ですので、

P(\bm{y}_t|\bm{Y}_{0:t-1}) を 1からTまで 掛けます

ということです。

つまり、冒頭の式は、以下を表しているということです。

[左辺] = 長さ T の \bm{Y} の文が出来上がる確率
[右辺] = 一単語目から T 単語目までの条件付き確率を積算した確率

ここまでを踏まえると、この数式はもはや「難しい理論」ではありません。

自然言語処理とは結局のところ、

「これまでの単語列を見て、次にどの単語がもっとも“それらしいか”を評価し続ける作業」

を、確率という形で厳密に書いたものです。

モデルは文章全体を一気に理解しているわけではありません。
一語ずつ、
「ここまで来たなら、次は何だろう?」
を問い続け、その積み重ねとして文章を扱っています。

この視点に立つと、
自然言語処理とは **「言葉を理解する技術」**ではなく、
「言葉の“続き方”を学習する技術」 なのだと言えます。


10. Transformer と単語のベクトル化

ここからが、
「なぜTransformerが革命だったのか」
につながります。

ここまでで、

  • 単語は数値で表す必要がある
  • 意味は人が与えるのではなく、文脈から学習する
  • 言語モデルは「次を予測する確率」を積み重ねている

という前提が揃いました。

では、Transformer は単語をどうやってベクトル化し、どう意味を扱っているのか を整理します。


10.1. Transformer も分布仮説に立っている

まず大前提として、

Transformer も分布仮説に立っている

という点は非常に重要です。

Transformer は、

  • 「犬とは何か」
  • 「銀行とは何か」

といった意味を、
事前に定義して持っているわけではありません。

あくまで、

その単語が、どんな単語と、どんな順番で、一緒に現れるか

という 使われ方(文脈) だけを材料にしています。

この点では、
word2vec から Transformer まで、思想は一貫しています。


10.2. word2vec との決定的な違い

ただし、Transformer は word2vec と 決定的に違う点 があります。

それは、

「単語の意味を、毎回その場で作り直している」

という点です。


10.2.1. word2vec の場合

word2vec では、

  • 単語ごとに
  • 1つの固定されたベクトル

が割り当てられます。

bank → [0.12, -0.87, ...]

このベクトルは、

  • 銀行の bank
  • 川岸の bank

を 区別しません。

どんな文章に出てきても、
bank は常に同じベクトルです。


10.2.2. Transformer の場合

一方 Transformer では、

I went to the bank to deposit money
I sat by the river bank

この 2 つの bank は、

異なるベクトルとして扱われます

なぜなら、

  • 周囲の単語(文脈)
  • 文全体の流れ

を見た上で、
「この文脈における bank の意味」
を計算しているからです。

つまり Transformer では、

単語の意味は固定されていない
文脈を通して、その都度「意味ベクトル」が生成される

という構造になっています。


10.3. embedding は「意味の完成形」ではない

ここで重要な誤解を一つ潰しておきます。

Transformer における embedding は、

それ自体が意味を表しているわけではありません


10.3.1. embedding の正体

Transformer における embedding は、

  • one-hot では扱えないので
  • とりあえず低次元の連続値に写像したもの

にすぎません。

言ってしまえば、

「意味を考えるための素材」

です。

この段階では、

  • 単語間の距離
  • 類義語関係

は、まだかなり曖昧です。


10.3.2. 意味が作られるのは「後段」

Transformer では、

  • embedding
  • positional encoding
  • attention

と処理が進むにつれて、

文脈を反映した単語表現

が作られていきます。

つまり、

  • embedding:素材
  • Attentionを中心とした層構造:意味を作る装置

という役割分担になっています。


10.4. なぜ embedding を「先に完成させない」のか

ここで疑問が湧くかもしれません。

最初から、いい感じの意味ベクトルを作っておけばよくない?

実は、これを やらないこと にこそ意味があります。


10.4.1. 文脈は無限に変わる

単語の意味は、

  • 文
  • 話題
  • 前後関係

によって、いくらでも変わります。

もし embedding の段階で
「意味」を固定してしまうと、

  • 文脈による意味の揺れ
  • 多義語
  • 比喩的表現

に対応できなくなります。


10.4.2. 汎用モデルとしての強さ

embedding を未完成のままにしておくことで、

  • 翻訳
  • 要約
  • 対話
  • コード生成

といった 多様なタスク に対して、

「文脈に応じて意味を作り直す」

という共通の仕組みを使えます。

これが Transformer が
汎用モデルとして強い理由 の一つです。


10.5. この章の位置づけ

この章のポイントを一言でまとめると、

Transformer は
単語に「意味」を持たせるのではなく、
文脈を通して「意味が立ち上がる構造」を作っている

ということです。

ここまでで、

  • 単語は系列である
  • 次を予測することで文章を扱う
  • 意味は文脈から生まれる
  • embedding は素材にすぎない

という前提が揃いました。

次に出てくる疑問は、ほぼ必然です。

文脈とは、どうやって保持されているのか?

次回はその問いに答えるため、
RNN をはじめとする 系列モデル を見ていきます。

Transformer を理解するための、
最後の「助走」です。


11. まとめ

11.1. 自然言語処理とは何をしているのか

本記事では、

  • 言葉はそのままでは扱えないため、数値に変換する必要があること
  • one-hot や特徴量表現では「意味」を十分に扱えないこと
  • 「意味は使われ方で決まる」という分布仮説により、学習可能な意味空間が生まれたこと
  • そして最終的に、文章全体は「次を予測する確率の積」として表現できること

を見てきました。

これらを一言でまとめると、

自然言語処理とは、
言葉を数値に落とし込み、
文脈を手がかりに、
次に来る単語の確率を更新し続ける営み

だと言えます。

LLM は「文章を理解している」ように見えますが、
その実体は、
極めて局所的な予測を、驚くほど大規模に積み重ねている 存在です。


12. おわりに

今回の記事では、
自然言語処理を「モデルの中身」から一度離れ、
「そもそも何をしようとしているのか」
という視点で整理しました。

ここまでで、

  • 言語は系列であり
  • 予測は一語ずつ行われ
  • 文脈が意味を形作る

という前提は揃いました。

しかし、まだ一つ大きな疑問が残っています。

単語の「順序」は、どのように扱われているのか?

「私は 昨日 映画を 見た」と
「昨日 私は 映画を 見た」は、
単語はほぼ同じでも、意味や自然さは微妙に異なります。

次回はこの「順序」という問題に焦点を当て、
RNN をはじめとする系列モデルを見ていきます。

Transformer を理解するための、
最後の下準備です。

Discussion