はじめに
前回の記事で、私たちはRNNLMがどのようにして「次に来る単語」を予測するのか、その魔法のような仕組みを学びました。RNNは過去の文脈を「記憶」し、それに基づいて次に来る単語の確率リストを出力するのでしたね。
しかし、ここで一つの巨大な疑問が残ります。
「どうやって、RNNは"良い"予測ができるように学習するのでしょうか?」
生まれたてのRNNLMは、デタラメな予測しかできません。それを、まるで人間の赤ちゃんが言葉を覚えるように、たくさんの文章を読み込ませて賢くしていく必要があります。その「教育」の根幹を担うのが、今回解説する損失関数、特に自然言語処理で王様のように君臨する交差エントロピー (Cross-Entropy) です。
この記事も、二部構成でお届けします。
- 【初心者編】 では、交差エントロピーが何を目指しているのかを、クイズ大会の例え話を通して、数式を一切使わずに直感的に理解します。
- 【応用編】 では、交差エントロピーの美しい数式を解き明かし、さらに、それをコンピュータ上で安定して計算するための必須テクニック「数値安定化」の秘密に迫ります。
モデルが「間違いから学ぶ」とはどういうことか、その本質を一緒に探っていきましょう。
【初心者編】損失の正体は「答え合わせの厳しさ」
1. モデルの予測は「確率」という名の自信
まず、RNNLMの出力がどのようなものだったか、もう一度思い出しましょう。
「公園に__」という文の次を予測する時、モデルは一つの単語をズバリと答えるわけではありません。
語彙(モデルが知っている全単語)のリストに対して、「次に来る単語がこれである確率」 を、自信の度合いとして出力します。
- 「行こう」: 60%
- 「散歩」: 25%
- 「行く」: 10%
- 「猫」: 0.001%
- ... (その他すべての単語) ...
これがモデルの「解答」です。
2. 損失関数とは「採点をする先生」
モデルが解答(確率リスト)を出したら、次は「答え合わせ」が必要です。この答え合わせをして、モデルの予測がどれくらい"ダメ"だったかを評価し、「罰点(ペナルティ)」を与えるのが損失関数の役割です。
- 良い予測をした → 罰点は小さい
- 悪い予測をした → 罰点は大きい
モデルの学習目標は、この「罰点の合計(=損失)」を、ひたすら小さくしていくことです。つまり、損失関数はモデルを正しい方向へ導く、厳しい先生のような存在なのです。
3. 交差エントロピーという、超スマートな採点方法
では、交差エントロピー先生は、どのように賢く採点するのでしょうか?
これを、「全財産を賭けるクイズ大会」 に例えてみましょう。あなたは解答者(モデル)です。
【ルール】
- 問題は「次に来る単語は何でしょう?」。
- あなたは、手持ちのコイン100枚(=確率100%)を、答えだと思う選択肢に賭けて配分します。
- 答え合わせの後、正解の選択肢に賭けていたコインの枚数によって、ペナルティが決まります。
問題: 「今日の天気は良いので、公園に__」
正解は「行こう」だったとします。
ケース1:自信満々で、大正解!
- あなたの賭け方: 「行こう」に90枚、「散歩」に10枚。
- 答え合わせ: 正解の「行こう」に、あなたは90枚も賭けていました。
- 交差エントロピー先生の評価: 「素晴らしい!ほぼ完璧な予測だ。罰点は、ほんのわずかで許してやろう」
- 損失(罰点) → 極小
ケース2:自信はなかったけど、正解!
- あなたの賭け方: 「行こう」に30枚、「散歩」に30枚、「行く」に25枚、その他に15枚。
- 答え合わせ: 正解の「行こう」に、あなたは30枚賭けていました。
- 交差エントロピー先生の評価: 「ふむ。正解はしたが、かなり自信がなさそうだな。もっと自信を持って正解できるようになりなさい。罰点は、まあまあ与えておこう」
- 損失(罰点) → 中
ケース3:自信満々で、大ハズレ!
- あなたの賭け方: 「仕事」に90枚、「行こう」にたった1枚。
- 答え合わせ: 正解の「行こう」に、あなたはたったの1枚しか賭けていませんでした。
- 交差エントロピー先生の評価: 「何を考えているんだ! 全く見当違いの答えに自信満々で賭けて!これはひどい間違いだ!罰点は、とてつもなく大きく与える!!」
- 損失(罰点) → 超巨大
この採点方法の賢さが見えてきましたか?
交差エントロピーは、単に正解か不正解かを見ているのではありません。「正解の選択肢に、どれだけの自信(確率)を割り振れていたか」 を見ています。
そして特に、間違った答えに高い自信を持つこと(ケース3)を、極めて厳しく罰するのです。
この「厳しさ」こそが、モデルを「正解の単語の確率を、とにかく高くしろ!」という方向へ強く、強く学習させる原動力となるのです。
【応用編】交差エントロピーの数式と実装の知恵
直感的なイメージを掴んだところで、今度はこのスマートな採点方法が、どのような数式で成り立っているのかを見ていきましょう。
4. 交差エントロピーの数式を分解する
ある一つのサンプルに対する交差エントロピー損失(Loss)は、以下の数式で表されます。
$$
L = - \sum_{i=1}^{C} y_i \log(\hat{y}_i)
$$
- $C$: クラスの数(=語彙の総数)
- $y_i$: 正解ラベル。$i$番目の単語が正解なら1、それ以外は0となるベクトル(one-hotベクトル)。
- $\hat{y}_i$: モデルの予測確率。$i$番目の単語である確率。
この数式、一見複雑ですが、実は驚くほどシンプルになります。
なぜなら、正解ラベル $y_i$ は、正解の単語の場所だけが1で、他は全部0だからです。
例えば、語彙が「行く, 公園, 猫, 仕事, 行こう」の5単語で、正解が5番目の「行こう」だとすると、正解ラベル$y$は [0, 0, 0, 0, 1] となります。
この状態で、先ほどの $\sum$ (総和) の計算を考えてみましょう。
$i=1$の時: $y_1=0$ なので、 $0 \times \log(\hat{y}_1) = 0$
$i=2$の時: $y_2=0$ なので、 $0 \times \log(\hat{y}_2) = 0$
...
$i=4$の時: $y_4=0$ なので、 $0 \times \log(\hat{y}_4) = 0$
$i=5$の時: $y_5=1$ なので、 $1 \times \log(\hat{y}_5) = \log(\hat{y}_5)$
なんと、正解の単語以外の項は、すべて0になって消えてしまうのです!
その結果、あの複雑そうに見えた数式は、実質的に以下のようになります。
$$
L = - \log(\hat{y}_{\text{correct}})
$$
ここで $\hat{y}_{\text{correct}}$ は、モデルが正解の単語に対して予測した確率です。
これ、まさに先ほどのクイズ大会の例え話そのものだと思いませんか?
- ケース1: 正解の確率 $\hat{y}_{\text{correct}}$ が0.9 → $L = -\log(0.9) \approx 0.10$ (罰点 小)
- ケース3: 正解の確率 $\hat{y}_{\text{correct}}$ が0.01 → $L = -\log(0.01) \approx 4.60$ (罰点 大)
-log(x) のグラフは、xが0に近づくほど急激に無限大へ発散します。これが、交差エントロピーが「自信のある間違い」に強烈な罰点を与える仕組みの数学的な正体です。
5. 実装上の罠:数値安定化とSoftmax
さて、理論は完璧です。しかし、これをコンピュータで実装しようとすると、ある問題に直面します。それは**「数値的不安定性」**です。
モデルが予測確率 $\hat{y}$ を出力する最後の層は、Softmax関数でした。
$$
\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}}
$$
ここには指数関数 $e^x$ が含まれています。指数関数は、入力が少し大きくなるだけで、爆発的に大きな値になります。
例えば、コンピュータがある値 $z_i$ を 1000 と計算したとしましょう。$e^{1000}$ は、天文学的な数値になり、コンピュータが扱える数値の範囲を簡単に超えてしまいます(オーバーフロー)。
逆に、$z_i$ が -1000 だと、$e^{-1000}$ は限りなく0に近い値になり、情報が失われてしまいます(アンダーフロー)。
このままでは、計算が不安定で学習がうまく進みません。
解決策:Log-Softmax Trick
この問題を解決するのが、古くから知られる賢い数学的トリックです。
Softmax関数の分子と分母に、同じ定数 $C$ を掛けても、結果は変わりません。
$$
\frac{e^{z_i}}{\sum_j e^{z_j}} = \frac{C \cdot e^{z_i}}{C \cdot \sum_j e^{z_j}}
$$
ここで、$C = e^{-\max(z)}$ としてみましょう。$\max(z)$は、入力$z$の中で最も大きい値です。すると、
$$
= \frac{e^{z_i - \max(z)}}{\sum_j e^{z_j - \max(z)}}
$$
この式変形は何が嬉しいのでしょうか?
$z_i - \max(z)$ を計算すると、最も大きい値は必ず 0 になります。($\max(z) - \max(z) = 0$)
そして、それ以外の値はすべてマイナスになります。
つまり、指数関数 $e^x$ に、0より大きい値が入力されなくなります。
これにより、$e^x$ が爆発的に大きくなるオーバーフローを完全に防ぐことができるのです。
このトリックのため、現代の深層学習ライブラリ(PyTorchやTensorFlow)では、Softmax層とCrossEntropyLossを別々に呼び出すことはしません。nn.CrossEntropyLoss のような一つのクラスにまとめられており、その内部でこの**数値的に安定した方法(Log-Softmax Trick)**で計算が行われるのが一般的です。
まとめ
モデルの学習の心臓部である損失関数について、その直感的イメージから実装上の詳細までを深掘りしてきました。
- 損失関数は「採点官」: モデルの予測がどれだけ悪いかを評価し、罰点を与える。
- 交差エントロピーは「超スマートな採点官」: 特に「自信満々の間違い」を厳しく罰することで、モデルを効率的に学習させる。
- 数式的には: $L = - \log(\hat{y}_{\text{correct}})$ となり、正解単語への予測確率が低いほど、損失は指数的に増大する。
- 実装上の知恵: Softmax関数はオーバーフローしやすいため、「Log-Softmax Trick」を用いて数値的に安定した計算を行うのが定石。
損失関数を理解することは、モデルが「何を目標に」「どのように賢くなっていくのか」を理解することに他なりません。この知識は、今後あなたがより複雑なモデルの学習やデバッグを行う上で、必ず役に立つ羅針盤となるでしょう。