0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【自然言語処理入門】確率と損失の直感(交差エントロピー/数値安定化編)

Posted at

はじめに

前回の記事で、私たちは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」を用いて数値的に安定した計算を行うのが定石。

損失関数を理解することは、モデルが「何を目標に」「どのように賢くなっていくのか」を理解することに他なりません。この知識は、今後あなたがより複雑なモデルの学習やデバッグを行う上で、必ず役に立つ羅針盤となるでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?