一文要約:LayerNorm は学習が横道に逸れないようにするスタビライザ、Softmax は任意のスコアを妥当な確率分布に変換するコンバータです。


6.1 なぜこの 2 つの道具が重要なのか

Transformer アーキテクチャにおける LayerNorm と Softmax の位置

Transformer ブロックは、トークンごとに行列積を何十回も実行します。32 ブロックを積み重ねれば、数値は劇的にドリフトする可能性があります。ある活性化は数万まで爆発し、別のものはほぼゼロまでつぶれる。そうなれば勾配は消失するかオーバーフローし、学習は失敗します。

これを防ぐ軽量な操作が 2 つあります。

  • LayerNorm は Transformer ブロックの内部に登場します——元の設計ではブロックごとに 2 回——活性化の大きさを妥当な範囲に保ちます。
  • Softmax は Attention の中、そして最終出力層に登場し、素のスコアベクトルを正しい確率分布に変換します。

どちらも複雑ではありません。それでも、システムが学習できるかどうかに不釣り合いに大きな影響を持ちます。


6.2 LayerNorm:スケールを妥当に保つ

6.2.1 問題:数値はドリフトする

ニューラルネットワークのレイヤーは掛け算と足し算を繰り返します。十分な回数繰り返せば、暴走的な拡大が起こります。

大きすぎる:  10,000   100,000    オーバーフロー、学習中に NaN
小さすぎる:  0.0001   0.00001    勾配消失、モデルは学習を止める

解決策は正規化です。各レイヤーの境界で、数値を予測可能な範囲に戻します。

6.2.2 LayerNorm が行うこと

LayerNorm は各トークンベクトルを独立に正規化する

Layer Normalization は、1 つのトークンベクトル内の特徴値を正規化します。各トークンに対して以下を行います。

  1. d_model 次元すべての平均を計算する
  2. 分散を計算する
  3. 平均を引き、標準偏差で割る
  4. 学習可能なスケール γ とシフト β を適用する

数式:

y = (x - μ) / (σ² + ε) × γ + β

分解すると:

  • x - μ:平均を引き、結果をゼロ中心にする
  • / (σ² + ε):標準偏差で割り、広がりを 1 にする。小さな ε(典型的には 1e-5)はゼロ除算を防ぐ
  • × γ + β:学習可能なスケールとバイアスを適用する。これにより、別の出力レンジが有用だとモデルが判断したときにそれを選べる。γβ10 から始まり、学習中に更新される

6.2.3 計算例

あるトークンの 4 次元の活性化ベクトルが [22, 5, 6, 8] だとします。

ステップ 1:平均を計算

μ = (22 + 5 + 6 + 8) / 4 = 41 / 4 = 10.25

ステップ 2:分散を計算

σ² = ((22 - 10.25)² + (5 - 10.25)² + (6 - 10.25)² + (8 - 10.25)²) / 4
   = (138.06 + 27.56 + 18.06 + 5.06) / 4
   = 47.19

ステップ 3:正規化

dim0: (22 - 10.25) / √47.19 = 11.75 / 6.87   1.71
dim1: ( 5 - 10.25) / √47.19 = -5.25 / 6.87  -0.76
dim2: ( 6 - 10.25) / √47.19 = -4.25 / 6.87  -0.62
dim3: ( 8 - 10.25) / √47.19 = -2.25 / 6.87  -0.33

結果は [1.71, -0.76, -0.62, -0.33]。平均 ≈ 0、分散 ≈ 1。入力がどれほど極端でも、出力は行儀よくなります。

6.2.4 PyTorch 実装

import torch
import torch.nn as nn

layer_norm = nn.LayerNorm(normalized_shape=4, bias=True)

x = torch.tensor([[22.0, 5.0, 6.0, 8.0]])
y = layer_norm(x)
print(y)  # おおよそ [1.71, -0.76, -0.62, -0.33]

nn.LayerNorm が上の数式を扱ってくれます。normalized_shape はどの次元で正規化するかを指定します。実際の Transformer では、この次元は d_model です。

6.2.5 なぜ「Layer」ノルムなのか

正規化はトークンごとに、特徴(レイヤー)次元にわたって適用されます——バッチ次元ではありません。各トークンのベクトルは独立に正規化され、異なるトークンは互いの統計量に干渉しません。

これは Batch Normalization とは対照的です。Batch Norm はバッチ次元で正規化します。画像モデルでは一般的ですが、可変長のシーケンスとは相性が悪い。LayerNorm が Transformer の標準的な選択肢です。

6.2.6 LayerNorm が現れる場所

各 Transformer ブロックの中で、LayerNorm は 2 回登場します。

Input
  
LayerNorm                   <- 1 回目
  
