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

「メッセージにどれだけの情報が含まれているか」を、数で測れたら便利だと思いませんか。スマホで写真を送るとき、ファイルは数秒で圧縮されて相手に届きます。このとき裏側では「この画像は何ビットまで小さくできるか」という限界が計算されています。あるいは、機械学習で画像を「猫」か「犬」かに分類するとき、モデルの予測がどれだけ外れているかを測る損失関数として「交差エントロピー」が使われます。圧縮の限界と、学習の良し悪し——一見まったく別の話題が、実は同じ一つの量から生まれています。それが自己情報量エントロピーです。

この量を最初に定義したのが、1948年のクロード・シャノンの論文「通信の数学的理論(A Mathematical Theory of Communication)」です。シャノンは「情報」という曖昧な言葉に、対数を使ったたった一つの数式で厳密な意味を与えました。そしてその数式から、「データはどこまで圧縮できるか」「ノイズのある通信路でどれだけ正確に伝えられるか」という工学の根本的な限界が導かれます。

この記事を読むと、次のことが身につきます。

  • 自己情報量 $I(x) = -\log p(x)$ がなぜこの形なのか、直感と公理から理解する
  • エントロピー $H(X) = -\sum p \log p$ が「平均情報量」であり「不確実性の尺度」であること
  • エントロピーが最大・最小になる条件と、その意味
  • 結合・条件付きエントロピー、相互情報量という「複数の変数」への拡張
  • 情報源符号化定理(圧縮の限界)、KLダイバージェンス、交差エントロピーへの橋渡し
  • これらをPythonで計算・可視化し、理論を自分の手で確かめる

応用先は驚くほど広く、データ圧縮(ZIP、JPEG、Huffman符号)、通信路設計、機械学習の損失関数(交差エントロピー損失)、決定木の分割基準(情報利得)、統計物理(ボルツマンエントロピー)、さらには自然言語処理の言語モデル評価(パープレキシティ)まで、すべてこの記事の内容を土台にしています。

前提知識

この記事を読む前に、以下を理解しておくと格段に読みやすくなります。

対数の性質($\log ab = \log a + \log b$、$\log \frac{1}{x} = -\log x$)も随所で使います。忘れていても、本文で使う箇所ごとに説明を添えるので心配いりません。

情報量とは何か——直感から出発する

「情報」という言葉を、まずは日常感覚で考えてみましょう。あなたが友人から次の2つのメッセージを受け取ったとします。

  • 「今日、太陽が東から昇ったよ」
  • 「今日、近所で大きな地震があったよ」

最初のメッセージには、ほとんど価値を感じません。太陽が東から昇るのは当たり前で、聞く前から分かっていたからです。一方、2番目のメッセージは大きな価値を持ちます。滅多に起きないこと——つまり予想していなかったこと——を教えてくれたからです。

ここから一つの原理が見えてきます。珍しい出来事ほど、それが起きたと知ったときの情報量は大きい。逆に、ほぼ確実に起きることを知らされても、情報はほとんど得られません。

この「珍しさ」を数量化するのが確率です。確率 $p$ が小さいほど珍しい。そこで情報量は「確率 $p$ が小さいほど大きくなる量」であってほしい。さらに、いくつか自然な要請を課すと、情報量の形はほぼ一意に決まってしまいます。次の章で、その要請を整理しましょう。

ここまでで「情報量は確率の減少関数であるべき」という方向性が見えました。では、具体的にどんな関数を選べばよいのでしょうか。鍵になるのは「独立な出来事を組み合わせたときの振る舞い」です。

自己情報量の定義

満たすべき3つの要請

情報量を測る関数を $I(p)$ と書きます(確率 $p$ の事象が起きたときの情報量)。直感に照らすと、次の3つを満たしてほしいはずです。

  1. 確率の減少関数:$p$ が小さい(珍しい)ほど $I(p)$ は大きい。
  2. 確実な事象の情報量はゼロ:$p = 1$ なら $I(1) = 0$。当たり前のことに情報はない。
  3. 加法性:独立な2つの事象 $A, B$ が同時に起きたときの情報量は、それぞれの情報量の和。すなわち $I(p_A p_B) = I(p_A) + I(p_B)$。

3番目の要請が決め手です。独立な事象の同時確率は $p_A p_B$ と掛け算になるのに、情報量は足し算になってほしい。「掛け算を足し算に変える関数」と言えば——そう、対数です。$\log(p_A p_B) = \log p_A + \log p_B$ という性質が、まさに要請3そのものになっています。

定義式

以上の要請を満たす関数として、シャノンは次を採用しました。事象 $x$ が確率 $p(x)$ で起きるとき、その自己情報量(self-information、情報量、サプライザルとも呼ぶ)は

