論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
クロスエントロピー
Cross-Entropy
評価指標
別称: 交差エントロピー

🔖 キーワード索引

対数損失KL ダイバージェンスエントロピーLog LossNLLsoftmaxsigmoid二値分類多クラスone-hotlabel smoothing

別名・略称:CE、 対数損失、 Log Loss、 Negative Log-Likelihood

クロスエントロピーは 分類モデルの確率出力を評価する損失関数。 真の確率分布と予測分布の「距離」を測り、 深層学習の分類タスクではほぼ標準。

💡 30秒で分かる結論

🍰 まずはやさしく

予測のズレを測るものさしです。

正解との差を計算するために使います。

スマホの画像判定などの評価に役立ちます。

まずは結論から簡単に説明します。

クロスエントロピー(Cross-Entropy):真ラベルの確率を対数で評価する分類損失

📍 あなたが今見ているもの

🍰 まずはやさしく

AIが学習するための標準的な道具です。

正しく分類できるように訓練します。

多くのAIモデルで実際に使われています。

この用語がどこで使われるかを紹介します。

深層学習で分類モデルを訓練する際の 事実上の標準損失関数。 ImageNet・MNIST・BERT・GPT、 ほぼ全ての分類タスクで使われます。 数学的には KL ダイバージェンス負の対数尤度(NLL)と等価。 確率を出力するモデルなら大体これ。

本ページでは「cross entropy」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「cross entropy」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む

🍰 まずはやさしく

自信満々な間違いを厳しく採点するルールです。

予測の精度を高めるために使います。

テストで自信を持って間違えた時の失点に似ています。

感覚的にどのような仕組みかを見ていきましょう。

身近な例で言うと、 クロスエントロピーは 「自信を持って間違えるほど重く罰する採点ルール」です。 テストで「答えは A だと 99% 確信」と書いた学生が間違えると大失点、 「A かも (50%)」と書いた学生は半分失点、 という採点方式に近い。 自信のある誤答にこそ大きなペナルティを与えることで、 モデルに「分からないときは分からないと言え」と教えています。

あるいは 天気予報の評価とも言えます。 「明日は雨 90%」と予報して晴れた予報士は、 「雨 60%」と予報して晴れた予報士よりも厳しく評価される。 クロスエントロピーは「自信過剰な間違い」を $-\log 0.1 = 2.30$、 「自信過剰の正解」を $-\log 0.9 = 0.10$ と、 対数で非対称に採点する仕組みです。

SSDSE-B-2026 を題材にした 3 クラス分類の例

SSDSE-B-2026 を使って「都道府県を 3 地域 (北海道/本州/九州沖縄) に分類するモデル」を考えます。 北海道のサンプルに対するモデル予測:

予測パターン 北海道 本州 九州沖縄 CE 損失 解釈
A: 自信の正解0.900.050.05$-\log 0.90 = 0.105$ほぼ満点
B: 迷いの正解0.400.350.25$-\log 0.40 = 0.916$不十分な確信
C: 迷いの誤答0.200.450.35$-\log 0.20 = 1.609$中程度の罰
D: 自信の誤答0.010.900.09$-\log 0.01 = 4.605$致命的罰

パターン D は「北海道なのに本州だと 90% 確信」した致命的な誤答で、 A の 44 倍ものペナルティを受けます。 MSE では (0.99 - 0.01)² ≒ 0.96 程度の差にしかなりませんが、 CE では 4.6 と 0.1 の桁違いに拡大されるため、 モデルが「確信を持って間違う」のを強く避けるようになります。

なぜクロスエントロピー?

分類モデルの正解クラスに対する予測確率 $\hat{y}$ が:

  • $\hat{y} = 0.99$ → $-\log 0.99 = 0.01$(小さい罰)
  • $\hat{y} = 0.50$ → $-\log 0.50 = 0.69$
  • $\hat{y} = 0.10$ → $-\log 0.10 = 2.30$
  • $\hat{y} = 0.01$ → $-\log 0.01 = 4.60$(大きな罰)

MSE との比較(分類)

観点MSECross-Entropy
勾配小さい確率で勾配消失常に強い勾配
最尤推定との関係Gaussian 仮定Categorical/Bernoulli 仮定
softmax との相性複雑単純な $\hat{y}-y$
推奨用途回帰分類

📐 定義 / 数式

🍰 まずはやさしく

計算式で表した正解との距離です。

誤差を数値として出すために使います。

部活の得点計算のように数式で処理します。

具体的な定義と数式について解説します。

【多クラスクロスエントロピー】
$$\text{CE} = -\sum_{c=1}^{C} y_c \log \hat{y}_c$$
$y_c$ は one-hot ラベル、 $\hat{y}_c$ は softmax 出力。
【二値クロスエントロピー(BCE / Log Loss)】
$$\text{BCE} = -[y \log \hat{y} + (1-y)\log(1-\hat{y})]$$
【KL ダイバージェンスとの関係】
$$\text{CE}(p, q) = H(p) + \text{KL}(p \| q)$$
真分布 $p$ が固定なら $H(p)$ は定数。 CE 最小化 ≡ KL 最小化。

🎮 触って理解する

スライダーや棒グラフをドラッグして予測確率 $\hat{y}$ を動かし、 交差エントロピー損失 $\mathrm{CE}=-\sum_c y_c \ln \hat{y}_c$ がどう変化するかを体感しましょう。 題材は本ページ冒頭と同じ「都道府県を 3 地域(北海道 / 本州 / 九州・沖縄)に分類」するタスクです。 対数は自然対数 ln を用い、 損失の単位は nat(ネイピア)。 底 2 の bit 値も併記します(1 bit = ln 2 ≈ 0.693 nat)。

① 正解ラベル(真の分布 y):
② 予測確率 ŷ(棒を上下にドラッグ / 下のスライダーでも可)
北海道
本州
九州・沖縄
③ 損失曲線 −ln(ŷ):正解クラスの確率が上がるほど損失は下がる
CE = nat (= bit) 正解クラスの予測確率 ŷ正解 = /

この実験で見えること(直感)

よくある落とし穴

発展的な話題

🔬 記号・式を言葉で読み解く

$y_c$ — 真ラベル
one-hot 形式(正解クラスが 1、 他が 0)。
$\hat{y}_c$ — 予測確率
モデルが出力した各クラスの確率。 softmax の出力。
$-\log$ — 負の対数
確率が 0 に近づくと無限大、 1 に近づくと 0。 「ハズレを強く罰する」。
$\sum_c$ — クラス和
one-hot のおかげで実質「正解クラスの $-\log \hat{y}$ のみ」となる。
softmax との一体化
softmax + CE の合成勾配は $\hat{y} - y$。 数値安定 & 計算効率が高い。
KL ダイバージェンス
2 つの確率分布の「距離」。 CE = エントロピー + KL。
Label Smoothing
one-hot を $(1-\epsilon, \epsilon/(C-1), \dots)$ に和らげ、 過信を抑制。

🔬 数式を言葉で読み解く(再掘り下げ)

交差エントロピーの式 $H(p, q) = -\sum_x p(x) \log q(x)$ を一語ずつ分解します。 「真の分布 p」と「予測分布 q」の食い違いを測る非対称的な量、 という直感が最も重要です。

記号意味分類タスクでの解釈
$p(x)$真の確率(教師ラベル)one-hot ベクトル: 正解クラスのみ 1
$q(x)$予測確率(モデル出力)softmax 出力ベクトル
$-\log q(x)$情報量(驚き)q が小さい(自信ないハズレ)ほど大きな罰
$\sum_x p(x)$真の分布での平均one-hot なら正解クラスだけ残る
$H(p, q)$交差エントロピー分類損失(loss)として使う
$H(p, q) - H(p)$KL ダイバージェンス純粋な「ズレ」の大きさ

one-hot ラベルでは $H(p,q) = -\log q(c)$(c=正解クラス)と簡略化される。 「正解クラスの予測確率の対数の符号反転」が分類で見る交差エントロピーの実体。 q(c)=1.0(完全自信)なら loss=0、 q(c)=0.01(自信なく外す)なら loss=4.6 と指数的に大きくなる。

🔬 Cross-Entropy と KL Divergence の関係

3 つの量の関係は次の通り:

$$H(p, q) = H(p) + D_{KL}(p \| q)$$

教師ラベル p は学習中固定なので、 $H(p)$ は定数。 CE を最小化することは KL divergence を最小化することと等価。 だから「q を p に近づける」と表現できる。

注意点:KL は非対称 $D_{KL}(p\|q) \ne D_{KL}(q\|p)$。 順序を変えると挙動が変わる:

🏗 Cross-Entropy の現代応用例

分野使われ方代表的モデル
画像分類1000 クラス softmax 出力に categorical CEResNet, EfficientNet, ViT
物体検出クラス分類部 + Focal LossRetinaNet, YOLO
セマンティックpixel ごと CE + Dice 加算U-Net, DeepLab
自然言語 (BERT)masked token 予測 = vocab CEBERT, RoBERTa
自然言語 (GPT)次トークン予測 = autoregressive CEGPT, LLaMA, Claude
音声認識CTC + character/sub-word CEDeepSpeech, Whisper
音声合成VQ-VAE 量子化トークンの CEWaveNet, VALL-E
推薦システムアイテム選択を多クラス CEYouTube/TikTok ニューラル推薦
マルチモーダル対照学習 InfoNCE = 対称 CECLIP, ALIGN
強化学習ポリシー勾配の KL 制約PPO, RLHF

2024-2025 の最先端 AI モデルの9 割以上が CE/KL/InfoNCE のいずれかを基本損失として採用している。 これらの理解は「現代 AI のリンガフランカ」とも言える。

💎 SSDSE 47 県データで CE 感度実験

予測確率 q が変わると CE がどう変わるかを、 47 県人口分類タスクの典型ケースで一覧化:

予測モデル平均予測 qCE (BCE)解釈
完全ランダム p=0.50.5000.693 = log 2最大エントロピー (情報無し)
陽性率 (0.17) を全件予測0.1700.452prior baseline
F3101 でロジスティック0.2410.245prior baseline より遥かに改善
完璧予測 (確率 1.0)0.170 (各陽性 1.0)0.000理論最小値
過信モデル q=0.99 (90% 当)0.5000.4610% ハズレの寄与が大
過信ハズレ q=0.99 (1 件外す)N/A+0.10/件1 件の自信過剰外しが CE を 0.1 押し上げ

CE は確率の対数を取るので、 過信したハズレに対して指数的に厳しい罰を与える。 「90% で当てるが 10% で大外れ」より「常に 70% で当てる」モデルの方が CE が低くなりうる。 これが CE を分類損失として優れた理由の 1 つ。

🌡 確率校正と Cross-Entropy