Masked Multi-Head Attention
  
残差接続
  
LayerNorm                   <- 2 回目
  
Feed Forward Network (FFN)
  
残差接続
  
Output

オリジナルの Transformer 論文ではこれは「post-norm」(サブ層の後に LayerNorm)でした。最近の LLM の多くは「pre-norm」(上図のとおりサブ層の前に LayerNorm)を採用しています。学習時の安定性が高いからです。


6.3 Softmax:スコアを確率に変える

6.3.1 問題:確率が必要

Transformer で確率分布を必要とする場所は 2 つあります。

  • Attention の中:Query と Key ベクトルの間で素の類似度スコアを計算したあと、合計が 1 になる重みが必要
  • 最終出力:最後の隠れ状態を語彙に射影したあと、すべての候補次トークンに対する分布が必要

確率には 2 つの要件があります。各値が 0 から 1 の間であること、そしてすべての値の合計が厳密に 1 であること。行列積の素のスコアはどちらも満たしません。

6.3.2 Softmax が行うこと

Softmax は素のロジットを確率分布に変換する

Softmax は、任意の実数ベクトルを妥当な確率分布に変換します。

語彙出力を例にとってみます——4 つの候補次トークンに対するモデルの素のスコア(ロジット)です。

入力ロジットrequest = 3.01, tab = 0.09, quote = 2.48, other = 1.95

出力確率request = 50.28%, tab = 2.71%, quote = 29.59%, other = 17.42%

Softmax のあと:

  • 各値は 0 から 1 の間
  • 合計は 100%

6.3.3 Softmax の数式

softmax(z)i=ezijezj\text{softmax}(z)_i = \frac{e^{z_i}}{\sum_j e^{z_j}}

言葉にすると:

  1. e 2.718 を各スコアの指数にする
  2. 各結果をすべての結果の合計で割る

6.3.4 計算例

入力ロジット:[3.01, 0.09, 2.48, 1.95]

ステップ 1:指数化

e^3.01 = 20.29
e^0.09 =  1.09
e^2.48 = 11.94
e^1.95 =  7.03

ステップ 2:合計

total = 20.29 + 1.09 + 11.94 + 7.03 = 40.35

ステップ 3:割る

request: 20.29 / 40.35 = 0.5028 = 50.28%
tab:      1.09 / 40.35 = 0.0271 =  2.71%
quote:   11.94 / 40.35 = 0.2959 = 29.59%
other:    7.03 / 40.35 = 0.1742 = 17.42%

6.3.5 知っておきたい 3 つの性質

1. 差を増幅する:ロジット空間で 2 の差は、確率空間ではずっと大きな差を生みます。最大のロジットが支配的になります。

2. 順序を保つ:ロジット A > ロジット B なら、P(A) > P(B)。最高スコアは最高確率のままです。

3. 負の入力を扱える:指数化は常に正の数を返す(任意の xe^x > 0)ので、負のロジットからも妥当な確率が得られます。

6.3.6 PyTorch 実装

import torch
import torch.nn.functional as F

logits = torch.tensor([3.01, 0.09, 2.48, 1.95])

probs = F.softmax(logits, dim=0)
print(probs)       # tensor([0.5028, 0.0271, 0.2959, 0.1742])
print(probs.sum()) # tensor(1.0000)

6.4 アーキテクチャ内での位置

6.4.1 完全な出力フロー

最終 Transformer ブロックから LayerNorm、線形射影、Softmax を経る出力フロー

最後の Transformer ブロックから次トークン予測まで:

Transformer ブロック出力
        
最終 LayerNorm
        
線形射影 (d_model  vocab_size)
        
Softmax (ロジット  確率)
        
サンプリングまたは argmax で次トークンを選ぶ

線形射影は最終隠れ状態を d_model 次元から vocab_size 次元へ写します。d_model = 4096vocab_size = 100,256 なら、これは大きな行列です:4096 × 100,256 4.1 億パラメータ。よく LM Head(Language Model Head)と呼ばれます。

6.4.2 2 つがどう協働するか

LayerNorm と Softmax は別々の場所で別々の仕事をしますが、協働します。

  1. LayerNorm はサブ層間の活性化を安定化し、行列積の数値条件が良好な範囲に保つ
  2. すべての計算のあと、最終隠れ状態はもう 1 度 LayerNorm を通り、それから LM Head へ
  3. Softmax が最後で LM Head の出力を妥当な次トークン分布に変換する

Attention の中では、Softmax はもっと小さなスケールで同じ仕事をします。素の Q · K 類似度スコアを、合計 1 のアテンション重みに変換するのです。


6.5 Temperature:分布の形を制御する