$$ I(x) = -\log p(x) = \log \frac{1}{p(x)} $$

で定義されます。マイナス符号は「$0 < p \leq 1$ のとき $\log p \leq 0$」を反転させ、情報量を非負にするためのものです。$\frac{1}{p}$ は「珍しさ」をそのまま表す量(確率の逆数)で、その対数を取っていると読むこともできます。

要請を確認しましょう。$p$ が小さいほど $-\log p$ は大きい(要請1)。$p = 1$ なら $-\log 1 = 0$(要請2)。そして $-\log(p_A p_B) = -\log p_A – \log p_B$(要請3)。すべて満たしています。

自己情報量 I(x)=-log2 p(x) のグラフ。珍しい事象ほど情報量が大きい

この図は $I(x) = -\log_2 p(x)$ を横軸に確率、縦軸に情報量(ビット)でプロットしたものです。確率が $1$ に近い「ありふれた事象」では情報量がほぼゼロに張りつき、確率が $0$ に近い「珍しい事象」では情報量が急激に立ち上がっていきます。冒頭の「太陽が昇った」(右下の緑点)と「地震が起きた」(左上の赤点)の対比が、まさにこの曲線の両端に対応していることが読み取れます。

定義式が出そろいました。次は「なぜ対数でなければならなかったのか」を、加法性の図でもう一段はっきりさせておきましょう。

加法性が対数を選ばせる

要請3の加法性は、自己情報量を直感的に納得させる最も大事な性質です。具体例で確かめましょう。コインを2回投げて2回とも表が出る、という事象を考えます。1回目の表(確率 $1/2$)の情報量は $-\log_2 \frac{1}{2} = 1$ ビット、2回目も同じく $1$ ビット。2回が独立なら、同時に起きる確率は $\frac{1}{2}\times\frac{1}{2} = \frac{1}{4}$ です。このとき情報量は

$$ I\left(\tfrac{1}{4}\right) = -\log_2 \frac{1}{4} = 2 \text{ bit} $$

となり、ちゃんと $1 + 1 = 2$ ビットになります。確率は掛け算で減るのに、情報量はきれいに足し算で増える。この「掛け算を足し算に変換する」性質こそ、対数を選ばざるを得なかった理由です。

加法性の模式図。確率は掛け算、情報量は足し算になる

この模式図は、確率 $1/4$ の事象 $A$(情報量 $2$ ビット)と確率 $1/8$ の事象 $B$(情報量 $3$ ビット)が独立に同時発生する様子を表しています。同時確率は $\frac{1}{4}\times\frac{1}{8}=\frac{1}{32}$ と掛け算で求まる一方、情報量は $2+3=5$ ビットと足し算になります。$-\log_2 \frac{1}{32} = 5$ という計算とも一致しており、確率の積が情報量の和に対応するという加法性が一目で確認できます。

加法性のおかげで、情報量は「ビット」という直感的な単位で扱えます。では、その「ビット」とは正確には何を意味するのでしょうか。対数の底を変えると単位が変わる、という話を次にします。

対数の底と情報の単位

自己情報量の定義に出てくる対数の底は、自由に選べます。底を変えても情報量の「形」(確率に対する依存の仕方)は変わらず、ただ全体が定数倍されるだけです。これは情報の「単位」を選ぶことに相当します。

  • 底が $2$:単位はビット(bit)。1ビットは「公正なコイン1回分」の情報量。情報理論・計算機科学で標準。
  • 底が $e$:単位はナット(nat)。微分や解析的な計算(連続分布、機械学習の損失)で便利。
  • 底が $10$:単位はディット(dit)またはハートレー(Hartley)。歴史的に使われた単位。

底を $a$ から $b$ に変えるときは、対数の底の変換公式 $\log_a x = \frac{\log_b x}{\log_b a}$ を使います。たとえばナットからビットへの換算は

$$ I_{\text{bit}}(x) = \log_2 e \cdot I_{\text{nat}}(x) \approx 1.4427 \cdot I_{\text{nat}}(x) $$

です。本記事では特に断らない限り底を $2$(ビット)で書きますが、機械学習の文脈では底 $e$(ナット)が標準なので、両方に慣れておくと良いでしょう。

対数の底による単位の違い。bit / nat / dit で縦軸スケールが変わる

この図は同じ確率に対して、底 $2$(ビット)・底 $e$(ナット)・底 $10$(ディット)の自己情報量を重ねたものです。3本の曲線はどれも「確率が小さいほど立ち上がる」という同じ形をしており、違いは縦軸のスケール(傾き)だけだと読み取れます。底 $e$ の曲線が底 $2$ の曲線より常に下にあるのは、$1$ ナット $\approx 1.4427$ ビットという換算の通り、ナットのほうが「大きい単位」だからです。