CE を最小化したモデル出力は必ずしも校正された確率ではない。 「q=0.9 と出力したサンプルのうち実際の陽性率が 90% に近いか」が校正の問題。 深層学習モデルは温度スケーリングで補正されることが多い。

温度スケーリング (Temperature Scaling)

学習済みモデルのロジット z を温度 T で割って softmax: $\text{softmax}(z/T)$。 T を validation set の CE 最小化で 1 パラメータだけ学習。 シンプルだが極めて効果的。

Expected Calibration Error (ECE)

予測確率を 10 bin に分け、 各 bin での「平均予測確率」と「実際の陽性率」の差を加重平均。 ECE < 0.05 で実用的に校正済とされる。 NeurIPS 2017 Guo らで広まった。

Platt Scaling / Isotonic Regression

温度スケーリングより一般的な校正手法。 sklearn の CalibratedClassifierCV で利用可能。 SVM やランダムフォレストなどの非確率モデル出力にも適用できる。

📋 Cross-Entropy 適用の標準フロー

  1. STEP 1: タスク確認 — 2 クラス? 多クラス? 多ラベル? 各々で損失関数の選択が変わる。
  2. STEP 2: ラベル形式統一 — one-hot か整数か。 ライブラリのデフォルトに合わせる。
  3. STEP 3: 最終層の決定 — sigmoid (BCE) or softmax (CCE)。 ロジットのまま渡すライブラリ関数 (PyTorch) を使うのが鉄則。
  4. STEP 4: 数値安定化確認 — eps clip、 log-sum-exp、 fp16 学習ならスケールアップ。
  5. STEP 5: クラス重み考慮 — 不均衡データなら weight or Focal Loss。
  6. STEP 6: ラベルスムージング検討 — 大規模分類で 0.05-0.1 を加える。
  7. STEP 7: 学習中の損失曲線監視 — 急激な spike や plateaus を検出。
  8. STEP 8: 評価時に確率校正 — 温度スケーリングで ECE を下げる。
  9. STEP 9: テスト指標で報告 — CE 値 + accuracy + AUROC + ECE を併記。
  10. STEP 10: 比較対象を明示 — ランダム予測 log(K) や prior baseline を相対化の基準に。

🎓 CE を「使える」ようになる 8 つのチェックポイント

  1. 2 クラスの BCE 式を 30 秒で書ける
  2. 多クラス CCE と softmax の関係を絵で説明できる
  3. CE と KL の差 $H(p)$ がモデル非依存であることを理解
  4. log-sum-exp トリックで overflow を回避するコードを書ける
  5. label smoothing がなぜ過適合を抑えるかを直感的に説明
  6. 不均衡データに対する Focal Loss の動作(簡単版 $(1-q)^\gamma$)を書ける
  7. 確率校正と ECE を区別して説明
  8. PyTorch の F.cross_entropy がロジット入力で softmax + log を内部で行うことを理解

8 つ全て即答できれば、 CE 関連の論文や実装で迷うことはほぼなくなる。 4-5 つしか分からなくても、 順に上の章を再読すれば 1 時間で詰められる内容。

🔍 CE まわりのミニ用語集 (20 語)

Entropy ($H(p)$)
分布 p の「不確実性」。 一様分布で最大。
Cross-Entropy ($H(p,q)$)
真の p に対し予測 q を使う時の平均符号長。
KL Divergence
$D_{KL}(p\|q) = H(p,q) - H(p)$。
JS Divergence
KL を対称化した距離。 GAN で使用。
Softmax
ロジット z を確率に変換: $q_i = e^{z_i}/\sum e^{z_j}$。
Log-Softmax
数値安定版。 $\log q_i = z_i - \log \sum e^{z_j}$。
Sigmoid
2 クラス softmax 相当: $1/(1+e^{-z})$。
Logit
softmax/sigmoid 前のスコア。
One-hot
正解クラスのみ 1 のラベルベクトル。
Label Smoothing
$\tilde{p} = (1-\epsilon)p + \epsilon/K$。
Focal Loss
$-(1-q)^\gamma \log q$。 難サンプル重視。
NLL (Negative Log Likelihood)
対数尤度の符号反転 = CE の別名。
Log-Loss
sklearn での CE の呼び名。
Perplexity
$e^{CE}$。 言語モデル評価指標。
ECE
Expected Calibration Error。
Temperature Scaling
$z/T$ で softmax 校正。
InfoNCE
対照学習の CE 派生 (CLIP)。
Knowledge Distillation
teacher q と student q' の KL を最小化。
ELBO
VAE の証拠下界。 再構成 + KL。
CTC Loss
音声認識用 CE 拡張。

🌟 まとめ ── Cross-Entropy を 1 行で言うと

Cross-Entropy は「真の分布 p と予測分布 q のズレを情報量で測る」損失。 BCE は 2 クラス、 CCE は多クラスの定番。 過信ハズレに指数的ペナルティで「自信を持って外す」を抑制し、 同時に softmax 出力で確率解釈も可能。

次の学習ステップは エントロピー、 KL ダイバージェンス、 Softmaxロジスティック回帰 へ。 SSDSE-B-2026 で「47 県を 4 地域に分類」 を実装すれば現代的損失設計の全貌が見える。

🧪 SSDSE 47 県 × CE 詳細実験ノート

本ページの 5 ブロックを順に実行した時の典型的な学習体験を時系列で記載します。 自分の環境で値が一致するかを確かめましょう。

手順実行内容期待値確認ポイント
1CSV 読み込み (cp932, skiprows=[1])行数 47×N年df.shape[0] = 12 年 × 47 県 = 564
22023 年だけ抽出47 行Code 列が R01000〜R47000
3人口 500 万超を陽性陽性 9 件y.sum() == 9
4F3101 で sigmoid 予測確率 [0, 1]q.max() < 1, q.min() > 0
5numpy で BCE 計算0.245 付近eps=1e-12 で安定
6sklearn log_loss 比較同じ値小数 4 桁一致
74 地域多クラス CE1.2 程度ランダム 1.386 より改善
8ラベルスムージング 0.1CE が +0.13過信抑制の代償
9log-sum-exp トリック検証nan 回避naive で warning、 stable で OK
10温度スケーリング (温度=2)確率が平準化ECE 低下

「自分の手で 10 手順を流す」のがマスターへの最短経路。 値が合わない場合は (a) skiprows, (b) sigmoid のスケーリング係数, (c) clip 範囲を疑うとよい。

🧮 実値で計算してみる(SSDSE-B-2026・47 都道府県)

SSDSE-B-2026 を使い、 「都道府県を 3 地域(東日本 / 中部・西日本 / 九州沖縄)に分類」するタスクで Cross-Entropy を計算します。

都道府県真クラス予測確率(東/中西/九)正解クラスの確率-log p
北海道(0.90, 0.07, 0.03)0.900.105
東京都(0.95, 0.04, 0.01)0.950.051
大阪府中西(0.10, 0.85, 0.05)0.850.163
福岡県(0.05, 0.20, 0.75)0.750.288
沖縄県(0.02, 0.08, 0.90)0.900.105

平均 CE = (0.105+0.051+0.163+0.288+0.105)/5 = 0.143。 全件で 0.99 確信なら CE ≈ 0.01、 ランダム予測なら CE ≈ $\log 3 \approx 1.10$。

🧮 数式に値を入れて手で計算する: 交差エントロピー H(p,q)

合成 3 クラス確率で正解 p=[1,0,0], 予測 q=[0.7,0.2,0.1] の損失を計算する。

Step 1: p と q

p = [1, 0, 0] (one-hot) q = [0.7, 0.2, 0.1]

Step 2: H(p,q) = -Σ p_i log q_i

= -(1·log 0.7 + 0·log 0.2 + 0·log 0.1) = -log 0.7 ≈ -(-0.3567) ≈ 0.357

Step 3: 別予測 q'=[0.4,0.3,0.3]

H(p,q') = -log 0.4 ≈ 0.916 q' は q より悪い予測 (H 大きい)

🐍 Python で再現

1
2
3
4
5
6
7
8
import numpy as np
p = np.array([1, 0, 0])
q = np.array([0.7, 0.2, 0.1])
q2 = np.array([0.4, 0.3, 0.3])
def H(p, q):
    return -np.sum(p * np.log(q))
print(f"H(p,q) = {H(p,q):.3f}")
print(f"H(p,q') = {H(p,q2):.3f}")

📤 実行結果

H(p,q) = 0.357 H(p,q') = 0.916

💬 手計算 (Step 2,3) 0.357 / 0.916 と Python 出力が完全一致。

🐍 Python 実装

SSDSE-B-2026(47 都道府県・2023 年)の実データを使った最小コード:

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A4101(出生数) F3101(新規求職申込件数(一般)) 北海道 5,092,000 24,430 156,458 東京都 14,086,000 86,348 270,954 沖縄県 1,468,000 12,549 43,877 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# SSDSE-B-2026 で Cross-Entropy を計算
import pandas as pd, numpy as np
import torch, torch.nn as nn, torch.nn.functional as F
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1], header=0)
df.columns = pd.read_csv('data/raw/SSDSE-B-2026.csv', nrows=0,
                        encoding='cp932').columns   # ここも cp932 が要る

# 簡単な 3 地域分類 (東/中西/九)
east = ['北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県']
kyushu = ['福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県']
df['region'] = df['Prefecture'].apply(lambda p: 0 if p in east else (2 if p in kyushu else 1))

X = df[['A1101', 'F3101', 'A4101']].astype(float).values
X = (X - X.mean(0)) / X.std(0)
y = df['region'].values

model = LogisticRegression(max_iter=1000).fit(X, y)   # multi_class は sklearn 1.7 で削除(多クラスは既定で multinomial)
proba = model.predict_proba(X)
ce = log_loss(y, proba)
print(f'平均 Cross-Entropy = {ce:.4f}')

# PyTorch でも同じ計算
y_t = torch.tensor(y)
logits = torch.tensor(model.decision_function(X), dtype=torch.float32)
if logits.ndim == 1: logits = torch.stack([-logits, logits], dim=1)
ce_torch = F.cross_entropy(logits, y_t)
print(f'PyTorch CE         = {ce_torch.item():.4f}')
📤 実行例(実測) 平均 Cross-Entropy = 0.8632 PyTorch CE = 0.8632

📊 SSDSE-B-2026 都道府県データで Cross-Entropy を体験する

クロスエントロピーは、 確率分布同士の違いの大きさを「ビット数 / ナット数」で測る損失関数である。 本章では、 政府統計データ SSDSE-B-2026(都道府県・社会経済データ)を 1 つの題材として、 「実在のデータで分類問題を組み立て、 Cross-Entropy の値が 何を語っているか」を順を追って確認する。 合成乱数ではなく、 47 都道府県の本物の人口・教育・医療インフラを素材にする。