推論 API を呼ぶときに temperature を設定すると、出力層での Softmax の挙動を変えています。

6.5.1 Temperature の数式

softmax(z/T)i=ezi/Tjezj/T\text{softmax}(z / T)_i = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}}

Softmax の前にロジットを T で割ると、結果の分布の形が変わります。

  • T < 1(低温度):小さい数で割ることで、大きいロジットが相対的にさらに大きくなる。分布は鋭くなり——上位トークンが支配的になる
  • T = 1(既定):標準の Softmax、変更なし
  • T > 1(高温度):ロジットの差が縮む。分布は平坦になり——確率の低いトークンにより多くの重みが配分される

6.5.2 数値例

ロジット:[3.0, 1.0, 0.5]

Temperature確率(おおよそ)性格
T = 0.5[0.98, 0.02, 0.01]非常に決定的——ほぼ常に上位トークンを選ぶ
T = 1.0[0.82, 0.11, 0.07]標準的な分布
T = 2.0[0.60, 0.22, 0.17]より広がる——下位トークンにもチャンス

値は softmax(logits / T) で計算し、小数点以下 2 桁に丸めています。

6.5.3 実用上の含意

モデル API を使うときは:

  • temperature = 0:貪欲デコード——常に最高確率のトークンを選ぶ。決定論的だが、繰り返しがちになる
  • temperature = 0.7:プロダクションでよく使われる値。一貫性と多様性のバランス
  • temperature = 1.0+:より多様で創造的、しかし崩壊する可能性もある

ここは多くの人が誤診しがちな部分です。モデルの出力が退屈で繰り返しがちなら、最初に問うべきはサンプリング設定が問題かどうかであって、モデルに能力がないかではない。出力が支離滅裂でも、問いは同じです。Temperature はデコーダ側のダイヤルであって、モデルの賢さの指標ではありません。


6.6 章のまとめ

6.6.1 並列比較

項目LayerNormSoftmax
目的活性化を正規化スコアを確率に変換
出力範囲平均 = 0、std = 1(スケール/シフト前)各要素 [0, 1]、合計 1
登場場所Transformer ブロック内に 2 回Attention 内、最終出力
学習可能パラメータあり(γβなし(ただし temperature はハイパーパラメータ)

6.6.2 数式リファレンス

LayerNorm

y = (x - mean(x)) / std(x) × γ + β

Softmax

P(i) = e^(x_i) / Σ_j e^(x_j)

Temperature 付き Softmax

P(i) = e^(x_i / T) / Σ_j e^(x_j / T)

6.6.3 中核のテイクアウェイ

LayerNorm は Transformer のスタビライザです。中間活性化を行儀のよい範囲に保ち、学習を収束させる。Softmax は確率コンバータです。Attention の中でも最終予測でも、素のスコアを妥当な分布に変える。コードでは小さく、影響では大きい 2 つの道具です。


章末チェックリスト

この章の後で、あなたは以下ができるはずです。

  • LayerNorm が必要な理由を説明できる:行列積の積み重ねが活性化のドリフトを起こすこと
  • 小さな入力ベクトルが与えられたときに LayerNorm の計算を手で追える
  • Softmax を「指数化してから正規化する」操作として説明できる
  • 小さなロジットベクトルが与えられたときに Softmax の計算を手で追える
  • Transformer アーキテクチャの中で LayerNorm と Softmax がどこに現れるかを言える
  • Temperature が何を制御し、低い/高い値の実用的な効果が何かを説明できる

次の章でまた

ここまでで本章はおしまいです。これで、システム全体を静かに支える 2 つの軽量な道具をカバーしました。Transformer ブロックの図の中で LayerNorm と Softmax がどこに現れるかをあなたが描けるなら、先に進む準備ができています。

第 7 章では Feed Forward Network を紹介します——各 Transformer ブロックの内部にあるもう 1 つの主要コンポーネントで、モデルのパラメータの大半を保持しています。良いお知らせ:行列積と活性化関数を理解していれば、FFN は素直です。次の章でまた。

このページを引用する
Zhang, Wayland (2026). 第6章: LayerNorm と Softmax — 数値を確率にスケーリングする. In Transformer アーキテクチャ:直感から実装まで. https://waylandz.com/llm-transformer-book-ja/chapter-06-layernorm-softmax
@incollection{zhang2026transformer_ja_chapter_06_layernorm_softmax,
  author = {Zhang, Wayland},
  title = {第6章: LayerNorm と Softmax — 数値を確率にスケーリングする},
  booktitle = {Transformer アーキテクチャ:直感から実装まで},
  year = {2026},
  url = {https://waylandz.com/llm-transformer-book-ja/chapter-06-layernorm-softmax}
}