ここまでは「ある一つの事象」が起きたときの情報量を見てきました。しかし実際には、確率変数が複数の値のどれを取るか分からない、という状況がほとんどです。そこで「平均してどれくらいの情報量を持つか」を考えます。これがエントロピーです。

シャノンエントロピー——平均情報量

定義

サイコロを振る前、どの目が出るかは分かりません。各目には自己情報量がありますが、「どの目が出るか」自体が確率的です。そこで、自己情報量を確率で重みづけして平均を取ったものを考えます。これがシャノンエントロピーです。

離散確率変数 $X$ が値 $x_1, x_2, \dots, x_n$ をそれぞれ確率 $p_1, p_2, \dots, p_n$ で取るとき、$X$ のエントロピーは

$$ H(X) = \sum_{i=1}^{n} p_i \, I(x_i) = -\sum_{i=1}^{n} p_i \log_2 p_i = E[I(X)] $$

で定義されます。最後の表記が示す通り、エントロピーは自己情報量の期待値です。「平均すると1回あたり何ビットの情報が得られるか」を表しています。

なお $p_i = 0$ の項は、$p \log p \to 0$($p \to 0$)という極限により $0$ として扱います(後でPythonでも $p>0$ の項だけを足すことで対応します)。

エントロピーは各目の自己情報量を確率で重みづけした平均

左の図は偏ったサイコロの各目の確率 $p_i$、右の図はそれぞれの自己情報量 $-\log_2 p_i$ を示しています。確率の小さい目(5, 6)ほど自己情報量が高い、という反比例の関係がはっきり見て取れます。右図の赤い破線がエントロピー $H \approx 2.27$ ビットで、これは「情報量を確率で重みづけして平均した値」です。確率の大きい目(情報量は小さい)が平均を引き下げているため、$H$ は最大の自己情報量よりかなり低い位置にあることが分かります。

エントロピーの意味——不確実性の尺度

エントロピーは「平均情報量」であると同時に、確率変数の不確実性(予測の難しさ、ランダムさ)の尺度でもあります。この2つの見方は表裏一体です。

  • エントロピーが大きい = 各結果が予測しにくい = 結果を知ったときに得る情報が平均して大きい。
  • エントロピーが小さい = 結果がほぼ決まっている = 結果を知ってもあまり情報が得られない。

たとえば「ほぼ必ず表が出るイカサマコイン」は、投げる前から結果が分かっているので不確実性が低く、エントロピーは小さい。「公正なコイン」は結果が五分五分で最も予測しづらく、エントロピーが最大になります。

この「不確実性の尺度」という見方は、後で情報源符号化や機械学習につながる重要な視点です。まずはエントロピーが取りうる値の範囲——最小と最大——を押さえましょう。

エントロピーの最小値と最大値

最小値:確定的なとき $H = 0$

エントロピーは常に非負です。

$$ H(X) = -\sum_i p_i \log_2 p_i \geq 0 $$

なぜなら各 $p_i$ について $0 < p_i \leq 1$ より $\log_2 p_i \leq 0$ なので、$-p_i \log_2 p_i \geq 0$ となり、その和も非負だからです。等号 $H(X) = 0$ が成り立つのは、ある一つの値を確率 $1$ で取る確定的な場合だけです。このとき「次に何が起きるか」は確実に分かっており、不確実性はゼロ。これは直感とぴったり合います。

最大値:一様分布のとき $H = \log_2 n$

逆にエントロピーが最大になるのは、すべての値が等しい確率 $1/n$ を持つ一様分布のときで、その値は

$$ H(X) \leq \log_2 n $$

です。等号は $p_1 = p_2 = \cdots = p_n = \frac{1}{n}$ のときに成り立ちます。直感的には「どの結果も同じくらい起こりうる」状態が最も予測しにくく、不確実性が最大だということです。

この上限はラグランジュの未定乗数法で証明できます。「$H(X) = -\sum p_i \log p_i$ を最大化せよ。ただし制約 $\sum p_i = 1$」という問題を解きます。ラグランジアンを

$$ \mathcal{L} = -\sum_i p_i \ln p_i + \lambda \left( \sum_i p_i – 1 \right) $$

と置きます(計算が楽になるよう、ここでは自然対数 $\ln$ を使います。底の違いは正の定数倍なので最大化の結論は変わりません)。各 $p_i$ で偏微分してゼロと置くと、$\frac{\partial}{\partial p_i}(p_i \ln p_i) = \ln p_i + 1$ なので

$$ \frac{\partial \mathcal{L}}{\partial p_i} = -(\ln p_i + 1) + \lambda = 0 $$

が得られます。これを $p_i$ について解くと

$$ \ln p_i = \lambda – 1 \quad \Longrightarrow \quad p_i = e^{\lambda – 1} $$

