情報理論は、1948年にクロード・シャノンが発表した論文「通信の数学的理論」に端を発する分野です。シャノンは「情報量」を数学的に定義し、通信システムの理論的限界を明らかにしました。
自己情報量(self-information)とエントロピー(entropy)は情報理論の最も基本的な概念です。これらを理解することは、データ圧縮、通信理論、機械学習(決定木、交差エントロピー損失)など、多くの応用の基礎となります。
本記事の内容
- 自己情報量の定義と直感的な意味
- シャノンエントロピーの定義と性質
- KLダイバージェンス(相対エントロピー)
- Pythonでの計算と可視化
前提知識
この記事を読む前に、以下の概念を理解しておくと理解が深まります。
- 確率の基本
- 対数の性質
自己情報量
情報量の直感
まず、「情報量」とは何かを直感的に考えてみましょう。
- 「明日、太陽が東から昇る」— ほぼ確実なので、情報量は少ない
- 「明日、大地震が起きる」— 滅多に起きないので、起きたら情報量が大きい
つまり、珍しい出来事ほど情報量が大きいのです。
定義
事象 $A$ が確率 $P(A) = p$ で起きるとき、$A$ の自己情報量(self-information)は
$$ I(A) = -\log_2 p = \log_2 \frac{1}{p} $$
で定義されます。単位はビット(bit)です。底を $e$ にすると単位はナット(nat)になります。
自己情報量の性質
- 非負性: $I(A) \geq 0$($0 < p \leq 1$ なので)
- 確実な事象: $p = 1 \Rightarrow I(A) = 0$(確実なことに情報はない)
- 稀な事象: $p \to 0 \Rightarrow I(A) \to \infty$
- 加法性: 独立な事象 $A, B$ について $I(A \cap B) = I(A) + I(B)$
性質4は対数の性質から従います。
$$ I(A \cap B) = -\log_2 P(A)P(B) = -\log_2 P(A) – \log_2 P(B) = I(A) + I(B) $$
具体例
公正なコインの表が出る自己情報量:
$$ I(\text{表}) = -\log_2 \frac{1}{2} = 1 \text{ bit} $$
公正なサイコロで1が出る自己情報量:
$$ I(1) = -\log_2 \frac{1}{6} = \log_2 6 \approx 2.585 \text{ bits} $$
シャノンエントロピー
定義
離散確率変数 $X$ が値 $x_1, x_2, \dots, x_n$ を確率 $p_1, p_2, \dots, p_n$ で取るとき、$X$ のシャノンエントロピーは
$$ H(X) = -\sum_{i=1}^{n} p_i \log_2 p_i = E[I(X)] $$
です。エントロピーは自己情報量の期待値です。
エントロピーの意味
エントロピーは確率変数の不確実性(ランダムさ)の度合いを測ります。
- エントロピーが大きい = 不確実性が高い = 予測しにくい
- エントロピーが小さい = 不確実性が低い = 予測しやすい
情報圧縮の観点では、エントロピーはデータを表現するのに必要な最小の平均ビット数です(シャノンの情報源符号化定理)。
エントロピーの性質
非負性
$$ H(X) \geq 0 $$
等号は $X$ が確定的(ある値を確率1で取る)のときに成り立ちます。
最大化条件
$n$ 個の値を取る確率変数のエントロピーは、一様分布のとき最大になります。
$$ H(X) \leq \log_2 n $$
等号は $p_1 = p_2 = \cdots = p_n = 1/n$ のときに成り立ちます。
2値エントロピー関数
$X$ が2値($P(X=1) = p$, $P(X=0) = 1-p$)のとき、
$$ H(p) = -p\log_2 p – (1-p)\log_2(1-p) $$
$p = 1/2$ のとき $H = 1$ bit(最大)、$p = 0$ または $p = 1$ のとき $H = 0$ です。
条件付きエントロピー
$Y$ が与えられたときの $X$ の条件付きエントロピーは、
$$ H(X \mid Y) = -\sum_{x, y} p(x, y) \log_2 p(x \mid y) $$
条件付きエントロピーは「$Y$ を知った後の $X$ の残りの不確実性」を表します。
連鎖律:
$$ H(X, Y) = H(X) + H(Y \mid X) = H(Y) + H(X \mid Y) $$
KLダイバージェンス
定義
2つの確率分布 $P$ と $Q$ のKLダイバージェンス(Kullback-Leibler divergence、相対エントロピー)は、
$$ D_{\text{KL}}(P \| Q) = \sum_{x} P(x) \log_2 \frac{P(x)}{Q(x)} $$
性質
- $D_{\text{KL}}(P \| Q) \geq 0$(ギブスの不等式)
- $D_{\text{KL}}(P \| Q) = 0 \iff P = Q$
- 一般に $D_{\text{KL}}(P \| Q) \neq D_{\text{KL}}(Q \| P)$(非対称)
KLダイバージェンスは「$Q$ の代わりに $P$ を使ったときの余分なビット数」と解釈できます。
交差エントロピーとの関係
交差エントロピーは、
$$ H(P, Q) = -\sum_x P(x) \log_2 Q(x) = H(P) + D_{\text{KL}}(P \| Q) $$
機械学習のクラス分類で使われる交差エントロピー損失は、予測分布と真の分布のKLダイバージェンスを最小化していることに対応します($H(P)$ は定数なので)。
Pythonでの計算と可視化
2値エントロピー関数
import numpy as np
import matplotlib.pyplot as plt
p = np.linspace(0.001, 0.999, 500)
H = -p * np.log2(p) - (1 - p) * np.log2(1 - p)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(p, H, 'b-', linewidth=2)
ax.set_xlabel('$p$')
ax.set_ylabel('$H(p)$ (bits)')
ax.set_title('Binary entropy function $H(p) = -p\\log_2 p - (1-p)\\log_2(1-p)$')
ax.axhline(y=1, color='r', linestyle='--', alpha=0.5, label='$H_{\\max} = 1$ bit')
ax.axvline(x=0.5, color='gray', linestyle='--', alpha=0.5)
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('binary_entropy.png', dpi=150, bbox_inches='tight')
plt.show()
エントロピーの最大化(一様分布)
import numpy as np
import matplotlib.pyplot as plt
def entropy(probs):
"""シャノンエントロピーの計算"""
probs = probs[probs > 0] # log(0)を避ける
return -np.sum(probs * np.log2(probs))
# サイコロの例: さまざまな偏りでのエントロピー
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# (1) 一様分布(最大エントロピー)
probs1 = np.ones(6) / 6
ax = axes[0]
ax.bar(range(1, 7), probs1, color='steelblue')
ax.set_title(f'Uniform: $H = {entropy(probs1):.3f}$ bits')
ax.set_xlabel('Face')
ax.set_ylabel('Probability')
ax.set_ylim(0, 0.8)
# (2) やや偏った分布
probs2 = np.array([0.3, 0.25, 0.2, 0.1, 0.1, 0.05])
ax = axes[1]
ax.bar(range(1, 7), probs2, color='orange')
ax.set_title(f'Skewed: $H = {entropy(probs2):.3f}$ bits')
ax.set_xlabel('Face')
ax.set_ylabel('Probability')
ax.set_ylim(0, 0.8)
# (3) 非常に偏った分布
probs3 = np.array([0.9, 0.02, 0.02, 0.02, 0.02, 0.02])
ax = axes[2]
ax.bar(range(1, 7), probs3, color='green')
ax.set_title(f'Highly skewed: $H = {entropy(probs3):.3f}$ bits')
ax.set_xlabel('Face')
ax.set_ylabel('Probability')
ax.set_ylim(0, 0.95)
plt.tight_layout()
plt.savefig('entropy_comparison.png', dpi=150, bbox_inches='tight')
plt.show()
print(f"一様分布のエントロピー: {entropy(probs1):.4f} bits")
print(f"理論上の最大値 log2(6): {np.log2(6):.4f} bits")
KLダイバージェンスの可視化
import numpy as np
import matplotlib.pyplot as plt
def kl_divergence(p, q):
"""KLダイバージェンス D_KL(P || Q)"""
mask = p > 0
return np.sum(p[mask] * np.log2(p[mask] / q[mask]))
# 2値分布のKLダイバージェンス
p_vals = np.linspace(0.01, 0.99, 200)
q_fixed = 0.5
kl_values = []
for p in p_vals:
P = np.array([p, 1 - p])
Q = np.array([q_fixed, 1 - q_fixed])
kl_values.append(kl_divergence(P, Q))
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(p_vals, kl_values, 'b-', linewidth=2)
ax.set_xlabel('$p$')
ax.set_ylabel('$D_{KL}(P \\| Q)$ (bits)')
ax.set_title(f'KL divergence: $P = \\mathrm{{Bernoulli}}(p)$, $Q = \\mathrm{{Bernoulli}}({q_fixed})$')
ax.axvline(x=q_fixed, color='r', linestyle='--', alpha=0.5, label=f'$p = q = {q_fixed}$')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('kl_divergence.png', dpi=150, bbox_inches='tight')
plt.show()
まとめ
本記事では、自己情報量とシャノンエントロピーの定義を解説しました。
- 自己情報量: $I(A) = -\log_2 P(A)$ — 珍しい事象ほど情報量が大きい
- シャノンエントロピー: $H(X) = -\sum p_i \log_2 p_i$ — 不確実性の度合い
- 最大エントロピー: 一様分布のとき最大で $\log_2 n$ ビット
- KLダイバージェンス: 2つの分布の「距離」を測る非対称な量
- 交差エントロピー: $H(P) + D_{\text{KL}}(P \| Q)$
次のステップとして、相互情報量について学びましょう。