損失関数
損失関数は予測の誤りを数値にし、勾配に基づく学習はその導関数で更新を決めます。同じ答えを誤りと判定しても、修正の強さは損失によって変わります。本課は sigmoid ユニット 1 個、学習例 1 個、同じ学習率で二乗誤差と交差エントロピーを比較します。確信を持って間違えたとき、前者の logit 勾配は約 25 倍小さくなります。
損失から更新へ
確率に変換する前のスコアを logit z と呼びます。
p = σ(z) = 1 / (1 + e⁻ᶻ)
本課は z ← z − η·∂L/∂z と直接更新します。二乗誤差 L = (p − y)² を連鎖律で微分すると、次の式になります。
∂L/∂z = 2(p − y) · p(1 − p)
p(1 − p) は sigmoid の導関数です。二値交差エントロピーでは:
L = −[y log p + (1 − y) log(1 − p)]
∂L/∂z = p − y
sigmoid と組み合わせると p(1 − p) が打ち消されます。勾配の大きさの比は:
1 / (2p(1 − p))
p = 0.5 で最小の 2、p = 0.02 で 25.5、p = 0.001 で約 500 です。sigmoid の端が平らになるほど、二乗誤差の信号は弱くなります。確信して誤る側も例外ではありません。
25.5 は損失の倍率に依存します。½(p − y)² なら比は 51、c(p − y)² なら 1 / (2c·p(1 − p)) です。定数倍で数値は変わっても、予測ごとに変わる因子は消せません。
横軸は z です。p を横軸にすると dp/dz の飽和が隠れます。二乗誤差は左端で平坦になり、交差エントロピーは傾斜を保ちます。輪が二乗誤差、塗りつぶした円が交差エントロピーで、同じ予測から出発します。縦軸には確率の二乗と nat が混在するので、高さは比較しません。同じ学習率で z がどれだけ動くかを比べます。
ステップ実行
既定値は p₀ = 0.02、正解 y = 1、η = 1.00、8 ステップです。初めは「いいえ」を 98% と予測しています。η = 1 では勾配バーの大きさが logit の更新量になります。
| ステップ | 二乗誤差 | 交差エントロピー |
|---|---|---|
| 初期値 | p = 0.02、z = −3.892 | 同じ |
| 損失 | 0.9604 | 3.9120。単位が異なるため大小を比較しない |
| 1 | 勾配 −0.0384、p = 0.0208 | 勾配 −0.9800、p = 0.0516 |
| 2 | 勾配 −0.0398、p = 0.0216 | 勾配 −0.9484、p = 0.1231 |
| 3 | 0.0225 | 0.2523 |
| 4 | 0.0234 | 0.4161 |
| 5 | 0.0245 | z = 0.245、p = 0.5610。判定境界を越える |
| 6–8 | 8 回目で 0.0282 | 0.6647 → 0.7349 → 0.7832 |
最初の勾配比は 25.5 です。同じ横幅に対し、画面の接線は約 6 ピクセルと 145 ピクセル下がります。二乗誤差の 2 回目の勾配増加は 4% 未満で、初期の軌跡は約 55 ピクセルの範囲に集まります。
8 回で交差エントロピーの確率は 0.7632、二乗誤差は 0.0082 増え、進み方には約 93 倍の差があります。それぞれの損失は 94% と 1.7% 下がります。既定の学習率で二乗誤差が p = 0.5 に達するには 33 ステップ必要です。
飽和によって修正が遅くなる理由
p(1 − p) は p = 0.5 で 0.25、0.02 で 0.0196、両端でゼロに近づきます。二乗誤差は誤差信号 2(p − y) にこの因子を掛けるため、sigmoid の裾では正解から遠くても修正が弱まります。
交差エントロピーは y = 1、p → 0 で −log p が増大し、連鎖律を通すと p − y が残ります。出力 sigmoid による減衰を取り除く仕組みであり、他の層の勾配問題まで解決する保証ではありません。
問題は二乗誤差と飽和する出力の組み合わせです。線形出力なら導関数は 2(p − y) で、この減衰因子はありません。そのため二乗誤差は回帰でよく使われます。sigmoid や softmax の分類出力には通常、交差エントロピーを組み合わせます。目的によって別の損失が必要な場合もあります。
η = 5.00 にすると二乗誤差も 8 回目に境界を越えます。ただし学習率は全体に掛かる数で、p(1 − p) はユニット、例、学習段階によって変わります。学習率を上げると他の勾配も増幅されます。実際の重みには ∂L/∂w = (∂L/∂z)·x と伝わるので、出力勾配の縮小はその先の更新にも影響します。
境界ケース
- 迷っている初期値
p₀ = 0.50:比は2.0で、両方が学習し、最終確率は0.775と0.886です。すべての二乗誤差ではなく飽和の問題です。 - ほぼ正解の
p₀ = 0.98、y = 1:比は同じ25.5ですが、勾配の大きさは0.0008と0.0200です。小さな移動でよい状態です。 - 正解が
y = 0:表示はy = 1ですが式は変わりません。p = 0.98で正解が「いいえ」なら、反対側の裾で同じ停滞が起きます。 η = 0.25:どちらも 8 回以内にp = 0.5へ届きません。予算内に届かないことと、永久に収束しないことは別です。- 確率の端点:数学上は有限な logit の sigmoid は 0、1 になりませんが、浮動小数点では端点へ丸められます。生成器は対数の前に確率をクリップして
log(0)を避け、選べる設定では交差エントロピーを有限に保ちます。 - マーカーの重なり:損失がゼロに近づくと輪と円が重なることがあります。実際の位置を描いた結果です。
よくある間違い
- 曲線の高さを比較する。確率の二乗と nat は別の尺度です。同じ
zと学習率での更新を比較します。 - 損失の数値そのものを更新に使うと考える。本課は解析的な勾配を使うので、報告用の損失計算を除いても更新は変わりません。自動微分では勾配を生む計算グラフが必要です。
- 小さな勾配をすべて異常と判断する。正解の近くでは妥当であり、説明すべきなのは誤った側での飽和です。
- 出力関数を見ず、二乗誤差だけを原因にする。
- 本番でも sigmoid の後に対数を計算する。本課は確率を見せるためクリップ付きで計算します。PyTorch の
BCEWithLogitsLossや Keras のfrom_logits=Trueは logit を受け取り、数値的に安定した式へ融合します。 - 学習率の増加で済ませる。全ネットワークの勾配を増幅しても、例ごとに異なる飽和因子は補償できません。
モデルの範囲
実際の sigmoid と解析的勾配を使い、予算は 8 ステップです。二つの独立したモデルの比較であり、一つのモデルが同時に二つの損失を最適化しているわけではありません。実際はミニバッチの例や出力で平均し、z = w·x + b の重みを更新します。本課は幾何を見せるため z を直接更新し、正則化、モメンタム、Adam は使いません。