となります。右辺は $i$ に依存しない定数なので、すべての $p_i$ が等しいことが分かります。ここで制約 $\sum_i p_i = 1$ に「すべて等しい」を代入すると、$n$ 個の等しい値の和が $1$ なので、各々は $p_i = \frac{1}{n}$ に決まります。このとき

$$ H = -\sum_{i=1}^{n} \frac{1}{n} \log_2 \frac{1}{n} = -n \cdot \frac{1}{n} \log_2 \frac{1}{n} = \log_2 n $$

が最大値です。導出から、「制約のもとで偏りをなくすほどエントロピーが増える」ことが見えました。

2値エントロピー関数

最も単純で重要な例が、結果が2通りしかない場合です。$P(X=1) = p$、$P(X=0) = 1-p$ のとき、エントロピーは

$$ H(p) = -p \log_2 p – (1-p)\log_2(1-p) $$

となります。これを2値エントロピー関数と呼びます。$p = 1/2$ で最大値 $1$ ビット、$p = 0$ または $p = 1$ で最小値 $0$ を取ります。

2値エントロピー関数 H(p) の山型グラフ。p=1/2 で最大

この図は2値エントロピー関数 $H(p)$ を描いたものです。両端の $p=0$ と $p=1$(結果が確定)で $H=0$、中央の $p=1/2$(五分五分で最も予測困難)で最大値 $1$ ビットを取る、左右対称の山型になっています。グラフが上に凸で滑らかなのは、後で交差エントロピー損失を最適化する際に効いてくる重要な性質です。

2値の場合のグラフで「一様(偏りなし)のとき最大」という性質を視覚的に確認しました。これがサイコロのような多値の場合にも成り立つことを、次にPythonで実際に計算して確かめましょう。

エントロピーをPythonで計算する

ここまでの「一様分布で最大、偏ると減少」という主張を、サイコロの分布を3通り作って実際に計算し、棒グラフで比べてみます。

import numpy as np

def entropy(probs, base=2):
    """シャノンエントロピー H = -sum p log p を計算する。
    p=0 の項は 0 として扱う(log0 を避ける)。"""
    probs = np.asarray(probs, dtype=float)
    probs = probs[probs > 0]          # p>0 の項だけ残す
    return -np.sum(probs * np.log(probs)) / np.log(base)

# 3通りのサイコロ分布
uniform = np.ones(6) / 6                              # 一様(最大)
skewed  = np.array([0.30, 0.25, 0.20, 0.12, 0.08, 0.05])  # やや偏り
peaked  = np.array([0.85, 0.05, 0.04, 0.03, 0.02, 0.01])  # 強い偏り

for name, p in [("一様", uniform), ("やや偏り", skewed), ("強い偏り", peaked)]:
    print(f"{name:6s}: H = {entropy(p):.4f} bit")

print(f"理論上の最大値 log2(6) = {np.log2(6):.4f} bit")

このコードの出力は次の通りです。

一様    : H = 2.5850 bit
やや偏り: H = 2.3601 bit
強い偏り: H = 0.9322 bit

この出力から3つのことが読み取れます。第一に、一様分布のエントロピー $2.5850$ ビットが理論値 $\log_2 6 = 2.5850$ ビットとぴったり一致しており、「一様分布で最大」という主張が数値的に確認できました。第二に、分布の偏りが強くなるほどエントロピーが単調に減少しています($2.585 \to 2.360 \to 0.932$)。第三に、強く偏った分布では1つの目がほぼ確実に出るため不確実性が低く、エントロピーが最大値の半分以下にまで落ちています。

この計算結果を、確率分布の棒グラフと並べて可視化したのが次の図です。

一様・やや偏り・強い偏りの3分布とそれぞれのエントロピー

3つの棒グラフは左から順に、一様分布・やや偏った分布・強く偏った分布を示しています。棒の高さが揃っている(一様)ほどエントロピーが大きく $2.585$ ビット、棒の高さがバラバラで一つが突出している(強い偏り)ほどエントロピーが小さく $0.962$ ビットになっています。「平らな分布=予測しにくい=高エントロピー」「尖った分布=予測しやすい=低エントロピー」という対応が、棒グラフの形とエントロピーの数値の両方から確認できます。

ここまでは1つの確率変数を扱ってきました。しかし現実の問題では、複数の確率変数の関係——たとえば「天気」と「気温」のように相関する量——を扱う必要があります。次は変数が2つになったときのエントロピーへと拡張します。

結合エントロピーと条件付きエントロピー

結合エントロピー

2つの確率変数 $X, Y$ を「一組のペア」として見たときの不確実性が結合エントロピーです。同時確率 $p(x, y)$ を使って