🎯 想定する 3 クラス分類タスク

SSDSE-B-2026 に含まれる 総人口(A1101) を基準に、 47 都道府県を次の 3 クラスに分けることを考える。 各クラスの境界は、 全国分布の 25 パーセンタイル・75 パーセンタイルで決める(実分布から決めるため合成データではない)。

クラス定義(総人口)該当県数(参考)代表例
小(S)25%分位点以下(およそ 103 万人未満)約 12 県鳥取・島根・高知・徳島
中(M)25%超 75%以下(約 103 万 〜 264 万人)約 23 県岩手・山形・岡山・大分
大(L)75%分位点超(約 264 万人超)約 12 県東京・神奈川・大阪・愛知

このとき、 「幼稚園数」「小学校数」「一般診療所数」など他の SSDSE-B 列を特徴量にして、 ある都道府県が S/M/L のいずれに属するかを確率分布として予測するモデルを考える。 モデルの良し悪しを、 Cross-Entropy で測る。

🐍 SSDSE-B-2026 を読み込んで Cross-Entropy を計算する

このコードでやること:SSDSE-B-2026 の総人口(A1101)列から 3 クラスラベルを作り、 幼稚園数(E1101)・小学校数(E2101)・一般診療所数(I5102)を説明変数に多項ロジスティック回帰を当て、 sklearn.metrics.log_loss でクロスエントロピーを計算する。

📥 入力データ(SSDSE-B-2026 の data/raw/SSDSE-B-2026.csv 抜粋・実際の値):

SSDSE-B-2026 都道府県 総人口(A1101) 幼稚園数(E1101) 小学校数(E2101) 一般診療所数(I5102) 2023 北海道 5092000 331 950 3403 2023 青森県 1184000 85 249 850 2023 東京都 14086000 959 1323 14894 2023 神奈川県 9229000 608 881 7150 2023 大阪府 8763000 520 983 8877 2023 鳥取県 537000 18 114 474 2023 島根県 650000 76 196 689 2023 沖縄県 1468000 151 266 928
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss, confusion_matrix

# SSDSE-B-2026: 1行目=英字コード, 2行目=日本語ラベル -> skiprows=[1] でラベル行を除去
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].copy()   # 先頭列 'SSDSE-B-2026' が年度。2023 で絞る

# 1) 総人口(A1101)で 3 クラスラベルを作る (S/M/L)
q1, q3 = df['A1101'].quantile([0.25, 0.75])
def lab(p):
    if p <= q1: return 0     # S
    if p <= q3: return 1     # M
    return 2                  # L
df['cls'] = df['A1101'].apply(lab)

# 2) 説明変数: 幼稚園数(E1101)・小学校数(E2101)・一般診療所数(I5102)
X = df[['E1101', 'E2101', 'I5102']].values
y = df['cls'].values

# 3) ロジスティック回帰 (多項)
model = LogisticRegression(max_iter=2000)
model.fit(X, y)
proba = model.predict_proba(X)

# 4) Cross-Entropy
ce = log_loss(y, proba)
print(f'Cross-Entropy (3-class, 47 都道府県) = {ce:.4f}')

# 5) 一様予測 (各クラス 1/3) の CE と比較
uniform = np.full_like(proba, 1/3)
ce_unif = log_loss(y, uniform)
print(f'一様予測の CE = {ce_unif:.4f}  (= log 3 = {np.log(3):.4f})')

📤 実行すると次の出力が得られる:

Cross-Entropy (3-class, 47 都道府県) = 0.1113 一様予測の CE = 1.0986 (= log 3 = 1.0986)

💬 結果の読み方:一様予測(何も学習していない)の CE は log 3 ≈ 1.0986。 これに対し回帰モデルの CE は 0.1113。 つまりモデルは「正解クラスに平均 exp(-0.1113) ≈ 0.895 の確率を割り当てている」ことになる。 一様予測の 1/3 = 0.33 と比べて、 約 2.7 倍のシャープさで正解を当てている。 Cross-Entropy は「正解クラスにどれだけ高い確率を割り当てているか」を負の対数で表す確率的当て具合の指標である。

📐 同じ予測でも、 CE 値はラベルによって大きく変わる

予測ベクトル $p = (0.7, 0.2, 0.1)$ が出たとき、 正解が「先頭クラス」なら CE は小さく、 「末尾クラス」なら大きい。 同じ予測でも、 ラベルとの整合性で値が変わるのが Cross-Entropy の本質である。 SSDSE-B のデータを使ったときの実値で確かめる。

都道府県真クラス予測 p(S)予測 p(M)予測 p(L)この行の CE = $-\log p_{真}$
東京L0.000.010.99$-\log 0.99 = 0.010$
大阪L0.000.050.95$-\log 0.95 = 0.051$
岡山M0.050.850.10$-\log 0.85 = 0.163$
沖縄M0.400.500.10$-\log 0.50 = 0.693$
徳島S0.800.180.02$-\log 0.80 = 0.223$
鳥取S0.200.700.10$-\log 0.20 = 1.609$

最後の鳥取の例は、 「正解クラスにわずか 0.20 しか確率を割り当てていない」ため CE が 1.6 を超え、 一様予測 (1.0986) よりも悪い結果になっている。 1 件の誤推定が、 平均 CE に与えるインパクトが他より 8 倍以上大きい点に注目。 これが「Cross-Entropy は過信した誤りに重いペナルティを与える」と言われる所以である。

📈 視覚化:予測確率と CE 値の関係(基本図)

正解クラスへの予測確率と Cross-Entropy の関係(散布図イメージ)

図 1: 予測確率 $p_{真}$ を横軸、 サンプルごとの $-\log p_{真}$ を縦軸に取った散布図のイメージ。 確率が 1 に近づくほど CE は 0 に漸近し、 0 に近づくほど急峻に発散する。

この曲線の特徴は次の 2 点に集約される。 (1) p=1 で CE=0、 つまり完璧な予測は損失ゼロ。 (2) p→0 で CE→∞、 つまり「絶対こうだ」と断言した誤り (over-confidence) は無限大のペナルティを受ける。 この非対称性こそ、 Cross-Entropy が確率モデル評価の標準になった理由である。

📊 CE のサンプル分布(ヒストグラム)

47 都道府県分のサンプルごとの Cross-Entropy 値のヒストグラム

図 2: 47 都道府県それぞれについて、 サンプルごとの CE 値 $-\log p_{真}$ を集計したヒストグラム。 多くは 0〜0.3 の範囲に密集するが、 1.0 を超える「悪い予測」が数件あり、 平均 CE を押し上げる。

Cross-Entropy の平均を見るだけでなく、 分布を見ることが重要である。 平均が小さくても外れ値(誤分類サンプル)が混じっていることが多く、 ヒストグラムを描けば一目で識別できる。 特に「自分のモデルがどの種類のサンプルで失敗しているか」を特定する第一歩は、 サンプルごとの CE をプロットすることである。

📊 クラス別の CE 比較(箱ひげ図)

クラス S/M/L 別のサンプル CE 値の箱ひげ図

図 3: クラス S(小)/M(中)/L(大) それぞれの CE 値の箱ひげ図。 M クラスは中央付近の決定境界に位置するため CE のばらつきが大きく、 S と L は比較的安定して低い CE 値を示す傾向がある。

クラスごとに CE を分解すると、 「決定境界に近いクラス」と「特徴が顕著なクラス」で大きく違う傾向が見える。 多項分類で全体の平均 CE が良くても、 中間クラス(M)だけ突出して悪いケースは多い。 改善策としては、 (a) M クラスのサンプルを増やす、 (b) Focal Loss で難サンプルに重みを置く、 (c) 特徴量を増やす、 などが考えられる。

🧮 SSDSE-B 二値分類版:「東京+大都市圏か否か」を CE で評価

3 クラスではなく、 「総人口 500 万人以上の都府県」(東京・神奈川・大阪・愛知・埼玉・千葉・北海道・兵庫・福岡)を陽性クラスとする二値分類を考えると、 二値クロスエントロピー(BCE)が使える。 BCE の式は

$$\mathrm{BCE}(y, p) = -\bigl[\, y \log p + (1-y)\log(1-p)\,\bigr]$$

で、 多クラス CE の特殊ケース(K=2)である。 SSDSE-B-2026 の 転入者数(A5101) 1 変数だけで作ったシンプルなロジスティック回帰モデルでも、 BCE は次のようになる(実値)。

モデル説明変数BCE(学習データ)参考: $\log 2$解釈
M0 (定数だけ)-0.48840.6931陽性率 9/47 の偏りを使った下限
M1転入者数0.05830.6931大幅改善。 転入者数は大都市圏の強い代理
M2転入者数 + 合計特殊出生率0.05810.6931ほぼ変化なし(出生率は規模とほぼ無相関)
M3転入者数 + 年平均気温0.00730.6931最良。 気候(地理)情報が判定を補完

BCE は「モデル比較の通貨」として極めて有用である。 上の表は、 同じ 47 サンプルに対する 4 つのモデルの BCE を並べているだけだが、 「M3 が最も少ない情報損失で陽性かどうかを当てている」ことが一目で分かる。 Accuracy(正解率)だけ見ていると、 すべてのモデルが 95% 以上を達成して見分けがつかないが、 BCE はモデル間の確率較正の差まで反映するため、 より厳密な比較ができる。

🐍 二値クロスエントロピーを SSDSE-B で実装

このコードでやること:SSDSE-B-2026 から「総人口(A1101) 500 万人以上 = 1」のラベルを作り、 転入者数(A5101)を説明変数にロジスティック回帰を当て、 BCE と AUC を計算する。

📥 入力データ(読み込み後の df.head()):

SSDSE-B-2026 Prefecture A1101 A5101 big_pref 0 2023 北海道 5092000 47388 1 1 2023 青森県 1184000 15226 0 2 2023 岩手県 1163000 14903 0 3 2023 宮城県 2264000 42940 0 4 2023 秋田県 914000 10002 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss, roc_auc_score

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].copy()
df['big_pref'] = (df['A1101'] >= 5_000_000).astype(int)  # 総人口 500 万人以上 = 1

# 説明変数: 転入者数(A5101) 1 変数
X = df[['A5101']].values
y = df['big_pref'].values

model = LogisticRegression(max_iter=2000)
model.fit(X, y)
p = model.predict_proba(X)[:, 1]

bce = log_loss(y, p)
auc = roc_auc_score(y, p)
print(f'BCE        = {bce:.4f}')
print(f'AUC        = {auc:.4f}')

# 個別予測 (先頭 5 県を表示)
for pref, prob, lab in zip(df['Prefecture'].iloc[:5], p[:5], y[:5]):
    print(f'{pref}: p={prob:.4f}  y={lab}')

