自己情報量とエントロピーの定義をわかりやすく解説

情報理論は、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)になります。

自己情報量の性質

  1. 非負性: $I(A) \geq 0$($0 < p \leq 1$ なので)
  2. 確実な事象: $p = 1 \Rightarrow I(A) = 0$(確実なことに情報はない)
  3. 稀な事象: $p \to 0 \Rightarrow I(A) \to \infty$
  4. 加法性: 独立な事象 $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)$

次のステップとして、相互情報量について学びましょう。