JA EN
体系情報理論
·無料·12分で読めます

エントロピーと交差エントロピー — 損失関数の出どころ

分類モデルで必ず出てくる交差エントロピー損失は、天下り式に決められたものではありません。「驚きの量」から出発して、エントロピー → 交差エントロピー → あの見慣れた損失式へと一本道でたどり、なぜ二乗誤差ではダメなのかまで説明します。

対象textタスクmath

「当たり前」には情報がない

雨がほとんど降らない砂漠の街で、天気予報が「明日も晴れです」と言ったとします。あなたは何も得ていません。知っていたからです。同じ街で「明日は雪です」と言われたら、それは大ニュースです。

ここに情報の正体があります。情報の量は、それがどれだけ意外だったかで決まる。1948年にクロード・シャノンが定式化したのは、この「驚きの大きさ」を数字にする方法でした。

遠回りに見えるこの話が、画像分類でも言語モデルでも必ず使われている交差エントロピー損失の出どころです。「なぜあの式なのか」を、ここから一本道でたどります。

驚きの量を式にする — なぜ対数なのか

「驚きの量」を測る関数に満たしてほしい条件は、2つだけです。

  1. 確率が小さい出来事ほど、驚きが大きい
  2. 独立した2つの出来事が両方起きたときの驚きは、それぞれの驚きの足し算になってほしい

2つ目が決定打です。独立な出来事が両方起きる確率は掛け算p1×p2p_1 \times p_2)。掛け算で減る量を、足し算で増える量に翻訳する関数——それが対数です。条件1と2を同時に満たす関数は、定数倍を除いて対数しかありません。

I(x)=log1p(x)=logp(x)I(x) = \log \frac{1}{p(x)} = -\log p(x)
(1)

式(1)は「出来事 xx の情報量は、その確率 p(x)p(x) の逆数の対数」。確率が半分になるたびに情報量が一定量ずつ増える設計です。

つまり、100回に1回しか起きないことを知らされたときのほうが、2回に1回起きることを知らされたときより、たくさん受け取っているということ。珍しさを、そのまま「量」に読み替える装置です。

対数の底で単位が変わります。底が2ならビット、自然対数ならナット (nat)。コイン1回の表裏を知る情報量は log22=1\log_2 2 = 1 ビット、2回なら2ビット。「1ビット=2択が1つ解決した」と読めます。機械学習のライブラリは自然対数を使うので、損失値の単位はナットです。

エントロピー: 平均の驚き

1回きりの出来事ではなく、情報源そのものを評価したい。ならば驚きの平均を取ります。

H(p)=xp(x)log1p(x)H(p) = \sum_x p(x)\,\log \frac{1}{p(x)}
(2)

式(2)は「起こりうる出来事を全部並べ、それぞれの驚き log1p(x)\log\frac{1}{p(x)} に、それが起きる確率 p(x)p(x) を掛けて足したもの」。つまり平均してどれくらい驚かされる情報源なのかです。

表裏が半々のコインは H=1H = 1 ビット、9割方表が出るイカサマコインは約0.47ビット、ほぼ確実に表なら0に近づきます。予測しやすい情報源ほどエントロピーは小さい。最大になるのは全部の目が等確率のとき(NN 択なら logN\log N)で、これが「いちばん予測しにくい状態」です。

エントロピーには工学的な意味もあります。その情報源を記録するのに必要な平均ビット数の理論的下限です。よく出る記号に短い符号を割り当てれば平均長は縮みますが、どんな符号を作ってもこの値より下には行けません。

交差エントロピー: 間違った予想表で暮らすコスト

ここからが本題です。現実の分布 pp を私たちは知りません。知っているのはモデルの予想 qq だけです。

比喩で言えば、あなたは qq を信じて符号帳を作ってしまった状態です。「晴れはよく出るから短い符号、雪は稀だから長い符号」と割り当てた。ところが現実に降る天気の頻度は pp に従う。すると符号の長さは qq で決まるのに、その符号を使う回数は pp で決まるという、ねじれた勘定になります。

H(p,q)=xp(x)log1q(x)H(p,q) = \sum_x p(x)\,\log \frac{1}{q(x)}
(3)