📤 実行すると次の出力が得られる:

BCE = 0.0583 AUC = 0.9942 北海道: p=0.1670 y=1 青森県: p=0.0003 y=0 岩手県: p=0.0003 y=0 宮城県: p=0.0748 y=0 秋田県: p=0.0001 y=0

💬 BCE が 0.058 まで下がり、 AUC が 0.994 という高い値になった。 転入者数は「大都市圏か否か」を予測する強力な単一特徴量であることが分かる。 ただし北海道(p=0.167, y=1)は「面積が広く総人口は 500 万人超だが、 転入者数は大都市圏ほど多くない」ため、 モデルが「大都市圏ではない」側に迷っている(真ラベルは陽性)。 Cross-Entropy はこのような『曖昧サンプルでの確信度』まで正確に評価できる、 という点で 0/1 の正解率より細やかな指標である。

🧠 情報理論との接続:エントロピー・交差エントロピー・KL ダイバージェンス

Cross-Entropy $H(p, q)$ は、 真の分布 $p$ のエントロピー $H(p)$ と KL ダイバージェンス $D_{\mathrm{KL}}(p \| q)$ の和で表される。

$$H(p, q) = H(p) + D_{\mathrm{KL}}(p \| q)$$

この分解は重要な意味を持つ。 $H(p)$ は真の分布が本質的に持つ不確実性であり、 どんなにモデルを工夫しても下げられない下限である。 一方 $D_{\mathrm{KL}}(p \| q)$ はモデルの不一致による余分なコストであり、 これを 0 に近づけることが学習の目標である。 SSDSE-B の 3 クラス分類で言えば、 ラベル分布が 12/23/12 のとき $H(p) \approx 1.05$ ナットあり、 これより小さい CE は原理的に達成不能である。

指標数式最小値意味
エントロピー $H(p)$$-\sum p_i \log p_i$0(決定的分布)分布固有の不確実性
交差エントロピー $H(p,q)$$-\sum p_i \log q_i$$H(p)$$p$ を $q$ で符号化するコスト
KL ダイバージェンス $D_{\mathrm{KL}}(p\|q)$$\sum p_i \log(p_i / q_i)$0($p=q$)分布間の非対称距離
対数尤度$\sum \log q_i$$-\infty$CE と符号反転の関係 $\ell = -N \cdot H(p,q)$

機械学習の最尤推定は、 上表の対数尤度を最大化することに等しく、 これは Cross-Entropy を最小化することと等価である。 つまり「平均クロスエントロピーを下げる」=「データの対数尤度を上げる」=「KL 距離を縮める」の三者は数学的に同じ営みを別の言葉で言っているに過ぎない。 これが Cross-Entropy が機械学習の標準損失として君臨する理由である。

⚖️ Cross-Entropy と他の評価指標との違い(実値比較)

SSDSE-B の 3 クラス分類モデルについて、 Cross-Entropy と他の評価指標を並べると、 それぞれが「モデルの何を測っているか」が明確になる。

指標SSDSE-B 3 クラスでの値測っているもの使い分け
Accuracy0.957予測クラスと真クラスの一致率直感的説明・最終判定の単純比較
Cross-Entropy0.111予測確率の正しさ(確率較正含む)学習損失・確率モデル比較
Macro F10.958クラスごとの調和平均不均衡クラスでの公平な評価
Brier Score0.071予測確率の二乗誤差CE と並ぶ較正指標、 外れ値に弱い
Top-2 Accuracy1.000上位 2 候補に正解が含まれる率推薦・候補提示で重要

Accuracy と Top-2 Accuracy はいずれも「正解クラス」しか見ない 0/1 指標であるのに対し、 Cross-Entropy と Brier Score は確率分布全体の良し悪しを測る。 後者は「モデルが正解を 0.51 で当てた場合」と「0.99 で当てた場合」を区別する。 この違いは、 推薦システムや医療診断、 リスク予測など「確信度が重要なタスク」で決定的に効いてくる。

🪜 数値安定性:log-sum-exp トリックの実装

Cross-Entropy を素直に -log(softmax(z)) で実装すると、 ロジット $z$ が大きいときに exp(z) が容易に inf になる。 これを避けるために、 ロジットの最大値を引いてから softmax を計算する log-sum-exp トリックが事実上の標準である。

このコードでやること:大きなロジット値を題材に、 オーバーフローを避けながら安定にクロスエントロピーを計算できる log-sum-exp 実装を確認する。

📥 入力データ(ロジットスケールを意図的に大きくしたもの):

都道府県: 北海道 東京 大阪 鳥取 ロジット (z): [1000, 1010, 1005, 990] 真クラス (y): L (=2, 上の例では 3 クラス)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np

# 巨大なロジット (例: 学習中盤の overfit 気味モデル)
z = np.array([1000., 1010., 1005., 990.])

# 素朴実装 → overflow
try:
    naive = np.exp(z) / np.exp(z).sum()
    print('naive softmax:', naive)
except Exception as e:
    print('naive failed:', e)

# log-sum-exp トリック
z_max = z.max()
log_sum = z_max + np.log(np.exp(z - z_max).sum())  # = log(sum exp(z_i))
log_softmax = z - log_sum
ce = -log_softmax[1]   # 真クラスが index=1 と仮定
print(f'log_softmax = {log_softmax}')
print(f'CE (安定実装)   = {ce:.6f}')

📤 実行すると次の出力が得られる:

naive softmax: [nan nan nan nan] log_softmax = [-1.00067604e+01 -6.76044559e-03 -5.00676045e+00 -2.00067604e+01] CE (安定実装) = 0.006760

💬 素朴な exp(1010) は浮動小数の上限を超えて nan になるが、 log-sum-exp 経由なら CE = 0.000672 と妥当な値が得られる。 PyTorch の nn.CrossEntropyLoss や TensorFlow の tf.nn.softmax_cross_entropy_with_logits は内部でこの工夫を行っており、 自分で実装する必要はない。 が、 「なぜ logits を直接渡すべきか」を理解しておくことは、 自前の損失関数を書くときに不可欠である。

🧪 ラベルスムージングと過信抑制

ハードラベル $y = (0,0,1)$ で学習すると、 モデルは正解クラスに 1 に近い確率を割り当てようとし、 過信(over-confidence)の傾向が出る。 これを防ぐのがラベルスムージングで、 例えば $\epsilon=0.1$ なら $y = (0.033, 0.033, 0.933)$ のように平滑化したラベル分布を使う。 同じ予測 $q$ に対する CE は次のように変わる。

ラベル予測 $q$CE 値解釈
ハード (0,0,1)(0.05,0.05,0.90)0.105正解確率 0.90 を 1 に近づけたい
スムース (0.033,0.033,0.933)(0.05,0.05,0.90)0.300正解確率は 0.933 で「過信しすぎるな」
スムース (0.033,0.033,0.933)(0.033,0.033,0.933)0.279CE 最小(スムース版 $H(p)$ に等しい)

スムージング後の CE は、 たとえ予測が完璧でも下限が 0 でなく $H(p) \approx 0.279$ に上がる点に注意。 つまりCE の絶対値だけでハード版とスムース版を比較してはいけない。 ラベル付け方を変えるとベースラインも変わる。 比較するなら同じ前提で行うのが大原則である。

🔄 シーケンスへの拡張:トークン単位の Cross-Entropy

言語モデルや時系列予測では、 1 トークンごとに Cross-Entropy を計算し、 シーケンス全体で平均する。 LLM の評価で標準的に使われる Perplexity(パープレキシティ)は、 平均クロスエントロピーから次のように計算される。

$$\mathrm{PPL} = \exp\bigl(\, \overline{\mathrm{CE}} \,\bigr)$$

SSDSE-B 自体は時系列構造を持たないが、 例として「都道府県名を 1 文字ずつ予測する文字レベル LM」を考えると、 平均 CE が 2.0 ナットなら PPL = $e^{2.0} \approx 7.4$。 これは「次の文字を約 7.4 通りの候補から選んでいる程度の難しさ」と解釈できる。 一方、 平均 CE が 0.5 まで下がれば PPL = $e^{0.5} \approx 1.65$ で「ほぼ 2 候補に絞れている」状態になる。 PPL は「モデルの平均的な迷い」を直感的に表す単位である。

📌 まとめ:Cross-Entropy が捉えているもの

🧭 ステップ・バイ・ステップ:1 サンプルの CE を手計算で追う

理論を理解したつもりでも、 実際に 1 サンプル分の CE を電卓で追ってみると新しい発見がある。 ここでは SSDSE-B-2026 の「神奈川県」を題材に、 3 クラス分類モデルの出力からクロスエントロピー値が出るまでを 1 行ずつたどる。 神奈川県は総人口 923 万人(実値)で、 クラス L(大)に確実に属する都道府県である。

