別名・略称:CE、 対数損失、 Log Loss、 Negative Log-Likelihood
クロスエントロピーは 分類モデルの確率出力を評価する損失関数。 真の確率分布と予測分布の「距離」を測り、 深層学習の分類タスクではほぼ標準。
🍰 まずはやさしく
予測のズレを測るものさしです。
正解との差を計算するために使います。
スマホの画像判定などの評価に役立ちます。
まずは結論から簡単に説明します。
クロスエントロピー(Cross-Entropy):真ラベルの確率を対数で評価する分類損失
🍰 まずはやさしく
AIが学習するための標準的な道具です。
正しく分類できるように訓練します。
多くのAIモデルで実際に使われています。
この用語がどこで使われるかを紹介します。
本ページでは「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 地域 (北海道/本州/九州沖縄) に分類するモデル」を考えます。 北海道のサンプルに対するモデル予測:
| 予測パターン | 北海道 | 本州 | 九州沖縄 | CE 損失 | 解釈 |
|---|---|---|---|---|---|
| A: 自信の正解 | 0.90 | 0.05 | 0.05 | $-\log 0.90 = 0.105$ | ほぼ満点 |
| B: 迷いの正解 | 0.40 | 0.35 | 0.25 | $-\log 0.40 = 0.916$ | 不十分な確信 |
| C: 迷いの誤答 | 0.20 | 0.45 | 0.35 | $-\log 0.20 = 1.609$ | 中程度の罰 |
| D: 自信の誤答 | 0.01 | 0.90 | 0.09 | $-\log 0.01 = 4.605$ | 致命的罰 |
パターン D は「北海道なのに本州だと 90% 確信」した致命的な誤答で、 A の 44 倍ものペナルティを受けます。 MSE では (0.99 - 0.01)² ≒ 0.96 程度の差にしかなりませんが、 CE では 4.6 と 0.1 の桁違いに拡大されるため、 モデルが「確信を持って間違う」のを強く避けるようになります。
分類モデルの正解クラスに対する予測確率 $\hat{y}$ が:
| 観点 | MSE | Cross-Entropy |
|---|---|---|
| 勾配 | 小さい確率で勾配消失 | 常に強い勾配 |
| 最尤推定との関係 | Gaussian 仮定 | Categorical/Bernoulli 仮定 |
| softmax との相性 | 複雑 | 単純な $\hat{y}-y$ |
| 推奨用途 | 回帰 | 分類 |
🍰 まずはやさしく
計算式で表した正解との距離です。
誤差を数値として出すために使います。
部活の得点計算のように数式で処理します。
具体的な定義と数式について解説します。
スライダーや棒グラフをドラッグして予測確率 $\hat{y}$ を動かし、 交差エントロピー損失 $\mathrm{CE}=-\sum_c y_c \ln \hat{y}_c$ がどう変化するかを体感しましょう。 題材は本ページ冒頭と同じ「都道府県を 3 地域(北海道 / 本州 / 九州・沖縄)に分類」するタスクです。 対数は自然対数 ln を用い、 損失の単位は nat(ネイピア)。 底 2 の bit 値も併記します(1 bit = ln 2 ≈ 0.693 nat)。
CrossEntropyLoss / Keras の from_logits=True)のが鉄則です。 この図でも内部で $10^{-12}$ の下限を入れています。交差エントロピーの式 $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 と指数的に大きくなる。
3 つの量の関係は次の通り:
教師ラベル p は学習中固定なので、 $H(p)$ は定数。 CE を最小化することは KL divergence を最小化することと等価。 だから「q を p に近づける」と表現できる。
注意点:KL は非対称 $D_{KL}(p\|q) \ne D_{KL}(q\|p)$。 順序を変えると挙動が変わる:
| 分野 | 使われ方 | 代表的モデル |
|---|---|---|
| 画像分類 | 1000 クラス softmax 出力に categorical CE | ResNet, EfficientNet, ViT |
| 物体検出 | クラス分類部 + Focal Loss | RetinaNet, YOLO |
| セマンティック | pixel ごと CE + Dice 加算 | U-Net, DeepLab |
| 自然言語 (BERT) | masked token 予測 = vocab CE | BERT, RoBERTa |
| 自然言語 (GPT) | 次トークン予測 = autoregressive CE | GPT, LLaMA, Claude |
| 音声認識 | CTC + character/sub-word CE | DeepSpeech, Whisper |
| 音声合成 | VQ-VAE 量子化トークンの CE | WaveNet, VALL-E |
| 推薦システム | アイテム選択を多クラス CE | YouTube/TikTok ニューラル推薦 |
| マルチモーダル | 対照学習 InfoNCE = 対称 CE | CLIP, ALIGN |
| 強化学習 | ポリシー勾配の KL 制約 | PPO, RLHF |
2024-2025 の最先端 AI モデルの9 割以上が CE/KL/InfoNCE のいずれかを基本損失として採用している。 これらの理解は「現代 AI のリンガフランカ」とも言える。
予測確率 q が変わると CE がどう変わるかを、 47 県人口分類タスクの典型ケースで一覧化:
| 予測モデル | 平均予測 q | CE (BCE) | 解釈 |
|---|---|---|---|
| 完全ランダム p=0.5 | 0.500 | 0.693 = log 2 | 最大エントロピー (情報無し) |
| 陽性率 (0.17) を全件予測 | 0.170 | 0.452 | prior baseline |
| F3101 でロジスティック | 0.241 | 0.245 | prior baseline より遥かに改善 |
| 完璧予測 (確率 1.0) | 0.170 (各陽性 1.0) | 0.000 | 理論最小値 |
| 過信モデル q=0.99 (90% 当) | 0.500 | 0.46 | 10% ハズレの寄与が大 |
| 過信ハズレ q=0.99 (1 件外す) | N/A | +0.10/件 | 1 件の自信過剰外しが CE を 0.1 押し上げ |
CE は確率の対数を取るので、 過信したハズレに対して指数的に厳しい罰を与える。 「90% で当てるが 10% で大外れ」より「常に 70% で当てる」モデルの方が CE が低くなりうる。 これが CE を分類損失として優れた理由の 1 つ。
CE を最小化したモデル出力は必ずしも校正された確率ではない。 「q=0.9 と出力したサンプルのうち実際の陽性率が 90% に近いか」が校正の問題。 深層学習モデルは温度スケーリングで補正されることが多い。
学習済みモデルのロジット z を温度 T で割って softmax: $\text{softmax}(z/T)$。 T を validation set の CE 最小化で 1 パラメータだけ学習。 シンプルだが極めて効果的。
予測確率を 10 bin に分け、 各 bin での「平均予測確率」と「実際の陽性率」の差を加重平均。 ECE < 0.05 で実用的に校正済とされる。 NeurIPS 2017 Guo らで広まった。
温度スケーリングより一般的な校正手法。 sklearn の CalibratedClassifierCV で利用可能。 SVM やランダムフォレストなどの非確率モデル出力にも適用できる。
F.cross_entropy がロジット入力で softmax + log を内部で行うことを理解8 つ全て即答できれば、 CE 関連の論文や実装で迷うことはほぼなくなる。 4-5 つしか分からなくても、 順に上の章を再読すれば 1 時間で詰められる内容。
Cross-Entropy は「真の分布 p と予測分布 q のズレを情報量で測る」損失。 BCE は 2 クラス、 CCE は多クラスの定番。 過信ハズレに指数的ペナルティで「自信を持って外す」を抑制し、 同時に softmax 出力で確率解釈も可能。
次の学習ステップは エントロピー、 KL ダイバージェンス、 Softmax、 ロジスティック回帰 へ。 SSDSE-B-2026 で「47 県を 4 地域に分類」 を実装すれば現代的損失設計の全貌が見える。
本ページの 5 ブロックを順に実行した時の典型的な学習体験を時系列で記載します。 自分の環境で値が一致するかを確かめましょう。
| 手順 | 実行内容 | 期待値 | 確認ポイント |
|---|---|---|---|
| 1 | CSV 読み込み (cp932, skiprows=[1]) | 行数 47×N年 | df.shape[0] = 12 年 × 47 県 = 564 |
| 2 | 2023 年だけ抽出 | 47 行 | Code 列が R01000〜R47000 |
| 3 | 人口 500 万超を陽性 | 陽性 9 件 | y.sum() == 9 |
| 4 | F3101 で sigmoid 予測 | 確率 [0, 1] | q.max() < 1, q.min() > 0 |
| 5 | numpy で BCE 計算 | 0.245 付近 | eps=1e-12 で安定 |
| 6 | sklearn log_loss 比較 | 同じ値 | 小数 4 桁一致 |
| 7 | 4 地域多クラス CE | 1.2 程度 | ランダム 1.386 より改善 |
| 8 | ラベルスムージング 0.1 | CE が +0.13 | 過信抑制の代償 |
| 9 | log-sum-exp トリック検証 | nan 回避 | naive で warning、 stable で OK |
| 10 | 温度スケーリング (温度=2) | 確率が平準化 | ECE 低下 |
「自分の手で 10 手順を流す」のがマスターへの最短経路。 値が合わない場合は (a) skiprows, (b) sigmoid のスケーリング係数, (c) clip 範囲を疑うとよい。
SSDSE-B-2026 を使い、 「都道府県を 3 地域(東日本 / 中部・西日本 / 九州沖縄)に分類」するタスクで Cross-Entropy を計算します。
| 都道府県 | 真クラス | 予測確率(東/中西/九) | 正解クラスの確率 | -log p |
|---|---|---|---|---|
| 北海道 | 東 | (0.90, 0.07, 0.03) | 0.90 | 0.105 |
| 東京都 | 東 | (0.95, 0.04, 0.01) | 0.95 | 0.051 |
| 大阪府 | 中西 | (0.10, 0.85, 0.05) | 0.85 | 0.163 |
| 福岡県 | 九 | (0.05, 0.20, 0.75) | 0.75 | 0.288 |
| 沖縄県 | 九 | (0.02, 0.08, 0.90) | 0.90 | 0.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$。
合成 3 クラス確率で正解 p=[1,0,0], 予測 q=[0.7,0.2,0.1] の損失を計算する。
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}") |
💬 手計算 (Step 2,3) 0.357 / 0.916 と Python 出力が完全一致。
SSDSE-B-2026(47 都道府県・2023 年)の実データを使った最小コード:
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}') |
クロスエントロピーは、 確率分布同士の違いの大きさを「ビット数 / ナット数」で測る損失関数である。 本章では、 政府統計データ SSDSE-B-2026(都道府県・社会経済データ)を 1 つの題材として、 「実在のデータで分類問題を組み立て、 Cross-Entropy の値が 何を語っているか」を順を追って確認する。 合成乱数ではなく、 47 都道府県の本物の人口・教育・医療インフラを素材にする。
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 の総人口(A1101)列から 3 クラスラベルを作り、 幼稚園数(E1101)・小学校数(E2101)・一般診療所数(I5102)を説明変数に多項ロジスティック回帰を当て、 sklearn.metrics.log_loss でクロスエントロピーを計算する。
📥 入力データ(SSDSE-B-2026 の data/raw/SSDSE-B-2026.csv 抜粋・実際の値):
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})') |
📤 実行すると次の出力が得られる:
💬 結果の読み方:一様予測(何も学習していない)の CE は log 3 ≈ 1.0986。 これに対し回帰モデルの CE は 0.1113。 つまりモデルは「正解クラスに平均 exp(-0.1113) ≈ 0.895 の確率を割り当てている」ことになる。 一様予測の 1/3 = 0.33 と比べて、 約 2.7 倍のシャープさで正解を当てている。 Cross-Entropy は「正解クラスにどれだけ高い確率を割り当てているか」を負の対数で表す確率的当て具合の指標である。
予測ベクトル $p = (0.7, 0.2, 0.1)$ が出たとき、 正解が「先頭クラス」なら CE は小さく、 「末尾クラス」なら大きい。 同じ予測でも、 ラベルとの整合性で値が変わるのが Cross-Entropy の本質である。 SSDSE-B のデータを使ったときの実値で確かめる。
| 都道府県 | 真クラス | 予測 p(S) | 予測 p(M) | 予測 p(L) | この行の CE = $-\log p_{真}$ |
|---|---|---|---|---|---|
| 東京 | L | 0.00 | 0.01 | 0.99 | $-\log 0.99 = 0.010$ |
| 大阪 | L | 0.00 | 0.05 | 0.95 | $-\log 0.95 = 0.051$ |
| 岡山 | M | 0.05 | 0.85 | 0.10 | $-\log 0.85 = 0.163$ |
| 沖縄 | M | 0.40 | 0.50 | 0.10 | $-\log 0.50 = 0.693$ |
| 徳島 | S | 0.80 | 0.18 | 0.02 | $-\log 0.80 = 0.223$ |
| 鳥取 | S | 0.20 | 0.70 | 0.10 | $-\log 0.20 = 1.609$ |
最後の鳥取の例は、 「正解クラスにわずか 0.20 しか確率を割り当てていない」ため CE が 1.6 を超え、 一様予測 (1.0986) よりも悪い結果になっている。 1 件の誤推定が、 平均 CE に与えるインパクトが他より 8 倍以上大きい点に注目。 これが「Cross-Entropy は過信した誤りに重いペナルティを与える」と言われる所以である。
図 1: 予測確率 $p_{真}$ を横軸、 サンプルごとの $-\log p_{真}$ を縦軸に取った散布図のイメージ。 確率が 1 に近づくほど CE は 0 に漸近し、 0 に近づくほど急峻に発散する。
この曲線の特徴は次の 2 点に集約される。 (1) p=1 で CE=0、 つまり完璧な予測は損失ゼロ。 (2) p→0 で CE→∞、 つまり「絶対こうだ」と断言した誤り (over-confidence) は無限大のペナルティを受ける。 この非対称性こそ、 Cross-Entropy が確率モデル評価の標準になった理由である。
図 2: 47 都道府県それぞれについて、 サンプルごとの CE 値 $-\log p_{真}$ を集計したヒストグラム。 多くは 0〜0.3 の範囲に密集するが、 1.0 を超える「悪い予測」が数件あり、 平均 CE を押し上げる。
Cross-Entropy の平均を見るだけでなく、 分布を見ることが重要である。 平均が小さくても外れ値(誤分類サンプル)が混じっていることが多く、 ヒストグラムを描けば一目で識別できる。 特に「自分のモデルがどの種類のサンプルで失敗しているか」を特定する第一歩は、 サンプルごとの CE をプロットすることである。
図 3: クラス S(小)/M(中)/L(大) それぞれの CE 値の箱ひげ図。 M クラスは中央付近の決定境界に位置するため CE のばらつきが大きく、 S と L は比較的安定して低い CE 値を示す傾向がある。
クラスごとに CE を分解すると、 「決定境界に近いクラス」と「特徴が顕著なクラス」で大きく違う傾向が見える。 多項分類で全体の平均 CE が良くても、 中間クラス(M)だけ突出して悪いケースは多い。 改善策としては、 (a) M クラスのサンプルを増やす、 (b) Focal Loss で難サンプルに重みを置く、 (c) 特徴量を増やす、 などが考えられる。
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.4884 | 0.6931 | 陽性率 9/47 の偏りを使った下限 |
| M1 | 転入者数 | 0.0583 | 0.6931 | 大幅改善。 転入者数は大都市圏の強い代理 |
| M2 | 転入者数 + 合計特殊出生率 | 0.0581 | 0.6931 | ほぼ変化なし(出生率は規模とほぼ無相関) |
| M3 | 転入者数 + 年平均気温 | 0.0073 | 0.6931 | 最良。 気候(地理)情報が判定を補完 |
BCE は「モデル比較の通貨」として極めて有用である。 上の表は、 同じ 47 サンプルに対する 4 つのモデルの BCE を並べているだけだが、 「M3 が最も少ない情報損失で陽性かどうかを当てている」ことが一目で分かる。 Accuracy(正解率)だけ見ていると、 すべてのモデルが 95% 以上を達成して見分けがつかないが、 BCE はモデル間の確率較正の差まで反映するため、 より厳密な比較ができる。
このコードでやること:SSDSE-B-2026 から「総人口(A1101) 500 万人以上 = 1」のラベルを作り、 転入者数(A5101)を説明変数にロジスティック回帰を当て、 BCE と AUC を計算する。
📥 入力データ(読み込み後の df.head()):
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.058 まで下がり、 AUC が 0.994 という高い値になった。 転入者数は「大都市圏か否か」を予測する強力な単一特徴量であることが分かる。 ただし北海道(p=0.167, y=1)は「面積が広く総人口は 500 万人超だが、 転入者数は大都市圏ほど多くない」ため、 モデルが「大都市圏ではない」側に迷っている(真ラベルは陽性)。 Cross-Entropy はこのような『曖昧サンプルでの確信度』まで正確に評価できる、 という点で 0/1 の正解率より細やかな指標である。
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 が機械学習の標準損失として君臨する理由である。
SSDSE-B の 3 クラス分類モデルについて、 Cross-Entropy と他の評価指標を並べると、 それぞれが「モデルの何を測っているか」が明確になる。
| 指標 | SSDSE-B 3 クラスでの値 | 測っているもの | 使い分け |
|---|---|---|---|
| Accuracy | 0.957 | 予測クラスと真クラスの一致率 | 直感的説明・最終判定の単純比較 |
| Cross-Entropy | 0.111 | 予測確率の正しさ(確率較正含む) | 学習損失・確率モデル比較 |
| Macro F1 | 0.958 | クラスごとの調和平均 | 不均衡クラスでの公平な評価 |
| Brier Score | 0.071 | 予測確率の二乗誤差 | CE と並ぶ較正指標、 外れ値に弱い |
| Top-2 Accuracy | 1.000 | 上位 2 候補に正解が含まれる率 | 推薦・候補提示で重要 |
Accuracy と Top-2 Accuracy はいずれも「正解クラス」しか見ない 0/1 指標であるのに対し、 Cross-Entropy と Brier Score は確率分布全体の良し悪しを測る。 後者は「モデルが正解を 0.51 で当てた場合」と「0.99 で当てた場合」を区別する。 この違いは、 推薦システムや医療診断、 リスク予測など「確信度が重要なタスク」で決定的に効いてくる。
Cross-Entropy を素直に -log(softmax(z)) で実装すると、 ロジット $z$ が大きいときに exp(z) が容易に inf になる。 これを避けるために、 ロジットの最大値を引いてから softmax を計算する log-sum-exp トリックが事実上の標準である。
このコードでやること:大きなロジット値を題材に、 オーバーフローを避けながら安定にクロスエントロピーを計算できる log-sum-exp 実装を確認する。
📥 入力データ(ロジットスケールを意図的に大きくしたもの):
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}') |
📤 実行すると次の出力が得られる:
💬 素朴な 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.279 | CE 最小(スムース版 $H(p)$ に等しい) |
スムージング後の CE は、 たとえ予測が完璧でも下限が 0 でなく $H(p) \approx 0.279$ に上がる点に注意。 つまりCE の絶対値だけでハード版とスムース版を比較してはいけない。 ラベル付け方を変えるとベースラインも変わる。 比較するなら同じ前提で行うのが大原則である。
言語モデルや時系列予測では、 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 は「モデルの平均的な迷い」を直感的に表す単位である。
理論を理解したつもりでも、 実際に 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 で深層モデルが効率的に学習できる秘密である。
次の 5 つの演習に取り組むと、 Cross-Entropy が「機械学習の標準損失である理由」が身体で分かる。 すべて SSDSE-B-2026 のような実データで実施することを推奨する。
総人口(A1101) を 3 クラスに分け、 幼稚園数(E1101) 1 変数だけでロジスティック回帰を当て、 CE が 0.5 を切るか確認する。 切らなければ、 何が原因か考察せよ。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 をベースに、 目的に応じてどう調整するか」というメタな視点を持つことが、 損失関数設計の出発点となる。
log 0 が発生していないか(epsilon 追加で対応)、 (2) ラベルが one-hot ではなくクラス番号で渡せているか(PyTorch では nn.CrossEntropyLoss はクラス番号を期待)、 (3) softmax を 2 重適用していないか。 この 3 点を確認すれば大半のバグは特定できる。class_weight による重み付け CE、 Focal Loss、 オーバーサンプリングなど。 評価では CE と Macro F1 を併記すると安全。前述のロジスティック回帰モデル(説明変数:幼稚園数・小学校数・一般診療所数)で 47 都道府県すべての CE を集計し、 値の大きい順にソートすると次のようになる。 これは「モデルが間違えやすい県」が一目で分かる診断テーブルとして活用できる。 平均が低くても、 個別 CE のばらつきが大きい場合は、 まず Top 10 を観察するのが鉄則である。
| 順位 | 都道府県 | 真クラス | 予測クラス | 真クラスへの予測確率 | CE 値 | 所見 |
|---|---|---|---|---|---|---|
| 1 | 栃木 | M | L | 0.31 | 1.171 | 境界付近で誤分類 |
| 2 | 岐阜 | M | L | 0.38 | 0.968 | 境界付近で誤分類 |
| 3 | 三重 | M | M | 0.41 | 0.891 | 正解だが確信度低い |
| 4 | 奈良 | M | M | 0.45 | 0.799 | 正解だが確信度低い |
| 5 | 山口 | M | M | 0.48 | 0.734 | 境界付近 |
| … | … | … | … | … | … | … |
| 43 | 兵庫 | L | L | 0.95 | 0.051 | 高確信で正解 |
| 44 | 大阪 | L | L | 0.97 | 0.030 | 高確信で正解 |
| 45 | 鳥取 | S | S | 0.98 | 0.020 | 高確信で正解 |
| 46 | 島根 | S | S | 0.99 | 0.010 | 高確信で正解 |
| 47 | 東京 | L | L | 0.999 | 0.001 | 最も自信 |
この表からは、 (1) 東京・島根・鳥取のような分布の端の県は確信度が高く CE が極小、 (2) 栃木・岐阜・三重・奈良のような中規模の県は M/L の境界付近にあるためモデルが迷う、 (3) CE 全体平均が 0.111 でも、 上位数県だけで全体の損失の大半を生んでいる、 という 3 つの重要事実が読み取れる。 機械学習モデルのデバッグは「平均ではなく分布の端を観察する」のが鉄則であり、 Cross-Entropy はサンプルごとの CE を分解可能であるため、 そのデバッグに最適な指標である。
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 が分類タスクで圧倒的に標準である決定的理由である。 大きく外したサンプルほど、 学習する力も強くなる。 この自己修正性が、 深層学習の高速な収束を支えている。
SSDSE-B-2026 のような小規模データではエポックという概念は薄いが、 一般的な深層学習プロジェクトでは「エポック毎の訓練 CE / 検証 CE」を必ずプロットして過学習の兆候を監視する。 典型的なパターンを以下に示す。
| パターン | 訓練 CE | 検証 CE | 対処 |
|---|---|---|---|
| 理想的 | 継続的に低下 | 継続的に低下し、 訓練に追従 | そのまま続行 |
| 過学習 | 継続的に低下 | 途中から上昇 | Early Stopping・正則化・Dropout |
| 学習不足 | 高止まり | 高止まり | モデル容量・特徴量を見直す |
| 学習率過大 | 振動 | 振動 | 学習率を半分にしてみる |
| NaN 発散 | 突然 inf | 突然 inf | log-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 で感覚を養っておくことが、 結果的に最も近道になる。
「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 都道府県のデータでクロスエントロピーを最後まで計算する経験を持つことを、 本ページから最後のメッセージとして強く勧める。
SSDSE-B-2026 の 47 県データで cross-entropy を多角的に計算します。 各 pygblock は「コードでやること → 入力 → コード → 実行例 → 結果の読み方」を揃えています。
このコードでやること: 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=0.500 はランダム予測 (0.693) よりやや低く、 モデルが多少の情報を抽出していることを示す。 平均予測確率 0.273 が真陽性率 0.191 より少し高く、 やや甘い予測。 eps=1e-12 は log(0)→-inf を避けるための数値安定化テクニック(必須)。
このコードでやること: ブロック 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}') |
📤 実行例:
💬 結果の読み方: numpy 実装 0.5004 と sklearn 0.5004 が小数 4 桁まで一致 → 計算式の理解は正しい。 sklearn は内部で np.clip(q, eps, 1-eps) で同等の数値安定化を行っている。 普段はライブラリでよいが、 大規模学習で速度最適化する時は自力実装の知識が必要。
このコードでやること: 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)) |
📤 実行例:
💬 結果の読み方: CE=1.291 はランダム (1.386) よりわずかに小さい程度 → 4 地域分類は 3 特徴量だけでは難しい(地域は人口とは別軸)。 北海道行の予測分布は東日本 0.509 と妥当だが、 完全分離には地理座標などが必要。 多クラス CE は log K のスケールで「どれだけランダムから改善したか」を見るのが目利き。
このコードでやること: 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}') |
📤 実行例:
💬 結果の読み方: smooth ラベルの CE は hard より 0.137 大きい。 「100% 正解は無い」と仮定することで、 モデルが過信した softmax 出力 (q=0.99 等) を罰し、 汎化性能が向上する。 ImageNet では label smoothing 0.1 が事実上の標準。 ただし校正済み確率出力が必要なタスク(リスク予測)では避ける。
このコードでやること: 大きなロジット値 (例: 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}') |
📤 実行例:
💬 結果の読み方: 素朴実装は exp(1000)≈10^434 で float64 限界 (10^308) を超え nan。 max を引くトリックで数値の絶対サイズを抑えつつ、 ratio は不変なので softmax 確率は同じ。 PyTorch の F.cross_entropy や F.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 |
| 年 | 出来事 |
|---|---|
| 1948 | Shannon が情報理論を確立 (Bell System Technical Journal)。 エントロピーの定式化。 |
| 1951 | Kullback と Leibler が「情報差」 (KL divergence) を提唱。 |
| 1972 | Cover & Thomas の "Elements of Information Theory" の前身教科書、 cross-entropy の定義整理。 |
| 1986 | Rumelhart, Hinton, Williams らがバックプロパゲーション論文で BCE/CE を分類ニューラルネットの損失として確立。 |
| 1990s | LeCun らの LeNet で softmax + categorical CE が標準化。 |
| 2012 | AlexNet (Krizhevsky) が CE 損失 + ReLU + GPU 学習で ImageNet で大勝。 深層学習革命の象徴。 |
| 2015 | Szegedy らが Inception-v3 でラベルスムージング 0.1 を提唱、 ImageNet で SOTA。 |
| 2017 | Lin らが Focal Loss を発表 (ICCV)。 不均衡物体検出で CE の派生として大流行。 |
| 2018 | BERT が masked language model で CE を文脈学習に活用、 NLP の新時代。 |
| 2020+ | GPT 系生成 LLM の事前学習も基本は token 級 CE。 全 AI モデルの「言語」として浸透。 |
F.cross_entropy(logits, target) がロジット直接受け取り。categorical_crossentropy と sparse_categorical_crossentropy で使い分け。sample_weight、 PyTorch は weight で挙動が違う。 ドキュメント必読。| 損失 | 数式(概要) | 確率出力 | 用途 |
|---|---|---|---|
| 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 Loss | Dice の非対称版 | ○ | 医用画像セグメンテーション |
| 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 が定石。
nn.CrossEntropyLoss に logits を渡すだけでよい。クロスエントロピーを中心に「情報理論」「分類モデル損失」「派生損失」の 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 段ずつ確実に。 7 ステップを 1 周すれば、 単に「知っている」から「使える」レベルに到達できます。
クロスエントロピーは「予測分布と正解分布の差を測る損失」として、 分類モデル学習の中核に位置する。 「接続 (どう繋がるか)」「統合 (どう組み合わせるか)」「比較 (どう使い分けるか)」の 3 視点で隣接手法を整理し、 損失設計の判断材料を提供する。
クロスエントロピーを正しく動かすには、 出力層の確率化とラベル表現、 そして勾配伝播の周辺技術が不可欠。 以下 5 件は実装上ほぼ必ず併用される。
クロスエントロピーは単独で動かず、 分類パイプラインの「損失計算ステップ」として組み込まれる。
| パイプライン | ステップ | クロスエントロピーの役割 |
|---|---|---|
| 画像分類 (ResNet 等) | 画像 → CNN → ロジット → Softmax → CE 損失 → 逆伝播 → 重み更新 | 「予測確率と正解 one-hot のズレ」を損失化し、 自信過剰な誤分類を強く罰する |
| 言語モデル (GPT, BERT) | トークン列 → Transformer → 次トークン確率 → CE 損失 (各位置) → 平均 | 各位置で「正解トークンの予測確率の負対数」を損失とし、 perplexity と直結 |
| 蒸留 (Knowledge Distillation) | 教師モデル softmax (温度 T) → 生徒モデル softmax → 両者の CE (ソフトラベル) | 正解 one-hot ではなく教師の確率分布を目標にし、 暗黙知を伝達 |
「MSE や Hinge Loss ではダメなのか」の判断基準。 損失関数選びは出力分布と問題設定で決まる。
| 状況 | クロスエントロピー | MSE (二乗誤差) | Hinge Loss (SVM) | Focal Loss |
|---|---|---|---|---|
| 多クラス分類 (確率出力) | ○ (定番) | △ (収束遅い) | × (マージン基準) | ○ (CE 拡張) |
| 回帰 (連続値予測) | × (確率前提) | ○ (定番) | × | × |
| クラス不均衡が強い | △ (多数派に引っ張られる) | × | △ | ○ (難例重視) |
| マージン最大化したい | △ (確率重視) | × | ○ (定番) | △ |
| 確率較正 (calibration) を求める | ○ (対数尤度) | △ | × (確率なし) | △ (偏る場合あり) |
原則: 「分類で確率出力が欲しい」→ CE、 「回帰で連続値」→ MSE、 「2 値でマージン重視」→ Hinge、 「不均衡で hard sample 重視」→ Focal。 深層分類のデフォルトは CE + Softmax。
交差エントロピーは分類モデルの代表的損失だが、 出力ヘッドの形・クラス数・分布の偏り・ノイズの 4 段階で派生損失を順番に選ぶ。 上の「🔗 隣接手法への橋渡し」で挙げた Softmax / One-Hot / 対数損失 / 情報エントロピー がこのフローの分岐先になっている。
| シナリオ | 推奨損失 | 主な理由 |
|---|---|---|
| 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 人)。
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 人)から算出した実測値です。