式(3)がその平均コストで、交差エントロピーと呼ばれます。式(2)との違いは1箇所、対数の中身が pp から qq に変わっただけ。読み方は「驚きの大きさはモデルの予想 qq で測るが、その驚きが何回訪れるかは現実の pp が決める」です。

言い換えると、雪に長い符号を割り当てたまま雪国に引っ越してしまった人が、毎月払い続けることになる通信費です。符号帳は自分の思い込みで作れますが、請求書の枚数を決めるのは天気のほうです。

分解すると、KL情報量が顔を出す

交差エントロピーは、きれいに2つに割れます。

H(p,q)=H(p)+DKL(pq)H(p,q) = H(p) + D_{\mathrm{KL}}(p \,\|\, q)
(4)

式(4)は「間違った予想表で払うコスト = どうやっても避けられない分 + 予想がズレているせいの余計な分」。第1項 H(p)H(p) は現実そのものの予測しにくさで、モデルが何をしようと変わらない定数です。第2項の DKL(pq)D_{\mathrm{KL}}(p\|q)KL情報量qqpp からズレていることへの追加料金で、0以上、一致したときだけ0になります。

つまり、画面に出ている損失の値には、最初から「データそのものの難しさ」という下駄が履かせてあるということ。学習で削れるのは第2項だけで、第1項は最後まで残ります。

この分解が、損失関数としての正当性そのものです。H(p)H(p) が定数なら、交差エントロピーを下げる作業は、KL情報量を下げる作業と完全に同じ。私たちは「なんとなく良さそうな損失」ではなく、分布間のズレを直接削っているわけです。KL情報量の性質——特に「距離ではない」非対称性——はKL情報量を1からで扱っています。

同時に式(4)は現実的な注意もくれます。損失の下限は0ではなく H(p)H(p) です。ラベルにノイズがあれば、完璧なモデルでも損失はそこで止まります。学習曲線が0.3で平らになったとき、モデルの限界かデータの限界かの判断は、この項を知っているかで変わります。

one-hotに潰すと、見慣れたあの式になる

分類問題では正解が1つに決まっています。「この画像は猫」なら、真の分布 pp は猫が1、それ以外が0のone-hotベクトルです。

これを式(3)に入れると、和の中の項は正解ラベル yy 以外すべて p(x)=0p(x)=0 で消え、1項だけが生き残ります。

L=logqyL = -\log q_y
(5)

式(5)、これが実務で書いている交差エントロピー損失です。読み方は身も蓋もなく「正解ラベルにモデルが割り当てた確率の対数に、マイナスを付けただけ」。

つまり、採点で見ているのは正解の1マスだけということ。残りの確率を他のどのクラスにどう配ったかは、qyq_y の値が決まった時点でもう損失に影響しません。

正解に0.9を出せていれば損失は約0.105、0.5なら0.693、0.01しか出していなければ4.6。自信を持って間違えたときに罰が急激に重くなるのがこの関数の性格です。この損失の指数を取った eLe^{L}パープレキシティで、「実質何択で迷っているか」を表します。損失4.6なら、およそ100択で迷っている状態です。

softmaxとセットで使う理由

モデルが最後に吐くのは確率ではなく、ロジットと呼ばれる範囲無制限の生スコアです(猫: 3.2、犬: 1.1、鳥: -0.5 のような)。式(5)に入れるには、まず確率に変換しなければなりません。その役目が softmax です。

qi=ezi/Tjezj/Tq_i = \frac{e^{z_i/T}}{\sum_j e^{z_j/T}}

「各スコアを指数に載せ、全部の合計で割って比率にする」だけの式です。指数を通すのは、負の値も正にしつつ、大小関係を保ったまま差を強調するため。TT温度で、既定は1。大きくすると分布が平らになり、小さくすると尖ります。

要するに、順位はそのままに、点差を確率の差へ翻訳しているだけ。得点表を「全体の何割か」の表に書き換える作業だと思ってください。

FIG 1同じロジットでも、温度を下げると1位に確率が集中し、上げるとどのクラスも似た確率になる。上位2つのスコア差がわずかでも、低温では分布がほぼ1点に潰れる——ここが交差エントロピー損失の大きさを決めている