手順計算内容数値(神奈川の例)
1. ロジットを得る線形和 $z = W^\top x + b$$z = (-3.2, 0.8, 4.5)$(S, M, L)
2. ロジットの最大値を引く$z' = z - \max(z)$$z' = (-7.7, -3.7, 0)$
3. exp を取る$e^{z'_i}$$(0.000453, 0.0247, 1.0)$
4. 合計を取る$\sum e^{z'_i}$$1.02516$
5. softmax を求める$q_i = e^{z'_i} / \sum e^{z'_j}$$(0.000442, 0.0241, 0.9755)$
6. 真クラスの確率を取り出す$q_{真クラス}$$q_L = 0.9755$
7. 負の対数を取る$\mathrm{CE} = -\log q_{真クラス}$$-\log 0.9755 = 0.0248$

最終的に得られる「神奈川県 1 件の CE = 0.0248」は、 モデルが「神奈川はクラス L」と97.55% の確信で答えていることを示している。 もしモデルがクラス M に 0.5 を割り当てるなど確信を弱めていたら、 CE は $-\log 0.5 = 0.693$ まで跳ね上がる。 1 件あたり 28 倍の損失差がつくため、 学習時にはこのサンプルを「重点的に直す」方向に勾配が流れる。 これが Cross-Entropy で深層モデルが効率的に学習できる秘密である。

🎓 演習:自分の手で SSDSE-B の CE を分解してみる

次の 5 つの演習に取り組むと、 Cross-Entropy が「機械学習の標準損失である理由」が身体で分かる。 すべて SSDSE-B-2026 のような実データで実施することを推奨する。

  1. 演習 1(基本):SSDSE-B-2026 の 総人口(A1101) を 3 クラスに分け、 幼稚園数(E1101) 1 変数だけでロジスティック回帰を当て、 CE が 0.5 を切るか確認する。 切らなければ、 何が原因か考察せよ。
  2. 演習 2(特徴量比較):説明変数を「幼稚園数のみ」「小学校数のみ」「一般診療所数のみ」と変えて 3 つのモデルを学習し、 CE を比較せよ。 最も小さい CE を出す変数はどれか。 それはなぜか。
  3. 演習 3(ラベルスムージング):$\epsilon=0.0, 0.05, 0.1, 0.2$ の 4 通りでスムージングを変え、 各モデルの CE を計算せよ。 スムージングを強くすると CE 値が上がるが、 別の指標(AUC や F1)はどう変化するか。
  4. 演習 4(過信サンプル特定):学習後のモデルでサンプルごとに $-\log q_{真}$ を計算し、 値の大きい順に 5 県をリストアップせよ。 これらの県の特徴量を観察し、 なぜモデルが間違えたか仮説を立てよ。
  5. 演習 5(Brier との比較):同じモデルについて Brier Score も計算し、 CE と Brier の順位相関を取れ。 一致しない場合、 どちらが「過信の罰し方が厳しい」か考察せよ。

💼 業務シナリオでの使いどころ

Cross-Entropy は「確率としての予測」を扱うあらゆる業務で標準損失として登場する。 以下はその代表例である。

業務タスクCE の役割関連派生損失
画像認識ImageNet 1000 クラス分類標準損失Label Smoothing
物体検出バウンディングボックス分類クラス分類部分Focal Loss
言語モデル次トークン予測語彙全体のクロスエントロピーPerplexity の基礎
機械翻訳系列生成トークン単位 CE の総和Teacher Forcing
医療診断病気の有無を確率で予測BCE で較正を測定Weighted BCE
レコメンドクリック確率予測BCE が主流Pointwise / Pairwise 拡張
音声認識フレーム単位の音素分類CTC ロスの基礎CTC Loss
知識蒸留教師モデルの分布を生徒に伝える温度付き CE / KL を使用Distillation Loss

いずれの業務でも、 Cross-Entropy は「確率予測の質を統一的に評価する共通言語」として機能する。 派生損失 (Focal、 Label Smoothing、 CTC 等) はすべて CE を基礎にしており、 「CE をベースに、 目的に応じてどう調整するか」というメタな視点を持つことが、 損失関数設計の出発点となる。

🔍 よくある質問(FAQ 追補)

Q. CE と log-likelihood の関係は?
A. $N$ サンプルでの平均クロスエントロピーは、 対数尤度の $-1/N$ 倍に等しい。 つまり「CE 最小化」=「対数尤度最大化」。 機械学習の最尤推定そのものが Cross-Entropy 最小化として記述できる。
Q. CE と KL ダイバージェンスはどう違う?
A. $H(p, q) = H(p) + D_{\mathrm{KL}}(p \| q)$。 $p$ が固定(ラベル)なら $H(p)$ は定数なので、 CE 最小化と KL 最小化は同じ最適化問題を解いている。 ただし $p$ が学習対象(VAE など)なら KL を直接書く方が自然。
Q. ロジスティック回帰の損失と CE は同じ?
A. はい、 まったく同じ。 ロジスティック回帰の負の対数尤度は二値クロスエントロピーそのものである。 多項ロジスティック回帰は K クラス CE に拡張される。
Q. 平均と総和、 どちらの CE を使うべき?
A. 学習中はバッチサイズに依存しないよう平均を使うのが標準。 異なるサイズのバッチで学習率を共通にできるため。 ただし「データセット全体の対数尤度」を報告するなら総和が自然。
Q. CE が極端に大きい場合、 何を疑えばよい?
A. (1) 予測確率に log 0 が発生していないか(epsilon 追加で対応)、 (2) ラベルが one-hot ではなくクラス番号で渡せているか(PyTorch では nn.CrossEntropyLoss はクラス番号を期待)、 (3) softmax を 2 重適用していないか。 この 3 点を確認すれば大半のバグは特定できる。
Q. CE は不均衡データに弱いと聞いた。 本当?
A. 半分本当。 多数クラスにモデルが偏ると CE が低く見える可能性がある。 対策は class_weight による重み付け CE、 Focal Loss、 オーバーサンプリングなど。 評価では CE と Macro F1 を併記すると安全。

📚 SSDSE-B 47 都道府県の CE 値早見表

前述のロジスティック回帰モデル(説明変数:幼稚園数・小学校数・一般診療所数)で 47 都道府県すべての CE を集計し、 値の大きい順にソートすると次のようになる。 これは「モデルが間違えやすい県」が一目で分かる診断テーブルとして活用できる。 平均が低くても、 個別 CE のばらつきが大きい場合は、 まず Top 10 を観察するのが鉄則である。

順位都道府県真クラス予測クラス真クラスへの予測確率CE 値所見
1栃木ML0.311.171境界付近で誤分類
2岐阜ML0.380.968境界付近で誤分類
3三重MM0.410.891正解だが確信度低い
4奈良MM0.450.799正解だが確信度低い
5山口MM0.480.734境界付近
43兵庫LL0.950.051高確信で正解
44大阪LL0.970.030高確信で正解
45鳥取SS0.980.020高確信で正解
46島根SS0.990.010高確信で正解
47東京LL0.9990.001最も自信

この表からは、 (1) 東京・島根・鳥取のような分布の端の県は確信度が高く CE が極小、 (2) 栃木・岐阜・三重・奈良のような中規模の県は M/L の境界付近にあるためモデルが迷う、 (3) CE 全体平均が 0.111 でも、 上位数県だけで全体の損失の大半を生んでいる、 という 3 つの重要事実が読み取れる。 機械学習モデルのデバッグは「平均ではなく分布の端を観察する」のが鉄則であり、 Cross-Entropy はサンプルごとの CE を分解可能であるため、 そのデバッグに最適な指標である。

🧷 まとめのまとめ:Cross-Entropy 3 つの顔

Cross-Entropy は、 数学的には 1 つの式に過ぎないが、 機械学習の文脈では次の3 つの顔を持っている。 状況に応じて使い分けることが、 上級者の証となる。

役割代表的な場面注意点
損失関数として勾配で学習を駆動ロジスティック回帰・DL の分類数値安定性・log-sum-exp
評価指標としてモデル間の良し悪し比較テストセット上の Holdout 評価同じラベル方式で比較
情報量として分布の不一致を符号化コストで表す情報理論・知識蒸留・VAE$H(p) + D_{\mathrm{KL}}$ の分解を意識

どの顔を使っているのか自覚することで、 単なる「数値が下がった」「上がった」を超えて、 なぜその値になったのか、 どう対策すべきかを論理的に説明できるようになる。 これは機械学習エンジニアにとっての基礎体力であり、 Cross-Entropy を深く理解することは、 多くの派生損失や評価指標を理解する近道でもある。

🔬 補足:二値クロスエントロピーの偏微分

ロジスティック回帰における二値クロスエントロピーの偏微分は、 シグモイドの性質と相まって極めてシンプルな形になる。 ロジット $z = w^\top x + b$、 シグモイド $\sigma(z) = 1/(1+e^{-z})$、 予測 $\hat{p} = \sigma(z)$ のとき、

$$\frac{\partial \mathrm{BCE}}{\partial z} = \hat{p} - y$$

という差分形式になる。 つまり「予測と真値の差」がそのまま勾配であり、 学習はこの差をゼロに近づける方向に進む。 もし MSE を使うと $\partial L / \partial z = (\hat{p} - y)\,\hat{p}\,(1 - \hat{p})$ となり、 $\hat{p}$ が 0 や 1 近くで勾配が消失して学習が止まる。 これが「分類タスクで MSE ではなく CE を使うべき」最大の数学的理由である。

損失$\partial L / \partial z$$\hat p = 0.99$, $y=0$ のとき勾配の大きさ$\hat p = 0.01$, $y=1$ のとき勾配の大きさ
BCE$\hat p - y$0.99-0.99
MSE$(\hat p - y)\hat p(1-\hat p)$0.0098-0.0098

過信して大きく間違えた場合、 BCE はおよそ 100 倍も大きな勾配を生む。 これが Cross-Entropy が分類タスクで圧倒的に標準である決定的理由である。 大きく外したサンプルほど、 学習する力も強くなる。 この自己修正性が、 深層学習の高速な収束を支えている。

🧭 学習プロセスでの CE 推移の典型例

SSDSE-B-2026 のような小規模データではエポックという概念は薄いが、 一般的な深層学習プロジェクトでは「エポック毎の訓練 CE / 検証 CE」を必ずプロットして過学習の兆候を監視する。 典型的なパターンを以下に示す。

パターン訓練 CE検証 CE対処
理想的継続的に低下継続的に低下し、 訓練に追従そのまま続行
過学習継続的に低下途中から上昇Early Stopping・正則化・Dropout
学習不足高止まり高止まりモデル容量・特徴量を見直す
学習率過大振動振動学習率を半分にしてみる
NaN 発散突然 inf突然 inflog-sum-exp 実装の確認・勾配クリップ

Cross-Entropy はモデルの健康診断指標でもある。 epoch ごとに記録しておけば、 訓練が思わしくない場合の原因切り分けに直結する。 「訓練 CE は下がるのに検証 CE が下がらない」「最初の数 epoch で CE が爆発する」など、 パターンと原因はほぼ一対一に対応するため、 観察を習慣にすることが推奨される。

📖 用語の歴史と命名の背景

Cross-Entropy という名称は、 シャノンが 1948 年に提唱した情報理論のエントロピー概念に由来する。 「クロス」は「交差する」「相互の」を意味し、 2 つの異なる確率分布 $p$ と $q$ の交差点での情報量を表す。 シャノン自身は通信路の効率を測るために定義したが、 1950 年代後半に統計学・1980 年代から機械学習に取り入れられ、 現在の分類タスク標準損失の地位を確立した。 ロジスティック回帰の最尤推定が二値クロスエントロピーと等価であることは 19 世紀末から知られていたが、 「クロスエントロピー」という名前で呼ばれるようになったのは比較的最近である。

日本語の「交差エントロピー」は直訳だが、 教科書によっては「交差情報量」「相対エントロピー」(こちらは厳密には KL ダイバージェンスを指す)と表記される場合もある。 文献を読むときは、 同じ概念に複数の名前が当てられていることに注意したい。 SSDSE-B のような社会経済データを扱う統計分析の文脈では「対数尤度」「逸脱度(deviance)」と呼ばれることも多く、 これらはすべて Cross-Entropy の親戚・別表現である。

🏗 まとめの構造化チェックリスト

本ページの内容を実務で活かすためのチェックリストを以下に示す。 SSDSE-B-2026 のような実データで分類モデルを組むたびに、 このチェックを通せば致命的なミスは避けられる。

段階確認項目具体例
設計出力層は softmax か sigmoid か多クラス → softmax、 多ラベル → sigmoid
設計ラベルは one-hot か整数かPyTorch は整数を期待
実装log_softmax と CE を二重適用していないかnn.CrossEntropyLoss は logits を渡す
実装予測確率に epsilon 加算を入れているか$\log 0$ 防止のため $10^{-12}$ 程度
学習訓練 / 検証 CE を毎エポック記録TensorBoard・wandb 等で可視化
学習クラス不均衡なら class_weight 検討逆頻度の平方根が標準
評価CE と他指標を併記Accuracy・Macro F1・AUC など
評価サンプル毎の CE を分布で確認外れサンプルが平均を歪める
レポートCE 値の単位(ナット / ビット)を明示自然対数か常用対数か曖昧にしない

このチェックリストは、 SSDSE-B のような小規模実データから始めて慣れていくと、 そのまま大規模深層学習プロジェクトに転用できる。 47 都道府県という限られたサンプル数だからこそ、 1 件ずつ丁寧に CE を眺める時間が取れる。 ImageNet のような何百万サンプルの世界に出る前に、 SSDSE-B で感覚を養っておくことが、 結果的に最も近道になる。

🎒 ここまでの知識を 1 文で言うと

「Cross-Entropy は、 モデルが正解クラスに割り当てた予測確率の負の対数を平均した量で、 値が小さいほど良く、 過信した誤りに重いペナルティを課し、 最尤推定・KL ダイバージェンス最小化・対数尤度最大化のすべてと等価な、 機械学習の確率予測における共通通貨である」——これが本ページ全体の要約である。 SSDSE-B-2026 のように身近な公的データで一度この感覚を掴めば、 任意の分類タスクで CE が示す数字を具体的な確率の話として翻訳できるようになる。

本ページでは、 47 都道府県という実在のサンプル数で、 一様予測 $\log 3 \approx 1.099$ と学習後 CE = $0.111$ の差を体感し、 BCE では $\log 2 \approx 0.693$ を出発点として $0.061$ まで下げ、 個別サンプルでは $0.001$ から $1.6$ までのレンジで CE 値の解釈を追った。 これらは合成乱数ではなく実際の都道府県データから導かれた数値であり、 自分の手で SSDSE-B-2026 をダウンロードして再現できる。 「再現できる教材」であることが、 統計データ解析コンペ向け教材としての本ページの存在意義である。

最後に、 Cross-Entropy を理解した次のステップとしては、 Focal Loss(難サンプルに重みを置く拡張)、 Label Smoothing(過信抑制)、 知識蒸留(教師モデルの分布を温度付き CE で生徒に教える)、 VAE の ELBO(CE と KL の組合せで生成モデルを学習)など、 多彩な派生概念が待っている。 本ページの「🌐 関連手法・派生」「🔗 関連用語」セクションを起点に、 自分のプロジェクトで使う派生損失を 1 つずつ深掘りしていくことを推奨する。

SSDSE-B-2026 を使った本ページの一連の例は、 47 都道府県という誰でも検証可能なスケールで、 クロスエントロピーの具体的な数字を体感することを目的としている。 「平均 CE 0.313」「BCE 0.061」「過信誤り 1.6」といった値が、 抽象的な記号ではなく都道府県名のリストと結びつくとき、 はじめてこの指標は身体感覚として定着する。 統計データ解析コンペで自前のモデルを評価するときも、 まずは Cross-Entropy を計算し、 サンプル毎の値で外れケースを観察するという習慣を身につけてほしい。 そうすれば、 単に「精度が高い / 低い」を超えて、 モデルが確率としてどう間違えているかを語れるようになる。 これが上級のデータサイエンティストの基本姿勢である。

本拡張章で扱った内容は、 ロジスティック回帰だけでなく、 ニューラルネットワーク・決定木の確率出力・アンサンブルのブレンド・ベイズ的予測といったあらゆる確率モデルに共通する。 出力が確率分布である限り、 評価と学習の通貨は常に Cross-Entropy に集約される。 SSDSE-B-2026 で身につけた感覚は、 そのまま大規模言語モデルの perplexity、 画像分類の top-k 評価、 推薦システムのクリック確率予測、 医療画像のリスクスコアといった現代の機械学習応用すべてに転用可能である。 ここで終わりではなく、 ここから先こそが Cross-Entropy を道具として使いこなす本番である。 本ページの内容を起点に、 自分の問題設定で CE を測り、 値の意味を語れるようになれば、 その時点で本ページの教材としての役割は果たされたことになる。 統計データ解析コンペでの活躍を期待している。 Cross-Entropy は確率予測の世界における万能尺度であり、 この尺度を持つかどうかで、 モデル評価の解像度は劇的に変わる。 47 都道府県のデータから始めて、 任意の規模のデータへ。 その第一歩を、 ぜひ本ページで踏み出してほしい。 SSDSE-B-2026 のデータは政府統計の総合窓口 e-Stat から無料で取得できるので、 すぐに手元で動かして確かめられる。 数値の感覚は実際に手を動かすことでしか身につかないため、 一度 47 都道府県のデータでクロスエントロピーを最後まで計算する経験を持つことを、 本ページから最後のメッセージとして強く勧める。

🐍 Python 深掘り実装ガイド(5 ブロック)

SSDSE-B-2026 の 47 県データで cross-entropy を多角的に計算します。 各 pygblock は「コードでやること → 入力 → コード → 実行例 → 結果の読み方」を揃えています。

ブロック 1 ── numpy で binary cross-entropy を自力実装

このコードでやること: SSDSE-B-2026 の 47 県データで「人口 500 万超 = 1, それ以外 = 0」の二値ラベルを作り、 ロジスティック予測確率を sigmoid で算出して numpy だけで BCE を計算する。 ライブラリブラックボックスでない理解を得る。

📥 入力データ: SSDSE-B-2026 (cp932, skiprows=[1])、 2023 年・47 行。 特徴量に新規求職申込件数 F3101 を線形スケーリングして使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 二値交差エントロピーを numpy で自力計算
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df2023 = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)
y = (df2023['A1101'].astype(float) > 5_000_000).astype(int).values

# スコア → sigmoid で確率に変換
score = (df2023['F3101'].astype(float) / 3_000_000 - 1).values
q = 1 / (1 + np.exp(-score))
eps = 1e-12  # log(0) 防止
bce = -np.mean(y * np.log(q+eps) + (1-y) * np.log(1-q+eps))
print(f'BCE (numpy) = {bce:.4f}')
print(f'平均予測確率 = {q.mean():.3f}, 陽性率 = {y.mean():.3f}')

📤 実行例:

BCE (numpy) = 0.5004 平均予測確率 = 0.273, 陽性率 = 0.191

💬 結果の読み方: BCE=0.500 はランダム予測 (0.693) よりやや低く、 モデルが多少の情報を抽出していることを示す。 平均予測確率 0.273 が真陽性率 0.191 より少し高く、 やや甘い予測。 eps=1e-12 は log(0)→-inf を避けるための数値安定化テクニック(必須)。

ブロック 2 ── sklearn.metrics.log_loss と一致確認

このコードでやること: ブロック 1 と同じ y, q を sklearn.metrics.log_loss に渡し、 自力実装と数値一致するかを確認する。 ライブラリ実装と numpy 計算が一致すれば理解は正しい、 というサニティチェック

📥 入力データ: ブロック 1 と同じ y_true, predicted prob q。

1
2
3
4
5
6
7
8
9
10
11
12
# sklearn.log_loss と numpy 自力実装の値を比較
import pandas as pd
import numpy as np
from sklearn.metrics import log_loss

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df2023 = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)
y = (df2023['A1101'].astype(float) > 5_000_000).astype(int).values
score = (df2023['F3101'].astype(float) / 3_000_000 - 1).values
q = 1 / (1 + np.exp(-score))
print(f'sklearn log_loss = {log_loss(y, q):.4f}')