$$ H(X, Y) = -\sum_{x, y} p(x, y) \log_2 p(x, y) $$

と定義します。これは「$(X, Y)$ という組を1つの確率変数とみなしたときのエントロピー」にほかなりません。

条件付きエントロピー

次に、$Y$ の値をすでに知っている状況を考えます。$Y$ を知った後に残る $X$ の不確実性が条件付きエントロピーです。

$$ H(X \mid Y) = -\sum_{x, y} p(x, y) \log_2 p(x \mid y) $$

これは「$Y = y$ という条件のもとでの $X$ のエントロピー $H(X \mid Y=y)$」を、$Y$ の分布で平均したものとも書けます。$Y$ が $X$ を完全に決めてしまうなら $H(X \mid Y) = 0$、$Y$ が $X$ と無関係なら $H(X \mid Y) = H(X)$(情報が減らない)となります。

連鎖律

結合・条件付きエントロピーは、次の連鎖律(chain rule)で結ばれます。

$$ H(X, Y) = H(X) + H(Y \mid X) = H(Y) + H(X \mid Y) $$

これは「$X$ と $Y$ の組の不確実性は、まず $X$ を知る不確実性 $H(X)$ に、$X$ を知った後の $Y$ の不確実性 $H(Y \mid X)$ を足したものに等しい」と読めます。自己情報量の加法性 $-\log p(x,y) = -\log p(x) – \log p(y \mid x)$ の両辺を期待値で平均すれば、ただちに導けます。導出を一行ずつ追ってみましょう。同時確率を条件付き確率の定義 $p(x,y) = p(x)\,p(y \mid x)$ で書き換えると

$$ \begin{aligned} H(X, Y) &= -\sum_{x,y} p(x,y) \log_2 p(x,y) \\ &= -\sum_{x,y} p(x,y) \log_2 \big[\, p(x)\, p(y \mid x) \,\big] \\ &= -\sum_{x,y} p(x,y) \log_2 p(x) – \sum_{x,y} p(x,y) \log_2 p(y \mid x) \end{aligned} $$

となります。2行目で同時確率を積に分解し、3行目で対数を和に開きました。第1項は $y$ について先に和を取ると $\sum_y p(x,y) = p(x)$ となるので $-\sum_x p(x)\log_2 p(x) = H(X)$、第2項はそのまま条件付きエントロピー $H(Y \mid X)$ の定義です。よって $H(X,Y) = H(X) + H(Y \mid X)$ が示せました。$X$ と $Y$ の役割を入れ替えれば、もう一方の等式も同様に従います。

連鎖律を組み合わせると、面白い量が浮かび上がります。「$Y$ を知ることで $X$ の不確実性がどれだけ減ったか」です。これが相互情報量です。

相互情報量——共有される情報

$Y$ を知る前の $X$ の不確実性は $H(X)$、知った後の不確実性は $H(X \mid Y)$ です。その差「不確実性の減少量」を相互情報量(mutual information)と呼びます。

$$ I(X; Y) = H(X) – H(X \mid Y) = H(Y) – H(Y \mid X) $$

連鎖律を使うと、これは対称な形にも書き換えられます。$H(X \mid Y) = H(X,Y) – H(Y)$ を代入すると

$$ I(X; Y) = H(X) + H(Y) – H(X, Y) $$

となり、$X$ と $Y$ を入れ替えても同じ式になることが分かります。つまり「$Y$ から $X$ について得られる情報量」と「$X$ から $Y$ について得られる情報量」は等しいのです。

結合・条件付きエントロピーと相互情報量のベン図

このベン図は2つのエントロピーの関係を集合で表したものです。左の円全体が $H(X)$、右の円全体が $H(Y)$、2つを合わせた領域全体が結合エントロピー $H(X,Y)$ です。重なり部分が相互情報量 $I(X;Y)$ で、これは2つの変数が「共有している情報」を表します。重なりの外側、円の左右に残った部分がそれぞれ条件付きエントロピー $H(X|Y)$、$H(Y|X)$(相手を知った後に残る固有の不確実性)であることが、視覚的に読み取れます。

相互情報量は $I(X;Y) \geq 0$ を満たし、等号は $X$ と $Y$ が独立なときに限ります(後述のKLダイバージェンスの非負性から従います)。独立なら共有する情報はゼロ、強く関連していれば共有する情報が大きい、というわけです。これを実例で確かめましょう。

相互情報量を可視化する

2次元正規分布の相関係数 $\rho$ を変えながら、$X$ と $Y$ の相互情報量がどう変わるかを見てみます。ガウス分布の相互情報量は $I(X;Y) = -\frac{1}{2}\log_2(1 – \rho^2)$ という閉じた式で与えられることが知られています。

import numpy as np

rng = np.random.default_rng(474)