動かして確かめてほしいのは、同じスコアでも損失がまったく変わる点です。正解が僅差で1位のとき、温度を下げれば qyq_y は1に近づき損失はほぼ0、上げれば 1/N1/N に近づき損失は logN\log N に張り付きます。学習時の温度は1に固定するのが普通で、触るのは推論時の多様性調整と、知識蒸留のときです。

コードで書く

numpyで書くと、驚くほど短くなります。

import numpy as np

def cross_entropy(logits, labels):        # logits: (B, C), labels: (B,)
    z = logits - logits.max(-1, keepdims=True)      # オーバーフロー防止
    logZ = np.log(np.exp(z).sum(-1, keepdims=True)) # log-sum-exp
    logq = z - logZ                                 # = log softmax(logits)
    return -logq[np.arange(len(labels)), labels].mean()

softmaxを計算してから対数を取る、ということは絶対にしないのがポイントです。qyq_y がアンダーフローして0になれば log0=\log 0 = -\infty で全部が壊れます。最大値を引いて log-sum-exp を使えば、確率という危険な中間値を経由せずに logqy\log q_y が直接得られます。

なぜ二乗誤差ではダメなのか

分類でも二乗誤差(MSE)は一応動きますが、学習が目に見えて遅くなります。理由は勾配の形です。

softmax と交差エントロピーを組み合わせると、ロジットに対する勾配がこの1行になります。

Lz=qp\frac{\partial L}{\partial z} = q - p
(6)

式(6)は「予測した確率から、正解のone-hotを引いただけ」。0.01しか出せていない大外れなら勾配の大きさはほぼ1で、間違いが大きいほど大きく修正がかかります。

つまり、出しすぎたクラスから減らし、足りなかった正解に足す——それ以上のことは何もしていないということ。修正量が「ズレそのもの」になっているのが、この組み合わせの正体です。

MSEを使うと、ここに softmax(あるいはsigmoid)の微分が余計に掛かります。この微分は出力が0や1に近いところでほぼ0になるため、自信満々に間違えているときほど勾配が消えるという最悪の挙動になる。交差エントロピーは、この飽和項をちょうど打ち消すように対数が効く設計です。勾配降下そのものの復習は損失関数と最適化にあります。

現場ではこう使う

誰がいつ触るか。 分類モデルを学習させる機械学習エンジニアは毎回これを触ります。LLMの継続事前学習やファインチューニングの担当者は、損失値そのものを監視指標として読みます(言語モデルではパープレキシティに換算することが多い)。

触るパラメータ名。 PyTorchなら nn.CrossEntropyLoss、TensorFlow/Kerasなら SparseCategoricalCrossentropy(from_logits=True)。実務で頻繁に指定するのは次の3つです。

知らないと事故になる落とし穴。

  1. 二重softmax。 最終層に softmax を入れたまま nn.CrossEntropyLoss に渡すのが最頻出のバグです。この関数はロジットを受け取る前提で内部に log-softmax を持つため、二重に掛かって勾配が鈍り、「学習は進むが精度が伸びきらない」という気づきにくい形で現れます。Kerasで from_logits を間違えるのも同じ事故です。
  2. 損失0を目標にしない。 下限は H(p)H(p) です。ノイズのあるデータで損失が0に張り付いたら、汎化ではなく暗記を疑います。
  3. 損失値をタスク間で比較しない。 クラス数が違えば基準線が違います。10択のランダム推測は log102.30\log 10 \approx 2.30、5万語彙なら約10.8。まず logN\log N と比べるのが作法です。
  4. 出力確率を鵜呑みにしない。 深層モデルは過信しがちで、0.99と出しても実際の正解率がそこに届かないことがあります。しきい値で自動判定する運用なら、検証データでのキャリブレーション確認が要ります。

面接で問われる形。 「交差エントロピーとKL情報量の関係は」には、式(4)を書いて「差は H(p)H(p) という定数だから最小化問題として等価」と答えます。「なぜ分類にMSEを使わないのか」には式(6)と飽和の話を出します。

まとめ

情報理論の全体像は情報理論とAIにまとまっています。

コメント

コメントにはログインが必要です