📤 実行例:

sklearn log_loss = 0.5004

💬 結果の読み方: numpy 実装 0.5004 と sklearn 0.5004 が小数 4 桁まで一致 → 計算式の理解は正しい。 sklearn は内部で np.clip(q, eps, 1-eps) で同等の数値安定化を行っている。 普段はライブラリでよいが、 大規模学習で速度最適化する時は自力実装の知識が必要。

ブロック 3 ── 多クラス cross-entropy(4 地域に分類)

このコードでやること: 47 県を 4 地域(東日本/中部/西日本/九州沖縄)に分類するロジスティック回帰を学習し、 softmax 出力に対する categorical cross-entropy を計算する。 多クラス CE の動きを観察。

📥 入力データ: 47 県、 特徴量に A1101(人口), F3101(有業者), E1101(小学校児童数)、 地域コードは Code 列の先頭 R0X 番号から導出。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 多クラス交差エントロピー (4 地域分類)
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import log_loss

# 英字の項目コードを使うので、2 行目(和名)を読み飛ばして 1 行目を見出しにする
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df2023 = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)
code_num = df2023['Code'].str[1:3].astype(int)
region = pd.cut(code_num, bins=[0,13,23,35,47], labels=['東日本','中部','西日本','九州沖縄'])
X = StandardScaler().fit_transform(df2023[['A1101','F3101','E1101']].astype(float))

# sklearn 1.5 以降、multi_class 引数は廃止(多クラスは自動で multinomial)
clf = LogisticRegression(max_iter=500).fit(X, region)
proba = clf.predict_proba(X)
ce = log_loss(region, proba, labels=clf.classes_)
print(f'4 クラス CE = {ce:.4f} (ランダム予測なら log(4)=1.386)')
print('最初の 3 県の予測分布:')
print(pd.DataFrame(proba[:3], columns=clf.classes_).round(3))

📤 実行例:

4 クラス CE = 1.2910 (ランダム予測なら log(4)=1.386) 最初の 3 県の予測分布: 中部 九州沖縄 東日本 西日本 0 0.195 0.107 0.509 0.189 1 0.202 0.313 0.241 0.245 2 0.215 0.311 0.238 0.235

💬 結果の読み方: CE=1.291 はランダム (1.386) よりわずかに小さい程度 → 4 地域分類は 3 特徴量だけでは難しい(地域は人口とは別軸)。 北海道行の予測分布は東日本 0.509 と妥当だが、 完全分離には地理座標などが必要。 多クラス CE は log K のスケールで「どれだけランダムから改善したか」を見るのが目利き。

ブロック 4 ── ラベルスムージングの効果を比較

このコードでやること: one-hot ラベル $[1, 0, 0, 0]$ を $[0.925, 0.025, 0.025, 0.025]$ にスムージングし、 同じ予測分布での CE がどう変化するかを示す。 過信抑止と正則化の役割。

📥 入力データ: 仮想の予測分布 $q$ と one-hot ラベル $p$。 スムージング係数 $\epsilon = 0.1$。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ラベルスムージングがある場合とない場合の CE 比較
import numpy as np

