統計的基礎:データ分布の記述
深層学習モデルの挙動を理解するには、データ分布を要約する統計量の把握が不可欠です。特に平均値と分散は、モデルの内部状態を分析する際の基本指標となります。
1. 平均値 (Mean)
平均値は、データセットの中央傾向を示す代表値です。集合内の各値を合計し、その個数で割ることで算出されます。
- 理論式: 全体平均
μ = (1/N) Σ x_i、標本平均x̄ = (1/n) Σ x_i - 役割: 分布の中心位置、つまり期待値を表します。
PyTorch における計算例を示します。手動計算と内置関数の両方を用いて確認できます。
import torch
# データの作成
values = torch.arange(1.0, 5.0) # [1., 2., 3., 4.]
# 手動での平均計算
manual_avg = values.sum() / values.size(0)
# 内置関数の利用
auto_avg = torch.mean(values) # 結果: 2.5
# 高維張量における次元指定
matrix = torch.randn(4, 10) # 4 サンプル、10 特徴量
avg_per_feature = torch.mean(matrix, dim=0) # 形状 (10,)
2. 分散 (Variance) と標準偏差 (Standard Deviation)
これらの指標は、データが平均値からどれだけ散らばっているかを定量化します。
- 理論式:
- 分散:
σ² = (1/N) Σ (x_i - μ)²(母分散) - 不偏分散:
s² = (1/(n-1)) Σ (x_i - x̄)²(標本分散)
- 分散:
- 標準偏差: 分散の平方根であり、元のデータと同じ単位を持ちます。
- 役割: 値のばらつき具合を示します。値が大きいほど分布は広がっています。
# 分散と標準偏差の計算
var_unbiased = torch.var(values, correction=1) # 不偏分散 (n-1)
var_population = torch.var(values, correction=0) # 母分散 (n)
std_dev = torch.std(values) # 標準偏差
# バッチ処理での応用
batch_data = torch.randn(32, 128) # (バッチサイズ,特徴量)
feature_variance = torch.var(batch_data, dim=0) # 特徴量ごとの分散
確率分布:重み初期化の設計図
ニューラルネットワークの学習成否は、初期重みの分布選択に大きく依存します。主に一様分布と正規分布が利用されます。
1. 一様分布 (Uniform Distribution)
指定された区間 [a, b) において、すべての値が出現する確率が等しい分布です。
- 確率密度関数:
f(x) = 1/(b-a)(a ≤ x < b)
# 一様分布からのサンプリング
lower, upper = -0.05, 0.05
uniform_samples = (upper - lower) * torch.rand(1000) + lower
# 重み行列への適用
weight_matrix = torch.empty(512, 256)
torch.nn.init.uniform_(weight_matrix, a=-0.1, b=0.1)
2. 正規分布 (Normal Distribution)
平均 μ と標準偏差 σ で定義される鐘型の曲線を描く分布です。自然現象や誤差分布モデルとして広く用いられます。
- 確率密度関数:
f(x) = (1/(σ√(2π))) * exp(-(x-μ)²/(2σ²))
# 正規分布からのサンプリング
mu, sigma = 0.0, 0.01
normal_samples = torch.normal(mean=mu, std=sigma, size=(1000,))
# He 初期化の例 (ReLU 激活関数向け)
# std = sqrt(2 / fan_in)
layer_weights = torch.empty(512, 256)
input_units = layer_weights.size(1)
std_he = (2.0 / input_units) ** 0.5
torch.nn.init.normal_(layer_weights, mean=0.0, std=std_he)
分布特性の比較
| 特性 | 一様分布 | 正規分布 |
|---|---|---|
| 密度形状 | 平坦 (矩形) | 中央集中 (ベル曲線) |
| 定義パラメータ | 最小値 a, 最大値 b | 平均 μ, 標準偏差 σ |
| 初期化の性質 | 区間内均等 | 平均値周辺に密集 |
| 主な用途 | 初期の Transformer など | 現代の標準 (He/Xavier) |
| 注意点 | 区間幅による勾配問題 | 標準偏差による安定性変化 |
正規化技術:バッチ正規化の仕組み
バッチ正規化 (Batch Normalization) は、学習過程における内部共変量シフトを抑制し、収束を促進する標準的な技術です。これは前述の平均と分散の計算をベースとしています。
1. 算法フロー
ミニバッチ B = {x_1, ..., x_m} に対して以下の処理を行います。
- 統計量の算出: バッチ平均
μ_Bとバッチ分散σ²_Bを計算。 - 正規化:
x̂_i = (x_i - μ_B) / √(σ²_B + ε)。ここでεは数値安定化のための定数です。 - affine 変換:
y_i = γ * x̂_i + β。学習可能なパラメータγ,βで表現力を回復させます。
2. 実装例
import torch.nn as nn
# 内置レイヤーの利用
norm_layer = nn.BatchNorm1d(num_features=128)
# 順伝播
input_batch = torch.randn(32, 128)
output = norm_layer(input_batch)
# 内部動作の簡易再現
def manual_batch_norm(x, gamma=1.0, beta=0.0, eps=1e-5):
mean_batch = x.mean(dim=0)
var_batch = x.var(dim=0, correction=0)
x_normalized = (x - mean_batch) / torch.sqrt(var_batch + eps)
return gamma * x_normalized + beta
3. 効果と派生技術
バッチ正規化は学習率を大きく設定可能にし、損失関数の地形を滑らかにします。また、バッチ統計量に含まれるノイズが正則化効果をもたらすこともあります。
用途に応じて、統計量を計算する次元が異なる派生手法が存在します。
| 手法 | 統計量計算の軸 | 適用场景 |
|---|---|---|
| バッチ正規化 | バッチ次元 | CNN, 全結合層 (バッチ大) |
| レイヤー正規化 | 特徴量次元 | Transformer, RNN (序列長非依存) |
| インスタンス正規化 | サンプル・チャネル毎 | スタイル変換,GAN |
| グループ正規化 | チャネルをグループ化 | 小バッチ学習 (検出,動画) |