損失と安定性 入門
どんなディープラーニング論文にも出てくるが、誰も改めて説明しない 4 つの道具 —— 「softmax は知ってるよね?」と書かれて初学者は止まり、熟練者でも詳細を忘れる。 自然な 2 つの対:softmax は生のスコアを確率分布に変え、cross-entropy はその分布のずれを測る —— 出力と損失。 さらに dropout はニューロンを確率的に 0 にして正則化し、BatchNorm / LayerNorm は活性のスケールを抑えて非常に深いネットの 訓練を支える —— 訓練安定性の 2 つ。 すべて Transformer の中にある。Transformer 直前の、最後の primer。
Softmax
任意の実ベクトル → きれいな確率分布へ。
ニューラルネットの出力層が返すのは生の実数 —— 負にもなれば 1 を超えるし、スケールも 勝手。これを確率分布として使う(分類でも、アテンションでも、次トークン予測でも 必要だ)には、「すべて正で合計 1」のベクトルに変える必要がある。その標準ツールがsoftmax。
式は 1 行:
softmax(z)_i = exp(z_i) / Σ_j exp(z_j)
要素ごとに exp をかけてすべて正にし、総和で割って合計を 1 にする。 レシピはそれだけ。
具体例:スコア z = (2.0, 1.0, 0.5)。
exp(z) = (7.39, 2.72, 1.65) exp(z) の合計 = 11.76 softmax(z) = (0.628, 0.231, 0.141) ← 合計 1.000
「ベクトル → 分布」のあらゆる候補の中で softmax を既定にしている性質が 3 つある:
- 順序を保つ。
z_a > z_bならsoftmax(z)_a > softmax(z)_b。スコアの argmax は確率の argmax と 一致する —— softmax は「逆伝播できる argmax」。 - 微分可能。純粋な argmax は勾配がどこでも 0 —— 逆伝播では使えない。 softmax は滑らかなので、オプティマイザは確率質量を 1 つのクラスから別のクラスへ 少しずつ移せる。
- 指数で広がる。スコアが大きいほど確率の取り分は指数的に増える。 周りより 2 単位高ければ約 7 倍、5 単位高ければ約 150 倍。「勝者がほとんど取る」 だが「勝者総取り」ではない。
多くの入門が触れない調整つまみがある:温度。softmax(z) を softmax(z / T) に置き換える (T > 0)。T → 0 で分布は one-hot に尖り(最大が すべて取る)、T → ∞ で一様分布に平らになる(全クラスが等しく)。 既定は T = 1。LLM のサンプリングでは、温度がモデルの「創造性」を コントロールするつまみだ —— 高温度では奇抜なトークン、低温度では毎回もっとも ありふれたトークン。
実装上の注意:数値安定性。exp(z_i) は中程度の z_i でもオーバーフローする(float32 で約 700)。コツは、すべての z_i から max(z) を引いてから exp すること。結果は完全に 同じ(定数は比で打ち消し合う)、でも爆発する項はなくなる。実フレームワークは 自動でこれをやる —— だが自分で書く機会があれば、引き算を忘れずに。
Transformer では:softmax は 2 か所に登場し、どちらも欠かせない。アテンションの重み:クエリとキーの生の内積スコアを、系列内の位置上の分布に 変える。これで固定の「注意の予算」を系列に配分できる。出力:最終の線形層が 隠れ状態を約 5 万次元(語彙)の生スコアに写し、softmax が次トークンの確率分布に 変える。モデルは認識する全トークン上で、文字通り合計 1 になる。
交差エントロピー損失
ほぼあらゆる分類器で softmax と組む損失。
softmax はスコアを分布に変える。交差エントロピーは「あなたの分布 vs 正解」を 1 つの 数値 —— 損失 —— に変える。2 つ合わせれば、離散ラベルを扱う論文ならほぼ確実に使われる 標準セットアップだ。ImageNet 分類、言語モデル、Transformer の次トークン予測。
真クラスが c の 1 学習例についての式:
L = −log(p_c)
ここで p_c はモデルが正クラスに割り当てた softmax 確率。損失全体は 「1 つの確率の log を 1 回取る」だけ。一般形 L = −Σ_i y_i log(p_i)(y は one-hot)も、真クラス以外は 0 が掛かって消えるので、同じ式に 帰着する。
グラフから −log(p) を読む:
p_c = 1.00→L = 0。完璧予測、損失は底。p_c = 0.95→L ≈ 0.05。自信を持って正解、損失はわずか。p_c = 0.50→L ≈ 0.69。迷い、損失は有界。p_c = 0.10→L ≈ 2.30。自信を持って間違い、損失は大きい。p_c → 0→L → ∞。モデルが真クラスに確率 0 を割り当てた —— 無限の罰。やめておこう。
「自信を持って正解」と「自信を持って誤り」の非対称性こそが、log を使う理由のすべて。二乗誤差にこの非対称性はない —— 0.5 ずれていれば 真値が 0 でも 1 でも罰は 0.25。交差エントロピーは「どちら側に外したか」を強く 重視し、その結果オプティマイザに鋭い信号を返す:モデルが最も迷っている場所こそ 勾配が最大になる。だからほぼあらゆる分類器は確率に対する MSE ではなく交差 エントロピーを使う。
数学的なボーナス:softmax と交差エントロピーを合成し、softmax 前の logits で 微分すると、答えはすっきり ∂L/∂z_i = p_i − y_i。予測 − 目標、それだけ。 softmax の複雑な微分も −log 由来の連鎖律部分も全部相殺する。 どのフレームワークもこの事実を利用し、2 段を 1 つの融合演算 ("softmax cross-entropy with logits")として提供する。数値的に安定で、 softmax を計算してから −log を取るより約 2 倍速い。
情報理論的な由来。−Σ y_i log p_i は目標分布 y と予測分布 p の交差エントロピー H(y, p)。これは H(y) + KL(y ‖ p) に等しい —— 目標のエントロピー + y から p への KL ダイバージェンス。one-hot 目標では H(y) = 0 なので、交差エントロピーを最小化することはそのまま予測と正解の KL を最小化することと等価。(蒸留や label smoothing など軟目標では両項が効き、本当に欲しいのは KL。)同時に、これはカテゴリカル モデルでの最尤推定とも等価だ。
Transformer では:言語モデルの訓練目標は「データセット内の各バッチの 各系列の各位置における次トークンの交差エントロピー、すべて合計」。数兆トークン、 各トークン 1 個分の交差エントロピー項。GPT-3、GPT-4、Claude、Gemini、LLaMA —— どれも本質的に損失関数はこの 1 行。アーキテクチャがいくら派手でも、 ロスはこれ。
Dropout
乱暴に簡単な正則化:ニューロンを確率的にオフにする。
ネットワークは過学習する、特に深いものは。教師あり primer §5 では穏やかな正則化 (重み減衰、早期停止)を扱った。ここでは乱暴な方を扱う。最初に聞くと非合理的に 感じる:訓練の各順伝播で、ある層のニューロンの半分をランダムにオフにし、存在しない ふりをする。推論ではすべて使う。なぜか異常によく効く。
仕組み:
訓練の順伝播(inverted dropout、p = 残す確率):
m ~ Bernoulli(p) ← ニューロンごと独立
a' = (a · m) / p ← 落として、残った側を増幅
評価の順伝播:
a' = a ← 落とさず、増幅もせず
逆伝播:
∂L/∂a = (∂L/∂a') · m / p ← 勾配は残った側
だけを流れる1/p のスケーリング(「inverted dropout」)で期待値での活性が 評価時と同じになり、推論時に何の補正もいらない。標準の p:全結合の 隠れ層では p = 0.5、入力に近い層では p = 0.9(弱め)、 出力層には通常入れない。
このばかげたレシピが正則化として効く理由:
- 共適応(co-adaptation)が崩れる。dropout なしでは、ニューロン A が 「ニューロン B も発火しているときだけ発火する」と学べる —— 特徴をペアで覚える。 ランダムにどちらかを落とすと、その戦略は機能しない。十分長く dropout 下で訓練 すれば、各ニューロンは「ランダムに選ばれた仲間」と組んでも自分一人で役に立たねば ならなくなる。
- アンサンブル効果。各ランダムマスクは別々のサブネットワークを定める。 dropout 下の訓練は、おおざっぱには「重みを共有した指数的に膨大なサブネットの集合」を 訓練していることになる。推論(dropout なし)はその集合の近似平均で、ここから効きの 良さが出る。
- 純粋なノイズ注入。活性にランダムノイズを加えること自体が正則化に なる —— 厳密なパターンを丸暗記させない。アンサンブル解釈を採らなくても、 少なくともこれは常に当てはまる。
「踏むまで誰も教えてくれない」事項。(1) Dropout は訓練時のみ有効、 推論前にモデルを eval モードに切り替え忘れるのは古典的なバグ。(2) Dropout は 「入力が与えられれば活性は決定的」という前提を壊す —— 同じ入力でも訓練中は 毎回異なる予測を返す。(3) Dropout と BatchNorm(§4)は相性が悪い —— 併用すると 訓練と評価の間に「分散シフト」が生じる。よくある対処:dropout を BatchNorm の後に置く、あるいは BatchNorm があるなら dropout はやめる。
現代の超大規模モデルでは dropout はやや影が薄くなった。データが十分多く、別の 正則化源(重み減衰、データ拡張、スケールそのもの)があるとき、dropout の限界効用は 小さい。それでも Transformer のコードベースには遍在する —— attention dropout、 FFN dropout、residual dropout —— 確率は低い(p = 0.1 など)。 ImageNet 時代の 50% は今はまれ。
Transformer では:通常 3 か所、いずれも低い確率(0.0 – 0.1)。Attention dropout —— アテンションの softmax 出力に、value と掛ける前に。FFN dropout —— FFN サブ層の隠れ活性に。Residual dropout —— 各サブ層の出力に、残差和の前に。dropout 率は最も頻繁にチューニングされる ハイパーパラメータの 1 つで、追加の正則化を必要としない大規模モデルではゼロまで 落とされることも多い。
BatchNorm & LayerNorm
活性を平均 0、標準偏差 1 にリセットする層 —— 各ステップ、各層で。
誤差逆伝播 primer §3 が明確に語ったこと:深層ネットでは、層をまたぐ局所微分の積は 消失するか爆発する傾向がある。そのドリフトに対する最強の武器が、各「線形層」と次の 間に挟まれる正規化層だ。BatchNorm(2015)が最初に広く使われたレシピで、LayerNorm (2016)は Transformer のお気に入り。どちらも:平均と分散を計算し、平均を引き、 標準偏差で割り、学習可能なスケールとバイアスを適用する。
共通レシピ、軸はその派生によって異なる:
活性テンソル x が与えられたとき: μ = mean(x, axis) σ = std (x, axis) x_hat = (x − μ) / (σ + ε) y = γ · x_hat + β ← γ, β は学習可能 平易に言えば: 1. 平均を引く 2. 標準偏差で割る 3. 学習可能なスケールを掛け、学習可能なバイアスを足す
BatchNorm と LayerNorm の違いは 1 行に集約される:μ、σ を どの軸で取るか。
- BatchNorm —— 各特徴をバッチ全体で正規化する。形状
[batch, features]の活性に対し、平均と標準偏差は各列に沿って取られる。各特徴は バッチ全体で平均 0、標準偏差 1 になる。 有意なバッチサイズが必要;発祥:畳み込みネット。 - LayerNorm —— 各サンプルをその特徴全体で正規化する。
[batch, features]なら、平均と標準偏差は各行に沿って取られる。 各サンプルは 自身の特徴次元で平均 0、標準偏差 1 になる。 バッチサイズに一切依存しない;発祥:RNN、その後 Transformer が引き継いだ。
なぜそんなに効くのか:
- 活性が常に有界。訓練中に重みがどう漂っても、次の正規化層が活性を 制御されたスケールに引き戻す。深層ネットの「信号爆発」モードを根絶する。
- 大きな学習率が使える。正規化なしだと、強気のステップが行き過ぎて 活性が NaN になる。正規化があれば、次の正規化層が被害を吸収して再スケールする。
- 勾配の流れが良くなる。正規化は損失地形を「下りやすい」形に 作り変える —— 経験的に観測されており、理論的にはまだ議論がある。(元々の説明 ——「internal covariate shift の軽減」—— には反論もあるが、経験的勝利は議論の余地なし。)
- 軽い正則化。特に BatchNorm は各サンプルの活性に「バッチ依存の ノイズ」を注入する(
μ, σがバッチ内の他のサンプルに依存するため)。 小さいが安定した正則化効果。
実用上の落とし穴。BatchNorm は訓練時(本バッチの統計を使う)と評価時(訓練時統計の 移動平均を使う)で振る舞いが異なる。eval モード切り替え忘れは、batch size = 1 の時に怪しい予測不安定を生む。BatchNorm はとても小さいバッチも苦手(統計推定が ノイジー)、バッチ次元が系列長分散で混雑する系列モデルでも扱いづらい。LayerNorm は これらをすべて回避する —— バッチに依存しないので、訓練と評価が同一。
触れる価値あり:RMSNorm。LayerNorm の小さな簡略化で、平均減算を やめ、入力の二乗平均平方根(RMS)で割るだけ。わずかに高速、パラメータがわずかに少ない (β なし)、Transformer 上の経験的効果は LayerNorm と同等。 LLaMA、Mistral、そして現代のオープンウェイト LLM の大半は、LayerNorm の代わりに RMSNorm を使う。原理は同じ、実装で 2 演算減る。
Transformer では:各サブ層の周りに正規化層(LayerNorm か RMSNorm)が置かれる。現代のブロックは「pre-LN」パターン:y = x + Sublayer(Norm(x)) —— まず正規化、次にサブ層(アテンションか FFN)、最後に残差に加える。このパターンが 50 層以上の非常に深いネットを、特殊な スケジュールなしでゼロから訓練可能にする。2017 年の原 Transformer は「post-LN」 (y = Norm(x + Sublayer(x)))だったが、数年で pre-LN が主流になった —— 目に見えて安定するからだ。任意の現代 LLM のソースを開けば、各 Transformer ブロックの 最初の行は正規化層になっている。