K = 4  # 4 クラス
eps = 0.1  # スムージング係数
q = np.array([0.6, 0.2, 0.1, 0.1])  # 予測分布

p_hard = np.array([1.0, 0.0, 0.0, 0.0])
p_smooth = (1 - eps) * p_hard + eps / K
print('hard p   =', p_hard)
print('smooth p =', p_smooth.round(3))
print(f'CE (hard)   = {-(p_hard * np.log(q)).sum():.4f}')
print(f'CE (smooth) = {-(p_smooth * np.log(q)).sum():.4f}')

📤 実行例:

hard p = [1. 0. 0. 0.] smooth p = [0.925 0.025 0.025 0.025] CE (hard) = 0.5108 CE (smooth) = 0.6479

💬 結果の読み方: smooth ラベルの CE は hard より 0.137 大きい。 「100% 正解は無い」と仮定することで、 モデルが過信した softmax 出力 (q=0.99 等) を罰し、 汎化性能が向上する。 ImageNet では label smoothing 0.1 が事実上の標準。 ただし校正済み確率出力が必要なタスク(リスク予測)では避ける。

ブロック 5 ── 数値安定な softmax + CE 一体実装(log-sum-exp トリック)

このコードでやること: 大きなロジット値 (例: 1000) で素朴に softmax → log を計算すると overflow する。 log-sum-exp トリックでロジットの最大値を引いて数値安定化する実装を比較。

📥 入力データ: ロジットベクトル z=[1000, 999, 998](極端な値)と真のクラス 0。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 数値安定な softmax + cross-entropy 実装
import numpy as np

z = np.array([1000., 999., 998.])  # 極端なロジット
y = 0  # 真のクラス

# 素朴に計算すると exp(1000) が倍精度で表現できず無限大になり、
# 無限大 ÷ 無限大 で「非数 (Not a Number)」になってしまう
with np.errstate(over='ignore', invalid='ignore'):
    overflowed = bool(np.isinf(np.exp(z)).all())
    naive_broken = bool(np.isnan(np.exp(z) / np.exp(z).sum()).all())
print('exp(z) が無限大になったか   :', overflowed, '  ← これが overflow')
print('素朴な softmax が壊れたか   :', naive_broken, '  ← 全要素が非数になる')

# 安定: max を引く(softmax は全要素から同じ定数を引いても値が変わらない)
z_stable = z - z.max()
log_softmax = z_stable - np.log(np.exp(z_stable).sum())
print(f'安定版で計算した確率        : {np.exp(log_softmax).round(4)}')
print(f'CE (stable) = {-log_softmax[y]:.4f}')

📤 実行例:

naive softmax = [nan nan nan] (RuntimeWarning: overflow encountered in exp) CE (stable) = 0.4076

💬 結果の読み方: 素朴実装は exp(1000)≈10^434 で float64 限界 (10^308) を超え nan。 max を引くトリックで数値の絶対サイズを抑えつつ、 ratio は不変なので softmax 確率は同じ。 PyTorch の F.cross_entropyF.log_softmax は内部でこの処理を行うので、 ロジットのまま渡せばよい(softmax を手で計算してから loss を取らないこと)。

📊 交差エントロピー族の全体像

名称対象典型用途
Binary Cross-Entropy (BCE)2 クラススパム判定・閾値分類
Categorical Cross-Entropy多クラス (排他)ImageNet 分類・MNIST
Sparse Categorical CE多クラス・整数ラベル大規模分類 (10000+ クラス)
Multi-label BCE多ラベル (非排他)画像のタグ付け
Focal Loss不均衡多クラス物体検出 (RetinaNet)
Label Smoothing CE過信抑制Transformer・ResNet
KL Divergence分布間距離VAE・知識蒸留
NLL (Negative Log Likelihood)対数尤度の符号反転PyTorch の NLLLoss

📜 交差エントロピーの歴史年表

出来事
1948Shannon が情報理論を確立 (Bell System Technical Journal)。 エントロピーの定式化。
1951Kullback と Leibler が「情報差」 (KL divergence) を提唱。
1972Cover & Thomas の "Elements of Information Theory" の前身教科書、 cross-entropy の定義整理。
1986Rumelhart, Hinton, Williams らがバックプロパゲーション論文で BCE/CE を分類ニューラルネットの損失として確立。
1990sLeCun らの LeNet で softmax + categorical CE が標準化。
2012AlexNet (Krizhevsky) が CE 損失 + ReLU + GPU 学習で ImageNet で大勝。 深層学習革命の象徴。
2015Szegedy らが Inception-v3 でラベルスムージング 0.1 を提唱、 ImageNet で SOTA。
2017Lin らが Focal Loss を発表 (ICCV)。 不均衡物体検出で CE の派生として大流行。
2018BERT が masked language model で CE を文脈学習に活用、 NLP の新時代。
2020+GPT 系生成 LLM の事前学習も基本は token 級 CE。 全 AI モデルの「言語」として浸透。

🧯 Cross-Entropy 実装でハマる 10 個の罠

  1. softmax を手で計算 + log_softmax を別途呼ぶ — 数値不安定。 PyTorch なら F.cross_entropy(logits, target) がロジット直接受け取り。
  2. BCE vs BCEWithLogitsLoss の混同 — 前者は sigmoid 適用済み、 後者はロジット入力。 二重 sigmoid に注意。
  3. ラベルが one-hot か整数かの取り違え — Keras の categorical_crossentropysparse_categorical_crossentropy で使い分け。
  4. log(0) で -inf → 学習発散 — clip / eps 加算で防御。
  5. クラス重みの掛け方ミス — sklearn は sample_weight、 PyTorch は weight で挙動が違う。 ドキュメント必読。
  6. ignore_index の存在を忘れる — パディングや無視ラベル (-100) の処理を怠ると loss が歪む。
  7. reduction='mean' と 'sum' の混同 — 学習率が事実上変わる。 batch size 変更時のスケーリングを確認。
  8. 不均衡データに CE をそのまま使う — 多数派に学習が引っ張られる。 class_weight or Focal Loss を検討。
  9. multi-label task に categorical CE を使う — 排他前提が破綻。 multi-label BCE が正解。
  10. テスト評価で CE を accuracy 代わりに使う — 校正されていない確率は信頼性低い。 校正後に評価。

🎯 Cross-Entropy vs その他の分類損失

損失数式(概要)確率出力用途
Cross-Entropy$-\sum p \log q$○ softmax分類全般、 校正可能
Hinge Loss (SVM)$\max(0, 1-y \cdot \hat{y})$× マージンSVM、 マージン最大化
Squared Hinge$\max(0, 1-y \cdot \hat{y})^2$×外れ値に強い SVM
MSE for classification$\sum (p-q)^2$非推奨(勾配消失)
Focal Loss$-(1-q)^\gamma \log q$不均衡データ・難サンプル重視
Dice Loss$1 - 2|p \cap q|/(|p|+|q|)$セグメンテーション
Tversky LossDice の非対称版医用画像セグメンテーション
Triplet Loss$\max(0, d(a,p) - d(a,n) + m)$×埋め込み学習・顔認証
Contrastive Loss (InfoNCE)CE の派生自己教師あり学習・CLIP

Cross-Entropy が支配的な理由は (1) softmax と組合せた gradient が単純 (q-p)、 (2) 確率出力で解釈可能、 (3) 不確実性が自然に表現できる、 の 3 点。 困った時はまず CE が定石。

⚠️ よくある落とし穴

⚠️ $\log 0$ で NaN
正解クラスの予測確率が 0 に丸められると $\log 0 = -\infty$ となり、 損失が NaN になって以降の学習が全部壊れる。 確率を自分で計算してから log を取るのではなく、 logits を直接受け取る実装(log_softmax)を使えば、 内部で安定に計算される。
⚠️ クラス不均衡
交差エントロピーは全サンプルの平均なので、 件数の多いクラスの寄与が大きい。 陽性 1% の問題では、 全部を陰性と予測するだけで損失がかなり下がってしまう。 class_weight で少数クラスを重くするか、 易しいサンプルの寄与を下げる Focal Loss を使う。
⚠️ Label Smoothing 無し
正解ラベルを 1.0 として学習すると、 モデルは確率を 1 に近づけようとし続け、 自信過剰な予測を出すようになる。 正解を 0.9、 残りを均等に割り振る($\epsilon = 0.1$)だけで、 確率の較正が改善し汎化も安定することが多い。
⚠️ softmax の前で対数を取る誤実装
softmax で確率にしてから log を取ると、 小さい確率が丸められて精度が落ち、 0 になれば NaN になる。 log_softmax は指数の最大値を引いてから計算するので、 桁あふれも桁落ちも起きない。 PyTorch なら nn.CrossEntropyLoss に logits を渡すだけでよい。
⚠️ MSE で分類
分類でシグモイド出力に二乗誤差を使うと、 予測が大きく外れているときほど勾配が小さくなり、 学習が進まない。 交差エントロピーなら誤差に比例した勾配が出るので、 外れているほど強く修正される。 分類には交差エントロピーを使う理由がここにある。

🗺 概念マップ

クロスエントロピーを中心に「情報理論」「分類モデル損失」「派生損失」の 3 軸で周辺概念をツリー整理:

情報理論
  ├── シャノンエントロピー H(p) = -Σ p log p (単一分布の不確実性)
  ├── 相対エントロピー (KL ダイバージェンス) KL(p‖q) = Σ p log(p/q)
  ├── 【クロスエントロピー H(p,q) = -Σ p log q】 ← ここ = H(p) + KL(p‖q)
  │     ├── 二値交差エントロピー (BCE) — シグモイド出力 + 2 クラス
  │     ├── カテゴリカル交差エントロピー — ソフトマックス出力 + one-hot
  │     ├── スパースカテゴリカル CE — 整数ラベルで直接受ける版
  │     ├── 重み付き CE (Weighted CE) — クラス不均衡対策
  │     ├── Focal Loss — 易しい例の損失を縮小 (γ=2 が標準)
  │     ├── Label Smoothing CE — one-hot を (1-ε) + ε/K で滑らかに
  │     └── NLL Loss + LogSoftmax — PyTorch の分離実装
  └── 並列の損失関数
        ├── ヒンジ損失 (SVM 系)
        ├── 二乗誤差 (回帰、 確率出力には不適)
        └── 対照損失 (Triplet / InfoNCE — 表現学習)

交差エントロピー H(p,q) は「真の分布 p に従う事象を、 モデル分布 q で符号化した時の平均ビット数」。 H(p) + KL(p‖q) と分解されるため、 p が固定なら CE 最小化 ≡ KL 最小化 ≡ 最尤推定。 派生損失はいずれも「クラス不均衡」「過信抑制」「サンプリング効率」のどれかを改善する変形版です。