def gaussian_mi_bits(rho):
    """相関 rho の2次元正規分布の相互情報量(bit)"""
    return -0.5 * np.log2(1 - rho**2)

for rho in [0.0, 0.6, 0.95]:
    # サンプルを生成(散布図用)
    cov = [[1.0, rho], [rho, 1.0]]
    xy = rng.multivariate_normal([0, 0], cov, size=600)
    print(f"rho={rho:4.2f}: 理論 I(X;Y) = {gaussian_mi_bits(rho):.4f} bit, "
          f"標本相関 = {np.corrcoef(xy.T)[0,1]:.3f}")

出力は次の通りです。

rho=0.00: 理論 I(X;Y) = -0.0000 bit, 標本相関 = -0.033
rho=0.60: 理論 I(X;Y) = 0.3219 bit, 標本相関 = 0.643
rho=0.95: 理論 I(X;Y) = 1.6792 bit, 標本相関 = 0.950

この出力から、相関 $\rho = 0$ のとき相互情報量がちょうど $0$ ビット(独立なので情報を共有しない)であることが確認できます。相関が強まるにつれて相互情報量が単調に増加し($0 \to 0.32 \to 1.68$ ビット)、$\rho \to 1$ では発散していきます。標本から計算した相関係数も設定値とよく一致しており、シミュレーションが正しく動いていることが分かります。

相関の異なる3つの散布図と相互情報量

3つの散布図は左から相関 $\rho = 0, 0.6, 0.95$ の2次元正規分布のサンプルです。$\rho=0$ の点群は円形に広がっていて $X$ から $Y$ を予測できず、相互情報量は $0$ ビットです。$\rho$ が大きくなるほど点群が斜めに細長くなり($X$ が分かれば $Y$ もほぼ分かる)、相互情報量が増えていく様子が読み取れます。相互情報量が「2変数がどれだけ情報を共有しているか」の尺度であることが、散布図の形と数値の対応からよく分かります。

ここまでで、自己情報量・エントロピー・相互情報量という情報理論の中核概念が出そろいました。ここからは、これらが実際の工学でどう使われるかを2つの方向に展開します。まずはエントロピーの最も古典的な応用——データ圧縮(情報源符号化)です。

情報源符号化定理——圧縮の限界

エントロピーが「不確実性」だけでなく「圧縮の限界」を意味する、という話に進みます。データを0と1の列(符号)に変換して保存・送信することを考えましょう。よく出る記号には短い符号を、めったに出ない記号には長い符号を割り当てれば、平均符号長を短くできます。これがデータ圧縮の基本アイデアです。

シャノンの情報源符号化定理(source coding theorem)は、この圧縮にどこまでも縮められるわけではない「限界」があることを示します。

$$ \bar{L} \geq H(X) $$

ここで $\bar{L}$ は1記号あたりの平均符号長(ビット)です。つまりどんな圧縮方式を使っても、平均符号長をエントロピー $H(X)$ より短くはできない。逆に、$H(X)$ にいくらでも近づける符号化が存在することも保証されます。

直感的には、自己情報量 $-\log_2 p(x)$ が「記号 $x$ を表すのに理想的な符号長」だからです。確率 $p(x)$ の記号には $-\log_2 p(x)$ ビットを割り当てるのが最適で、その平均がエントロピー $\sum p(x)(-\log_2 p(x)) = H(X)$ になります。確率が $2$ のべき乗($1/2, 1/4, 1/8, \dots$)のときは、この理想符号長がちょうど整数になり、Huffman符号がぴったり達成します。

なぜ確率の小さい記号に長い符号を割り当てるのが得なのでしょうか。日本語のテキストを考えると分かりやすいでしょう。「の」や「は」のように頻出する文字に短い符号を、「鬱」のように滅多に出ない文字に長い符号を割り当てれば、文章全体の平均ビット数が下がります。よく出る記号を短くした分の節約が、めったに出ない記号を長くしたコストを上回るのです。この「頻度に応じて符号長を変える」アイデアを最適化し尽くした極限が、平均符号長 $= H(X)$ という下限になります。

ここで注意したいのは、エントロピーが整数とは限らないことです。たとえば $H(X) = 1.75$ ビットのとき、1記号を $1.75$ ビットで表すことはできません(符号長は整数)。しかし複数記号をまとめて符号化(ブロック符号化)すれば、1記号あたりの平均符号長を $1.75$ ビットにいくらでも近づけられます。これが情報源符号化定理の「達成可能性」の部分です。逆向きの不等式 $\bar{L} \geq H(X)$ は、どんなに工夫しても下限は破れないことを保証します。

情報源符号化定理:理想符号長 -log2 p とハフマン符号長の比較

