中心極限定理の可視化
完全に正規分布ではない一様分布から繰り返しサンプリングして平均を求め、平均の分布がどのように鐘形に近づくかを観察します。
このケースを学び終えると、以下のことが理解できます:なぜガウス分布が AI の中で至る所に現れるのか——それは多数の独立な要因が重なり合った必然的な結果だからです。
生活からの導入
クラス全員の平均身長はなぜいつも鐘形になるのか?
クラス全員50人の身長を測定します。個人の身長は遺伝子、栄養、運動、睡眠……など数百の要因の影響を受けます。各要因の影響は大きかったり小さかったり、正だったり負だったりします。
多くの独立した小さな要因が重なり合うとき、最終結果の分布は鐘形になります——これは数学の定理であり、偶然ではありません。中心極限定理が言っているのは、多数の独立な確率変数の和(または平均)は正規分布に近づくということです。
直感的な理解
一様分布 U(0,1) からサンプリングします——この分布は完全に平坦で、鐘形とは全く関係ありません。しかし、毎回複数のサンプル(例えば30個)を抽出して1回の平均を求め、この操作を5000回繰り返すと——この5000個の平均を描いたヒストグラムが鐘形に似てきます。n が大きいほど、完全な正規分布に近づきます。
数学的定義
\[ \frac{\bar{X}_n - \mu}{\sigma / \sqrt{n}} \xrightarrow{d} \mathcal{N}(0, 1) \]ここで \(\bar{X}_n = \frac{1}{n}\sum X_i\) です。平均の標準偏差は \(1/\sqrt{n}\) の割合で縮小します。
Python で実践
実例
import numpy as np
np.random.seed(2)
def sample_raw(size):
return np.random.uniform(0, 1, size=size)
def clt_experiment(n, repeat=5000):
means = [sample_raw(n).mean() for _ in range(repeat)]
return np.array(means)
sample_sizes = [1, 2, 5, 30]
results = {n: clt_experiment(n) for n in sample_sizes}
print("サンプル 中心極限定理の検証:\n")
print("元の分布: 一様分布 U(0,1)(完全に平坦)")
print("理論: 平均の標準偏差 = 1/sqrt(12n)\n")
print(f"{'n':<6} {'平均SD':<12} {'理論値':<12} {'一致'}")
print("-" * 42)
for n, means in results.items():
theo = 1 / np.sqrt(12 * n)
ok = "Yes" if abs(means.std() - theo) < 0.01 else "No"
print(f"{n:<6} {means.std():<12.4f} {theo:<12.4f} {ok}")
# n=30 の正規性検定
m30 = results[30]
skew = np.mean(((m30-m30.mean())/m30.std())**3)
kurt = np.mean(((m30-m30.mean())/m30.std())**4) - 3
print(f"\nサンプル n=30 のとき:歪度={skew:.3f} (約0), 超過尖度={kurt:.3f} (約0)")
np.random.seed(2)
def sample_raw(size):
return np.random.uniform(0, 1, size=size)
def clt_experiment(n, repeat=5000):
means = [sample_raw(n).mean() for _ in range(repeat)]
return np.array(means)
sample_sizes = [1, 2, 5, 30]
results = {n: clt_experiment(n) for n in sample_sizes}
print("サンプル 中心極限定理の検証:\n")
print("元の分布: 一様分布 U(0,1)(完全に平坦)")
print("理論: 平均の標準偏差 = 1/sqrt(12n)\n")
print(f"{'n':<6} {'平均SD':<12} {'理論値':<12} {'一致'}")
print("-" * 42)
for n, means in results.items():
theo = 1 / np.sqrt(12 * n)
ok = "Yes" if abs(means.std() - theo) < 0.01 else "No"
print(f"{n:<6} {means.std():<12.4f} {theo:<12.4f} {ok}")
# n=30 の正規性検定
m30 = results[30]
skew = np.mean(((m30-m30.mean())/m30.std())**3)
kurt = np.mean(((m30-m30.mean())/m30.std())**4) - 3
print(f"\nサンプル n=30 のとき:歪度={skew:.3f} (約0), 超過尖度={kurt:.3f} (約0)")
サンプル 中心极限定理验证: 原始分布: 均匀分布 U(0,1)(完全平的) 理论: 均值的标准差 = 1/sqrt(12n) n 均值SD 理论值 匹配 ------------------------------------------ 1 0.2891 0.2887 Yes 2 0.2043 0.2041 Yes 5 0.1292 0.1291 Yes 30 0.0526 0.0527 Yes サンプル n=30 时:偏度=-0.023 (应~0), 超峰度=-0.005 (应~0)
AI での応用シーン
| シーン | CLT との関連 |
|---|---|
| Batch Normalization | 各 mini-batch 内の活性化値が近似的に正規分布に従うと仮定し、平均を引き標準偏差で割る |
| 重みの初期化 | Xavier/He 初期化は正規分布から初期重みをサンプリングする |
| 誤差のモデリング | 回帰問題では誤差が正規分布に従うと仮定する——誤差は複数の未モデル化要因が重なり合った結果である |