🎓 学習パス(推奨順)

「クロスエントロピー」を確実にマスターするには、 次の順序で進むのが効率的です:

  1. 前提知識の確認 — 上記「🔗 前提となる用語」セクションのリンクを順に読む(30 分〜)
  2. 直感を作る — 本ページの「🎨 直感で掴む」と「🧮 実値で計算」を SSDSE-B で手を動かしてみる
  3. 数式を読み下す — 「📐 定義」と「🔬 数式を言葉で読み解く」で 1 つずつ意味を確認
  4. Python で動かす — 「🐍 Python 実装」のコードをコピペし、 別の指標で実験
  5. 落とし穴を知る — 「⚠️ 落とし穴」を読み、 自分のコードに該当箇所がないか確認
  6. 関連手法を学ぶ — 「🌐 関連手法・派生」で次に学ぶべき派生概念へ
  7. 論文で活用 — 上位「📚 関連グループ教材」のページで実論文の文脈を確認

焦らず、 1 段ずつ確実に。 7 ステップを 1 周すれば、 単に「知っている」から「使える」レベルに到達できます。

クロスエントロピー BCE(二値) Focal Loss Label Smoothin Weighted CE NLL Loss KL Divergence

🔗 隣接手法への橋渡し

クロスエントロピーは「予測分布と正解分布の差を測る損失」として、 分類モデル学習の中核に位置する。 「接続 (どう繋がるか)」「統合 (どう組み合わせるか)」「比較 (どう使い分けるか)」の 3 視点で隣接手法を整理し、 損失設計の判断材料を提供する。

① 接続: クロスエントロピーを駆動する周辺技術

クロスエントロピーを正しく動かすには、 出力層の確率化とラベル表現、 そして勾配伝播の周辺技術が不可欠。 以下 5 件は実装上ほぼ必ず併用される。

② 統合: クロスエントロピーを組み込んだワークフロー

クロスエントロピーは単独で動かず、 分類パイプラインの「損失計算ステップ」として組み込まれる。

パイプラインステップクロスエントロピーの役割
画像分類 (ResNet 等)画像 → CNN → ロジット → Softmax → CE 損失 → 逆伝播 → 重み更新「予測確率と正解 one-hot のズレ」を損失化し、 自信過剰な誤分類を強く罰する
言語モデル (GPT, BERT)トークン列 → Transformer → 次トークン確率 → CE 損失 (各位置) → 平均各位置で「正解トークンの予測確率の負対数」を損失とし、 perplexity と直結
蒸留 (Knowledge Distillation)教師モデル softmax (温度 T) → 生徒モデル softmax → 両者の CE (ソフトラベル)正解 one-hot ではなく教師の確率分布を目標にし、 暗黙知を伝達

③ 比較: クロスエントロピー vs 隣接損失の使い分け判断

「MSE や Hinge Loss ではダメなのか」の判断基準。 損失関数選びは出力分布と問題設定で決まる。

状況クロスエントロピーMSE (二乗誤差)Hinge Loss (SVM)Focal Loss
多クラス分類 (確率出力)○ (定番)△ (収束遅い)× (マージン基準)○ (CE 拡張)
回帰 (連続値予測)× (確率前提)○ (定番)××
クラス不均衡が強い△ (多数派に引っ張られる)×○ (難例重視)
マージン最大化したい△ (確率重視)×○ (定番)
確率較正 (calibration) を求める○ (対数尤度)× (確率なし)△ (偏る場合あり)

原則: 「分類で確率出力が欲しい」→ CE「回帰で連続値」→ MSE「2 値でマージン重視」→ Hinge「不均衡で hard sample 重視」→ Focal。 深層分類のデフォルトは CE + Softmax。

🌳 手法選択フロー

交差エントロピーは分類モデルの代表的損失だが、 出力ヘッドの形・クラス数・分布の偏り・ノイズの 4 段階で派生損失を順番に選ぶ。 上の「🔗 隣接手法への橋渡し」で挙げた Softmax / One-Hot / 対数損失 / 情報エントロピー がこのフローの分岐先になっている。

段階的な選択フロー

  1. Step 1: タスクの性質を判定する
    • 目的変数が カテゴリ(クラスラベル) → 交差エントロピー族に進む
    • 目的変数が 連続値回帰分析 へ戻り MSE / Huber 損失を採用
    • 目的変数が ランキング/類似度 → 対照損失 (InfoNCE) や コサイン類似度 ベースの損失へ
  2. Step 2: 出力層と確率化の形を決める
    • 2 クラス + シグモイド出力 → 二値交差エントロピー (BCE) = 対数損失 と同一
    • 多クラス + Softmax 出力 + One-Hot ラベル → カテゴリカル CE
    • 多クラス + Softmax 出力 + 整数ラベル → スパース CE(メモリ効率が高い)
    • マルチラベル(複数同時に 1) → クラスごとに独立な BCE × C 個
  3. Step 3: クラス分布の偏り・難易度を確認する
    • 頻度差が 10:1 以下なら通常 CE で十分
    • 頻度差が 10:1〜100:1 → 重み付き CE(クラス重み = 逆頻度)
    • 頻度差 100:1 以上、 または易しい背景例が大半 → Focal Loss(γ=2 を起点に調整)
    • 頻度の事前知識が無く再サンプリング可能なら 不均衡データ対策(SMOTE 等)と併用
  4. Step 4: ラベルノイズ・過信の懸念を点検する
    • 人手アノテーションでラベルが揺れる → Label Smoothing CE(ε=0.1 が標準)
    • キャリブレーション重視(医療・金融) → Temperature Scaling や 情報エントロピー ベースの正則化を追加
    • 蒸留・自己教師あり → 教師分布 q* に対する KL ダイバージェンス(= 交差エントロピー − 教師分布のエントロピー)
  5. Step 5: 数値安定性と実装を確認する
    • 必ず log_softmax + nll_loss(PyTorch)または from_logits=True(Keras)でロジット直接入力にする
    • 勾配降下の挙動確認は 勾配降下法 ページの収束チェックリストを参照
    • 性能評価は 評価指標 で Accuracy / F1 / AUC を学習損失と分けて記録

典型シナリオ別の推奨損失

シナリオ推奨損失主な理由
SSDSE 47 都道府県を「人口増加 / 横ばい / 減少」3 クラスに分類カテゴリカル CEクラス数 3、 頻度が極端に偏らない
医療画像で「異常あり / なし」 (異常 1%)Focal Loss + 重み付き高度な不均衡 + 易しい陰性例が大半
大規模 LLM の蒸留KL ダイバージェンス (Temperature 付き)教師分布の情報を最大保持
ノイズ多めのクラウドソーシングラベルLabel Smoothing CE過信抑制と汎化向上

原則は「クラス数 → 出力ヘッド → 分布の偏り → ラベル品質」の順で派生損失を絞り込むこと。 SSDSE-B-2026 のような均衡データなら標準カテゴリカル CE で十分、 不均衡や蒸留が絡む場合のみ Focal / KL / Smoothing を検討する。

🔍 解説を深める — 「符号長」として読むクロスエントロピー

本編ではクロスエントロピーを分類モデルの損失関数として扱いました。 この追補では視点を変え、 情報理論の原義である「平均符号長(メッセージを伝えるコスト)」として捉え直します。 題材は SSDSE-B-2026 の 2023 年・47 都道府県の総人口(列 A1101)で、 以下の数値はすべて実データから Python で算出した実測値です(総人口合計 124,353,000 人)。

💡 直感 — 「無作為に選んだ日本の住民 1 人の居住都道府県を伝えるコスト」

2023 年の日本から無作為に 1 人選び、 その人がどの都道府県に住んでいるかを相手に伝える、 という通信ゲームを考えます。 真の分布 $p$ は人口シェアそのもので、 東京都 11.33%、 神奈川県 7.42%、 大阪府 7.05%、 …、 島根県 0.52%、 鳥取県 0.43% と大きく偏っています(SSDSE-B-2026 実測)。

符号化の方針(= 仮定する分布 $q$) 平均コスト = $H(p,q)$ [nat] 意味
47 県を均等扱い($q$ = 一様分布)$\log 47 = 3.8501$人口の偏りを無視した符号化
真の人口シェアに合わせる($q = p$)$H(p) = 3.4531$達成可能な最小コスト(エントロピー)
両者の差$D_{KL}(p\,\|\,\text{unif}) = 0.3971$偏りを無視したことによる「無駄」

つまり $H(p,q) = H(p) + D_{KL}(p\|q)$ という本編の分解式は、 「最短コスト + 分布の読み違いによる追加料金」と読めます。 分類学習で CE を最小化することは、 「モデルの $q$ をデータの $p$ に合わせて追加料金をゼロに近づける」ことに他なりません。 また $\exp(H(p)) = \exp(3.4531) \approx 31.6$ は「実効的な県の数」です。 47 県あっても人口が偏っているため、 不確かさとしては「約 31.6 個の等確率な選択肢」ぶんしかない、 という解釈(これが perplexity の正体)ができます。 個別に見ると、 自己情報量 $-\log p$ は東京都 2.178 nat、 鳥取県 5.445 nat で、 珍しい事象ほど伝える価値(驚き)が大きいことも実数で確認できます。

もう 1 つの重要な直感が「正直申告が最適」という性質です。 真の分布が $p$ のとき、 期待損失 $\mathbb{E}_p[-\log q]$ を最小にする申告は $q = p$ 自身(上の表の 2 行目)。 つまり CE で採点される予報士は、 本心の確率をそのまま申告するのが期待値的に最も得です。 この性質を持つ採点規則を proper scoring rule(適切なスコアリングルール)と呼び、 CE(対数損失)はその代表格です。

⚠️ 落とし穴(重要)

🚀 発展

符号長の視点は 情報エントロピー が出発点です。 損失としての側面は 対数損失(Log Loss)損失関数ロジスティック回帰、 出力層との関係は softmaxシグモイド関数 を参照。 「CE と accuracy の逆行」に関わる話題は 正解率過学習評価指標 で扱っています。 なお KL ダイバージェンス・Brier スコア・perplexity・キャリブレーション(温度スケーリング)の単独ページは本用語集には未収録のため、 本節の説明にとどめます。

※ 本節の数値($\log 47 = 3.8501$、 $H(p)=3.4531$ nat、 KL $=0.3971$、 $\exp(H)\approx 31.6$、 東京都シェア 11.33%・自己情報量 2.178 nat、 鳥取県シェア 0.43%・自己情報量 5.445 nat)は、 SSDSE-B-2026(2023 年・47 都道府県・列 A1101 総人口、 合計 124,353,000 人)から算出した実測値です。