この図は確率が $\{1/2, 1/4, 1/8, 1/8\}$ の4記号について、理想符号長 $-\log_2 p$(青)とHuffman符号長(橙)を並べたものです。この分布では確率がすべて $2$ のべき乗なので、理想符号長 $\{1, 2, 3, 3\}$ ビットとHuffman符号長が完全に一致しています。確率の大きい記号 A には短い符号(1ビット)、小さい記号 C, D には長い符号(3ビット)が割り当てられ、平均符号長がエントロピー $H = 1.75$ ビットに一致する——これが「圧縮の限界をHuffman符号が達成する」様子です。より詳しくはハフマン符号の記事を参照してください。

圧縮の限界がエントロピーで決まることを見ました。次はもう一つの大きな応用、「2つの分布を比べる」ための量——KLダイバージェンスと交差エントロピーです。これは機械学習の損失関数の核心になります。

KLダイバージェンスと交差エントロピー

KLダイバージェンス

2つの確率分布 $P$ と $Q$ が「どれだけ違うか」を測りたい場面は頻繁にあります。たとえば機械学習では「真の分布 $P$」と「モデルの予測分布 $Q$」のズレを測りたい。この用途に使われるのがKLダイバージェンス(Kullback-Leibler divergence、相対エントロピー)です。

$$ D_{\text{KL}}(P \| Q) = \sum_{x} P(x) \log_2 \frac{P(x)}{Q(x)} $$

直感的には、「本当は分布 $P$ に従うデータを、誤って分布 $Q$ だと思い込んで符号化したときに、余計に必要になる平均ビット数」を表します。$P$ と $Q$ が一致していれば余計なコストはゼロ、違うほどコストが増えます。KLダイバージェンスには次の重要な性質があります。

  • 非負性:$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)$。

3番目の性質から、KLダイバージェンスは「距離」とは呼べません(距離なら対称でなければならない)。あくまで「ズレの大きさ」を測る非対称な量です。詳しい導出はKLダイバージェンスの記事を参照してください。

交差エントロピー

KLダイバージェンスと密接に関係するのが交差エントロピーです。

$$ H(P, Q) = -\sum_x P(x) \log_2 Q(x) $$

これは「真の分布 $P$ のもとで、予測分布 $Q$ による符号長 $-\log_2 Q(x)$ を平均した値」です。交差エントロピーは、エントロピーとKLダイバージェンスの和に分解できます。実際、対数の中を $\frac{P(x)}{Q(x)} \cdot P(x)$ ではなく、$Q(x) = P(x) / \frac{P(x)}{Q(x)}$ と見て分解すると

$$ \begin{aligned} H(P, Q) &= -\sum_x P(x) \log_2 Q(x) \\ &= -\sum_x P(x) \log_2 \left( P(x) \cdot \frac{Q(x)}{P(x)} \right) \\ &= -\sum_x P(x) \log_2 P(x) – \sum_x P(x) \log_2 \frac{Q(x)}{P(x)} \\ &= H(P) + \sum_x P(x) \log_2 \frac{P(x)}{Q(x)} \\ &= H(P) + D_{\text{KL}}(P \| Q) \end{aligned} $$

が得られます。2行目で $Q(x)$ を $P(x) \cdot \frac{Q(x)}{P(x)}$ と書き換え、3行目で対数を積の和に分け、4行目で $-\log\frac{Q}{P} = +\log\frac{P}{Q}$ を使ってKLダイバージェンスの形に整えました。

$$ \boxed{H(P, Q) = H(P) + D_{\text{KL}}(P \| Q)} $$

この分解が、機械学習で交差エントロピー損失が使われる理由を説明します。学習では真の分布 $P$(正解ラベル)は固定なので $H(P)$ は定数です。したがって交差エントロピー $H(P,Q)$ を最小化することは、KLダイバージェンス $D_{\text{KL}}(P\|Q)$ を最小化すること、つまり予測分布 $Q$ を真の分布 $P$ に近づけることと等価になります。詳しくは交差エントロピー損失の記事を参照してください。

交差エントロピーをPythonで確かめる

真の分布 $P$ を固定し、予測分布 $Q$ を動かしながら、交差エントロピーとKLダイバージェンスとエントロピーの関係 $H(P,Q) = H(P) + D_{\text{KL}}(P\|Q)$ を数値で確認します。

import numpy as np

def entropy(p, base=2):
    p = np.asarray(p, float); p = p[p > 0]
    return -np.sum(p * np.log(p)) / np.log(base)

def cross_entropy(p, q, base=2):
    p, q = np.asarray(p, float), np.asarray(q, float)
    return -np.sum(p * np.log(q)) / np.log(base)

def kl_divergence(p, q, base=2):
    p, q = np.asarray(p, float), np.asarray(q, float)
    m = p > 0
    return np.sum(p[m] * np.log(p[m] / q[m])) / np.log(base)

