ひとことで言うと
二値交差エントロピー(BCE)は、正解ラベルが0または1の分類で、予測確率が正解にどれだけ整合するかを測る損失です。正解の確率を高く、誤った確率を低く予測するほど小さくなります。
確率予報に対する採点表です。「晴れ」と断言して外した予報には大きく罰を与え、当たった予報にも確信の度合いに応じた点を付けます。0.5からの距離だけを見る採点ではないため、迷いのない誤答を強く区別できます。
なぜ必要か
二乗誤差は予測値とラベルの距離を測るだけなので、分類器が確率を出す仕組みと勾配の流れが噛み合いません。ロジットを 、シグモイドを とすると、予測確率は です。BCEはこの確率をベルヌーイ分布の尤度として扱い、正解が起きる確率を最大化する方向に学習させます。
GANの原論文でも、データ由来か生成由来かを判定する識別器の確率を扱い、識別器と生成器の目的を対数確率で組み立てています。BCEは単なる「0/1との距離」ではなく、確率予測の対数尤度に対応する損失です。
分類器の最終層がすでに確率を返す設計か、ロジットを返す設計かで呼ぶ損失が変わります。ここを取り違えると、シグモイドを二重に通したり、確率でない値を対数に入れたりします。
仕組み
正解を 、モデルの予測確率を とすると、1例の損失は次です。
は正解ラベル、 はクラス1である確率です。なら 、なら だけが残るため、正解側の確率を上げるほど損失が下がります。バッチでは各例の損失を平均または合計します。
ここで と置いて微分すると、シグモイドの微分 と対数の微分が打ち消し合い、
になります。ロジットへの勾配が「予測−正解」だけになるのが、シグモイドとBCEを組み合わせる理由です。
一方、シグモイドの出力に二乗誤差をかけると、勾配には が残ります。 が0または1に飽和したときこの因子がほぼ0になり、誤答でも更新が進みにくくなります。BCEではその因子が相殺されるため、ロジットが極端な領域でも勾配の形が保たれます。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 損失の式を選ぶ | にマイナスを付ける | 二乗誤差や符号の落とし忘れ |
| 勾配を求める | シグモイド+BCEなら | を残す |
| 入力の種類を判定する | BCEは確率、logits版はシグモイド前の値 | ロジットを確率として二重にシグモイド |
| 飽和の説明 | 二乗誤差ではシグモイド微分が残る | 「BCEの勾配も常に大きい」とする |
実装で確かめる
実装では確率を作ってからBCEを計算するより、ロジットを直接受け取る関数を選びます。下の式は、正のロジット側と負のロジット側を分けて計算する安定な形です。
import numpy as np
z = np.array([20.0, -20.0, 0.0])
y = np.array([1.0, 0.0, 1.0])
stable = np.maximum(z, 0) - z * y + np.log1p(np.exp(-np.abs(z)))
p = 1 / (1 + np.exp(-z))
print(np.round(stable, 6))
print(np.round(p - y, 6))
出力は [0. 0. 0.693147] と [-0. 0. -0.5] です。z が大きいときに p を先に1へ丸めてから log(1-p) を計算すると、有限精度では不安定になります。PyTorchのBCELossも確率入力を対象に境界での対数を扱いますが、モデル出力のロジットを使える場合は、シグモイドとBCEを一体化した関数を使う判断になります。
取り違えやすいもの
| 用語 | 切り分け |
|---|---|
| 二乗誤差 | 連続値の距離を測る損失。シグモイドと組み合わせると飽和因子が勾配に残る |
| BCE | 確率 を入力し、ベルヌーイの負の対数尤度を測る |
| BCE with logits | ロジット を直接入力し、シグモイドとBCEを数値安定にまとめて計算する |
| 多クラス交差エントロピー | クラスが2つに限られない設定。今回の二値の出力形式とは異なる |
想起チェック
BCEが二乗誤差より二値分類に向く理由は
確率の対数尤度に対応し、シグモイドと組み合わせたロジット勾配が になるためです。
BCEの入力が確率かロジットかを見分けるには
0から1の確率を渡すのがBCE、シグモイド前の実数を渡すのがlogits版です。後者にシグモイドを別途二重適用しません。
シグモイド+二乗誤差で学習が止まりやすい因子は
シグモイドの微分 です。予測確率が0または1に近いとほぼ0になります。