P = np.array([0.7, 0.3])              # 真の分布(固定)
for q1 in [0.7, 0.5, 0.3]:
    Q = np.array([q1, 1 - q1])
    HP  = entropy(P)
    CE  = cross_entropy(P, Q)
    KL  = kl_divergence(P, Q)
    print(f"Q={Q}: H(P,Q)={CE:.4f}, H(P)+KL={HP + KL:.4f}, KL={KL:.4f}")

出力は次の通りです。

Q=[0.7 0.3]: H(P,Q)=0.8813, H(P)+KL=0.8813, KL=-0.0000
Q=[0.5 0.5]: H(P,Q)=1.0000, H(P)+KL=1.0000, KL=0.1187
Q=[0.3 0.7]: H(P,Q)=1.3702, H(P)+KL=1.3702, KL=0.4890

この出力から3点が読み取れます。第一に、各行で $H(P,Q)$ と $H(P)+D_{\text{KL}}(P\|Q)$ の値が完全に一致しており、先ほど導いた分解式が正しいことが数値的に裏付けられました。第二に、$Q = P = (0.7, 0.3)$ のときKLダイバージェンスがちょうど $0$ になり、交差エントロピーが最小値($= H(P) = 0.8813$ ビット)を取っています。第三に、$Q$ が $P$ から離れるほどKLダイバージェンスが増え、交差エントロピーも増えています。これは「予測が真の分布から外れるほど損失が大きくなる」という機械学習の損失関数の振る舞いそのものです。

交差エントロピー = エントロピー + KLダイバージェンスの関係

この図は真の分布を $P = (0.7, 0.3)$ に固定し、予測 $q = Q(X=1)$ を横軸に動かしたときの交差エントロピー(青)とKLダイバージェンス(橙)を示しています。緑の破線が一定値 $H(P) = 0.881$ ビットで、青い曲線と橙の曲線の差が常にこの一定値に等しい——つまり $H(P,Q) = H(P) + D_{\text{KL}}$ が成り立っていることが視覚的に分かります。両曲線とも $q = p = 0.7$(赤点)で最小になり、そこでKLダイバージェンスが $0$、交差エントロピーが $H(P)$ に達しています。これが「交差エントロピー損失を最小化すると予測が真の分布に一致する」という学習原理の図解です。

最後に、これまで扱ってきた離散分布の話を、連続分布に拡張するとどうなるかに触れておきましょう。

補足:連続分布への拡張(微分エントロピー)

ここまでは離散確率変数を扱ってきましたが、確率密度関数 $p(x)$ を持つ連続確率変数にもエントロピーを拡張できます。和を積分に置き換えた

$$ h(X) = -\int p(x) \log p(x) \, dx $$

微分エントロピー(differential entropy)と呼びます。形は離散の場合とそっくりですが、性質は少し異なります。最も大きな違いは、微分エントロピーが負の値を取りうることです(密度 $p(x)$ は $1$ を超えうるので $\log p(x) > 0$ となる領域があるため)。また座標変換に対して不変ではありません。これらの注意点も含め、詳しくは微分エントロピーの記事で扱います。一方、KLダイバージェンスや相互情報量は連続の場合でも非負性などの良い性質を保ち、機械学習でそのまま使えます。

まとめ

本記事では、情報理論の出発点である自己情報量とエントロピーを、直感から応用まで通して解説しました。

  • 自己情報量 $I(x) = -\log p(x)$:珍しい事象ほど情報量が大きい。減少性・確実な事象でゼロ・加法性という3つの要請が、対数の形を一意に決める。
  • 対数の底:底 $2$ でビット、底 $e$ でナット、底 $10$ でディット。形は同じで単位が変わるだけ。
  • シャノンエントロピー $H(X) = -\sum p_i \log p_i$:自己情報量の期待値であり、不確実性の尺度。確定的なとき最小 $0$、一様分布のとき最大 $\log_2 n$。
  • 結合・条件付きエントロピーと連鎖律:複数変数への自然な拡張。$H(X,Y) = H(X) + H(Y\mid X)$。
  • 相互情報量 $I(X;Y) = H(X) – H(X\mid Y)$:2変数が共有する情報。独立ならゼロ。
  • 情報源符号化定理 $\bar{L} \geq H(X)$:エントロピーは圧縮の限界。
  • KL・交差エントロピー $H(P,Q) = H(P) + D_{\text{KL}}(P\|Q)$:分布のズレを測り、機械学習の損失関数の基礎になる。

自己情報量という一つの量から、圧縮・通信・学習という工学の3本柱がすべて生まれることが見えたはずです。次のステップとして、ここで触れた各テーマを掘り下げた記事も参考にしてください。