情報理論は、情報の定量化、圧縮、通信に関する数学的な理論です。機械学習では、モデルの性能評価や正則化など、様々な場面でその概念が応用されます。
情報量
ある事象 \(x\) が起きたことを知ったときに得られる「情報量」 \(h(x)\) は、その事象がどれだけ「珍しい」か、つまり、その事象の起こる確率 \(p(x)\) がどれだけ低いかによって定義されます。
情報量は、以下の性質を満たすように定義するのが自然です。
- 加法性: 独立な2つの事象 \(x, y\)
を観測したときの情報量は、それぞれを個別に観測したときの情報量の和に等しい。
\(h(x, y) = h(x) + h(y)\) - 独立性: 独立な事象の同時確率は、それぞれの確率の積で表される。 \(p(x, y) = p(x)p(y)\)
この2つの性質から、情報量は確率の対数を用いて定義するのが合理的であることがわかります。確率 \(p(x)\) は1以下の値をとるため、情報量が非負になるように負号をつけます。
\[ h(x) = -\log_2 p(x) \]情報の単位は、対数の底として2を用いた場合、ビット (bit) となります。
エントロピー
エントロピーは、ある確率変数 \(X\) が生成する情報の平均情報量を表します。これは、情報量 \(h(x)\) を確率分布 \(p(x)\) で期待値をとることで計算されます。
\[ H[X] = \mathbb{E}\_{p(x)}[h(x)] = -\sum_x p(x) \log_2 p(x) \]エントロピーは、確率変数の「不確実性」や「予測の難しさ」の度合いと解釈できます。
- エントロピーが低い: 分布が特定の少数の値に集中している(ピークが鋭い)状態。結果が予測しやすいため、不確実性は低い。
- エントロピーが高い: 分布が多くの値にわたって広がっている(一様に近い)状態。結果が予測しにくいため、不確実性は高い。

ノイズなし符号化定理によれば、エントロピーは、ある確率変数の値を誤りなく送信するために必要なビット数の下限を与えます。例えば、出現確率が不均一な文字を符号化する場合、よく出現する文字には短い符号を、稀にしか出現しない文字には長い符号を割り当てることで、平均符号長をエントロピーに近づけることができます。
重要な性質として、離散エントロピー \(H[X]\) は確率変数の取りうる値をどう「呼び替える」(ラベルを付け替える)かに依存しません。エントロピーは確率質量 \(p(x)\) のみで決まり、\(x\) というラベル自体には依存しないためです。後述するように、この不変性は連続確率変数に拡張した際には成り立たなくなります。
微分エントロピー
離散確率変数のエントロピーを連続確率変数に拡張したものが微分エントロピーです。単純に和を積分に置き換えると、次のようになります。
\[ h(X) = -\int p(x) \ln p(x)\, dx \tag{1}\]ここで注意が必要なのは、連続確率変数の場合、特定の値 \(x\) をとる確率はゼロであり、\(p(x)\) は確率ではなく確率密度だという点です。したがって式(1)の被積分関数 \(-p(x)\ln p(x)\) は「情報量の期待値」を表す量ではあるものの、離散の場合とは性質が異なることに留意する必要があります。以下で見るように、この違いは2つの重要な帰結——負の値をとりうることと、変数変換に対して不変でないこと——として表れます。
ガウス分布の微分エントロピーの導出
平均 \(\mu\) 、分散 \(\sigma^2\) のガウス分布
\[ p(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left\{-\frac{(x-\mu)^2}{2\sigma^2}\right\} \]について、式(1)を具体的に計算します。対数密度は
\[ \ln p(x) = -\frac{1}{2}\ln(2\pi\sigma^2) - \frac{(x-\mu)^2}{2\sigma^2} \]なので、
\[ h(X) = -\mathbb{E}[\ln p(X)] = \frac{1}{2}\ln(2\pi\sigma^2) + \frac{1}{2\sigma^2}\mathbb{E}[(X-\mu)^2] \]\(\mathbb{E}[(X-\mu)^2] = \sigma^2\) (分散の定義そのもの)を代入すると、第2項は \(\frac{\sigma^2}{2\sigma^2}=\frac12\) となるので、
\[ h(X) = \frac{1}{2}\ln(2\pi\sigma^2) + \frac{1}{2} = \frac{1}{2}\ln(2\pi e \sigma^2) \tag{2}\]これは、\(\frac12\{1+\ln(2\pi\sigma^2)\}\) と書いても同じ値です(\(1 = \ln e\) を対数の中に入れただけ)。以下ではこの \(\ln(2\pi e\sigma^2)\) の形を使います。
微分エントロピーは負になりうる
式(2)を見ると、\(2\pi e \sigma^2 < 1\) 、すなわち \(\sigma\) が十分小さいとき \(h(X) < 0\) となることがわかります。離散エントロピーは常に非負(\(H[X]\ge 0\) 、等号は分布が退化しているとき)ですが、微分エントロピーにはこの制約がありません。これは、\(h(X)\) が「情報量の絶対的な量」ではなく、あくまで基準となる測度(ここではルベーグ測度)に対する相対的な量であることの表れです。\(h(X)=0\) となる境界は
\[ \sigma^\* = \frac{1}{\sqrt{2\pi e}} \approx 0.241971 \]であり、\(\sigma < \sigma^*\) では常に \(h(X)<0\) になります。この符号反転を数値的に確認した結果は後述の「数値検証」の節にまとめます。
微分エントロピーは変数変換で不変ではない
離散エントロピーは値のラベルの付け替えに依存しませんでしたが、連続確率変数を単調微分可能な関数 \(Y=g(X)\) で変数変換すると、微分エントロピーは一般に変化します。\(p_X\) を \(X\) の密度、\(p_Y\) を \(Y=g(X)\) の密度とすると、確率密度の変換公式より
\[ p_Y(y) = \frac{p_X(x)}{|g'(x)|}, \qquad x = g^{-1}(y) \]したがって、
\[ h(Y) = -\int p_Y(y)\ln p_Y(y)\,dy = -\int p_X(x)\ln\left(\frac{p_X(x)}{|g'(x)|}\right)dx \](積分変数を \(y\) から \(x\) に戻すヤコビアン \(dy=|g'(x)|dx\) と、密度の \(|g'(x)|^{-1}\) が打ち消し合うことに注意)。対数を展開すると、
\[ h(Y) = -\int p*X(x)\ln p_X(x)\,dx + \int p_X(x)\ln|g'(x)|\,dx = h(X) + \mathbb{E}*{p_X}[\ln|g'(X)|] \tag{3}\]したがって、\(|g'(x)|=1\) がほとんど至るところで成り立つ変換(平行移動 \(Y=X+b\) や符号反転 \(Y=-X\) など)でない限り、\(h(Y)\neq h(X)\) となります。特に \(Y=aX+b\) (\(a\neq0\) )というアフィン変換では \(g'(x)=a\) が定数なので、
\[ h(Y) = h(X) + \ln|a| \]という単純な関係になります。離散エントロピーが「ラベルの付け替え」(全単射な再パラメータ化)に対して常に不変だったのとは対照的に、連続確率変数では再パラメータ化(スケール変換)そのものがエントロピーの値を変えてしまう点は、PRMLでもしばしば見落とされがちな重要な注意点です。この関係も後述の数値検証で確認します。
微分エントロピーの最大化
ある制約の下で微分エントロピーを最大化する分布を考えると、その確率変数の性質がわかります。例えば、平均 \(\mu\) と分散 \(\sigma^2\) が固定されているという制約の下で微分エントロピーを最大化する分布は、ガウス分布になります。式(2)から、エントロピーは分散 \(\sigma^2\) が大きいほど(分布の広がりが大きいほど)高くなることもわかります。
条件付きエントロピーと相互情報量
条件付きエントロピー
2つの確率変数 \(X, Y\) の同時分布 \(p(x, y)\) を考えます。\(X=x\) であることがわかった上で、\(Y\) の不確実性がどれだけ残っているかを表すのが条件付きエントロピーです。
\[ H[Y|X] = -\iint p(x, y) \ln p(y|x)\, dy\, dx \]これらは、エントロピーの連鎖律として知られる以下の関係を満たします。
\[ H[X, Y] = H[Y|X] + H[X] \]これは、「\(X\) と\(Y\) を特定するための情報量は、\(X\) を特定するための情報量と、\(X\) が与えられた下で\(Y\) を特定するために必要な追加の情報量の和に等しい」と解釈できます。
相対エントロピー(カルバック・ライブラー・ダイバージェンス)
ある未知の真の分布 \(p(x)\) を、モデル \(q(x)\) で近似することを考えます。このとき、2つの分布の「隔たり」を測る尺度として相対エントロピー、またはKLダイバージェンスが用いられます。
\[ D\_{KL}(p\|q) = -\int p(x) \ln \left\{ \frac{q(x)}{p(x)} \right\} dx = \int p(x)\ln\frac{p(x)}{q(x)}\,dx \]非負性の証明(イェンセンの不等式・ギブスの不等式)
\(D_{KL}(p\|q)\ge 0\) は天下り的に認めるのではなく、イェンセンの不等式から導出できます(この導出は特にギブスの不等式と呼ばれます)。
対数関数 \(\ln\) は凹関数なので、任意の確率変数 \(Z\) に対してイェンセンの不等式
\[ \ln(\mathbb{E}[Z]) \ge \mathbb{E}[\ln Z] \]が成り立ちます(等号は \(Z\) がほとんど確実に定数のときに限る。これは \(\ln\) が狭義凹関数であるためです)。ここで \(Z = q(X)/p(X)\) (期待値は \(p\) の下でとる)とおくと、
\[ \mathbb{E}\_p\left[\ln\frac{q(X)}{p(X)}\right] \le \ln\left(\mathbb{E}\_p\left[\frac{q(X)}{p(X)}\right]\right) = \ln\left(\int p(x)\frac{q(x)}{p(x)}dx\right) = \ln\left(\int q(x)\,dx\right) = \ln 1 = 0 \]左辺は \(\mathbb{E}_p[\ln q(X) - \ln p(X)] = -D_{KL}(p\|q)\) に等しいので、
\[ -D*{KL}(p\|q) \le 0 \quad\Longleftrightarrow\quad D*{KL}(p\|q) \ge 0 \tag{4}\]が得られます。等号成立条件は、イェンセンの不等式の等号成立条件(\(Z=q(X)/p(X)\) が \(p\) の下でほとんど確実に定数)から従います。\(\int p(x)(q(x)/p(x))\,dx = \int q(x)\,dx = 1\) なので、その定数は \(1\) でなければなりません。したがって
\[ D\_{KL}(p\|q) = 0 \iff q(x) = p(x) \ \text{($p$ の台上でほとんど至るところ)} \]となります(「\(p(x)>0\) となる領域上でほとんど至るところ」という限定が必要なのは、\(p(x)=0\) の領域では \(q(x)\) の値がKLダイバージェンスに寄与しないためです)。この非負性・等号成立条件は後述の数値検証で、多数のランダムな分布ペアに対して確認します。
この性質から、KLダイバージェンスは2つの分布間の「距離」のような尺度として解釈できます(ただし、対称性 \(D_{KL}(p\|q) \neq D_{KL}(q\|p)\) を満たさないため、数学的な距離ではありません)。この非対称性がどの程度のものかを、具体的な数値例で後述します。
KLダイバージェンス最小化と最尤推定
データが未知の分布 \(p(x)\) から生成されているとき、それをパラメータ \(\theta\) を持つモデル \(q(x|\theta)\) で近似する場合、両者のKLダイバージェンスを最小化する \(\theta\) を見つけることが目標となります。
\(D_{KL}(p\|q)\) の式を展開すると、
\[ D\_{KL}(p\|q) = -\int p(x) \ln q(x|\theta)\, dx + \int p(x) \ln p(x)\, dx \]第2項は真の分布のエントロピーであり、\(\theta\) には依存しません。したがって、\(D_{KL}(p\|q)\) を最小化することは、第1項、すなわち対数尤度の期待値を最大化することと等価です。
データセット \(\{x_n\}\) が与えられた場合、この期待値はデータの平均で近似できるため、結果的にKLダイバージェンスの最小化は、尤度の最大化(最尤推定)と等価になります。
クロスエントロピー損失と機械学習
上の展開の第1項 \(-\int p(x)\ln q(x|\theta)\,dx = \mathbb{E}_p[-\ln q(X|\theta)]\) はクロスエントロピー \(H(p,q)\) と呼ばれる量そのものです。定義に戻ると、
\[ H(p,q) \equiv -\int p(x)\ln q(x)\,dx = \underbrace{-\int p(x)\ln p(x)\,dx}_{=H(p)} + \int p(x)\ln\frac{p(x)}{q(x)}\,dx = H(p) + D_{KL}(p\|q) \tag{5}\]という分解ができます。機械学習の分類問題で「クロスエントロピー損失」を使う理由は、まさにこの式(5)にあります。真のラベル分布を \(p\) (多くの場合、正解クラスだけが1でそれ以外が0の one-hot ベクトル)、モデルの出力を \(q_\theta\) とすると、\(H(p)\) はモデルパラメータ \(\theta\) に依存しない定数なので、
\[ \arg\min*\theta H(p, q*\theta) = \arg\min*\theta \left[H(p) + D*{KL}(p\|q*\theta)\right] = \arg\min*\theta D*{KL}(p\|q*\theta) \]すなわち、クロスエントロピー損失を最小化することは、真の分布とモデルのKLダイバージェンスを最小化することと完全に等価です。特に \(p\) が one-hot ベクトルの場合、\(H(p)=-1\cdot\ln 1 - 0\cdot\ln 0 - \cdots = 0\) が(\(0\ln 0=0\) の慣例のもとで)厳密に成り立つため、クロスエントロピー損失とKLダイバージェンスは「定数を除いて等しい」のではなく、その場では数値として完全に一致します。ラベルスムージングのように \(p\) が one-hot でない(各クラスに小さな確率を配る)場合でも、\(H(p)\) は \(\theta\) に依存しない定数として残るだけで、上の等価性そのものは変わりません。この一致・等価性は後述の数値検証で、具体的な数値と最適化の実行結果によって確認します。
なお、真の分布 \(p\) や モデル \(q\) が連続値・多変量ガウス分布としてモデル化される回帰・生成モデルの場合の具体的な閉形式は、 ガウス分布間クロスエントロピーの閉形式解の数理導出 で詳しく扱っています。そちらでは、ここでの \(H(p,q)=H(p)+D_{KL}(p\|q)\) という関係を出発点に、ガウス分布同士のクロスエントロピー・KLダイバージェンスの閉形式を導出し、モンテカルロ推定との数値照合まで行っています。
相互情報量
2つの確率変数 \(X, Y\) がどれだけ強く依存しているか、一方を知ることで他方の不確実性がどれだけ減少するかを表す尺度が相互情報量です。
これは、同時分布 \(p(x, y)\) と、変数が独立だと仮定した場合の分布 \(p(x)p(y)\) との間のKLダイバージェンスとして定義されます。
\[ I[X, Y] \equiv D\_{KL}(p(x, y) \| p(x)p(y)) = \iint p(x, y) \ln \left(\frac{p(x, y)}{p(x)p(y)}\right) dx\, dy \]相互情報量はKLダイバージェンスの特殊ケースなので、式(4)の非負性がそのまま適用でき、\(I[X,Y]\ge 0\) が成り立ちます。等号成立条件も式(4)から従い、\(p(x,y)=p(x)p(y)\) がほとんど至るところで成り立つとき、すなわち \(X\) と \(Y\) が独立であるときに限り \(I[X,Y]=0\) となります。
相互情報量は、エントロピーを用いて以下のように表現することもできます。
\[ I[X, Y] = H[X] - H[X|Y] = H[Y] - H[Y|X] \]これは、「\(Y\) を知ることで減少する\(X\) の不確実性の量」と解釈できます。
数値検証
ここまでの導出・主張が数値的にも成り立つことを、実際に実行したコードで確認します。
微分エントロピーの符号反転と変数変換の非不変性
式(2)の閉形式を、数値積分(scipy.integrate.quad)およびモンテカルロ推定と突き合わせます。あわせて、式(3)の変数変換公式 \(h(Y)=h(X)+\ln|a|\)
(\(Y=aX+b\)
)も数値的に確認します。
import numpy as np
from scipy import integrate, stats
rng = np.random.default_rng(42)
def h_gaussian_closed(sigma):
return 0.5 * np.log(2 * np.pi * np.e * sigma**2)
# 解析的な符号反転点: 2*pi*e*sigma^2 = 1 => sigma* = 1/sqrt(2*pi*e)
sigma_star = 1.0 / np.sqrt(2 * np.pi * np.e)
print(f"sigma* = 1/sqrt(2*pi*e) = {sigma_star:.6f}, h(sigma*) = {h_gaussian_closed(sigma_star):.3e}")
print(f"{'sigma':>8} {'h_closed':>10} {'h_quad':>10} {'h_MC(N=2e6)':>12}")
for sigma in [0.05, 0.10, sigma_star, 0.30, 1.00, 3.00]:
def neg_p_logp(x, sigma=sigma):
p = stats.norm.pdf(x, scale=sigma)
return -p * np.log(p)
h_quad, _ = integrate.quad(neg_p_logp, -20 * sigma, 20 * sigma, limit=200)
x = rng.normal(0.0, sigma, size=2_000_000)
h_mc = -np.mean(stats.norm.logpdf(x, scale=sigma))
print(f"{sigma:8.5f} {h_gaussian_closed(sigma):10.5f} {h_quad:10.5f} {h_mc:12.5f}")
# 閉形式を使わず、数値積分の符号反転だけからsigma*を二分探索で求める
def h_quad_of_sigma(sigma):
def neg_p_logp(x):
p = stats.norm.pdf(x, scale=sigma)
return -p * np.log(p)
val, _ = integrate.quad(neg_p_logp, -20 * sigma, 20 * sigma, limit=200)
return val
lo, hi = 0.05, 1.0
for _ in range(40):
mid = 0.5 * (lo + hi)
if h_quad_of_sigma(mid) < 0:
lo = mid
else:
hi = mid
print(f"数値積分のみからの二分探索: sigma* ~ {0.5*(lo+hi):.6f}")
# 変数変換による非不変性: Y = a*X + b
a, b = 2.0, 3.0
sigma_x = 1.0
h_x_closed = h_gaussian_closed(sigma_x)
h_y_closed = h_gaussian_closed(a * sigma_x)
print(f"\nh(X), X~N(0,1): closed={h_x_closed:.6f}")
print(f"h(Y), Y=2X+3 : closed={h_y_closed:.6f}, h(X)+ln|a|={h_x_closed+np.log(a):.6f}")
N = 4_000_000
x = rng.normal(0.0, sigma_x, size=N)
y = a * x + b
h_x_mc = -np.mean(stats.norm.logpdf(x, 0.0, sigma_x))
h_y_mc = -np.mean(stats.norm.logpdf(y, b, a * sigma_x))
print(f"MC確認: h(X)={h_x_mc:.6f}, h(Y)={h_y_mc:.6f}, h(Y)-h(X)={h_y_mc-h_x_mc:.6f} (ln 2={np.log(2):.6f})")
実行結果:
sigma* = 1/sqrt(2*pi*e) = 0.241971, h(sigma*) = 0.000e+00
sigma h_closed h_quad h_MC(N=2e6)
0.05000 -1.57679 -1.57679 -1.57693
0.10000 -0.88365 -0.88365 -0.88374
0.24197 0.00000 -0.00000 -0.00027
0.30000 0.21497 0.21497 0.21455
1.00000 1.41894 1.41894 1.41856
3.00000 2.51755 2.51755 2.51747
数値積分のみからの二分探索: sigma* ~ 0.241971
h(X), X~N(0,1): closed=1.418939
h(Y), Y=2X+3 : closed=2.112086, h(X)+ln|a|=2.112086
MC確認: h(X)=1.418861, h(Y)=2.112008, h(Y)-h(X)=0.693147 (ln 2=0.693147)
\(\sigma < \sigma^* \approx 0.241971\) で \(h(X)<0\) となること、そしてこの符号反転点が、閉形式・数値積分・二分探索(閉形式を一切使わない探索)のいずれからも同じ値 \(0.241971\) に一致することが確認できました。また、\(\sigma=0.05\) のように十分小さい \(\sigma\) では \(h(X)\approx-1.577\) と明確に負の値をとり、これはモンテカルロ推定(\(-1.57693\) )とも整合しています。
変数変換については、\(Y=2X+3\) に対して \(h(Y)-h(X) = \ln 2 = 0.693147\) が閉形式・モンテカルロ推定の両方で(有効数字6桁まで)一致しており、平行移動 \(b\) は無関係でスケール \(a=2\) のみが寄与すること、そして離散エントロピーとは異なり微分エントロピーが再パラメータ化で値を変えることが具体的な数値で確認できます。
下図は、\(\mathcal{N}(0,\sigma^2)\) の微分エントロピーを \(\sigma\) の関数として描いたものです。\(\sigma^*\approx0.2420\) で符号が反転し、それより小さい \(\sigma\) では常に負になることが視覚的にもわかります。プロット上の点は、上記コードで数値的に検証した値です。

KLダイバージェンスの非対称性
具体的な2組の分布ペア(ベルヌーイ分布とガウス分布)で \(D_{KL}(p\|q)\) と \(D_{KL}(q\|p)\) を計算し、両者が異なることを確認します。
import numpy as np
from scipy import stats
rng = np.random.default_rng(42)
def kl_bernoulli(p, q):
return p * np.log(p / q) + (1 - p) * np.log((1 - p) / (1 - q))
def kl_gauss(mu_a, s_a, mu_b, s_b):
return np.log(s_b / s_a) + (s_a**2 + (mu_a - mu_b) ** 2) / (2 * s_b**2) - 0.5
# ベルヌーイ分布の例
p1, q1 = 0.1, 0.5
kl_pq_bern = kl_bernoulli(p1, q1)
kl_qp_bern = kl_bernoulli(q1, p1)
print(f"Bernoulli: p=Bern({p1}), q=Bern({q1})")
print(f" D_KL(p||q) = {kl_pq_bern:.6f}")
print(f" D_KL(q||p) = {kl_qp_bern:.6f}")
print(f" ratio D_KL(p||q)/D_KL(q||p) = {kl_pq_bern/kl_qp_bern:.6f}")
N = 2_000_000
x_p = rng.random(N) < p1
x_q = rng.random(N) < q1
def bern_logpmf(x, r):
return np.where(x, np.log(r), np.log(1 - r))
kl_pq_bern_mc = np.mean(bern_logpmf(x_p, p1) - bern_logpmf(x_p, q1))
kl_qp_bern_mc = np.mean(bern_logpmf(x_q, q1) - bern_logpmf(x_q, p1))
print(f" MC (N={N}): D_KL(p||q)~{kl_pq_bern_mc:.6f}, D_KL(q||p)~{kl_qp_bern_mc:.6f}")
# ガウス分布の例
mu1, s1, mu2, s2 = 0.0, 1.0, 2.0, 0.5
kl_pq_g = kl_gauss(mu1, s1, mu2, s2)
kl_qp_g = kl_gauss(mu2, s2, mu1, s1)
print(f"\nGaussian: p=N({mu1},{s1**2}), q=N({mu2},{s2**2})")
print(f" D_KL(p||q) = {kl_pq_g:.6f}")
print(f" D_KL(q||p) = {kl_qp_g:.6f}")
print(f" ratio D_KL(p||q)/D_KL(q||p) = {kl_pq_g/kl_qp_g:.6f}")
Ng = 4_000_000
xp = rng.normal(mu1, s1, size=Ng)
xq = rng.normal(mu2, s2, size=Ng)
kl_pq_g_mc = np.mean(stats.norm.logpdf(xp, mu1, s1) - stats.norm.logpdf(xp, mu2, s2))
kl_qp_g_mc = np.mean(stats.norm.logpdf(xq, mu2, s2) - stats.norm.logpdf(xq, mu1, s1))
print(f" MC (N={Ng}): D_KL(p||q)~{kl_pq_g_mc:.6f}, D_KL(q||p)~{kl_qp_g_mc:.6f}")
実行結果:
Bernoulli: p=Bern(0.1), q=Bern(0.5)
D_KL(p||q) = 0.368064
D_KL(q||p) = 0.510826
ratio D_KL(p||q)/D_KL(q||p) = 0.720528
MC (N=2000000): D_KL(p||q)~0.368663, D_KL(q||p)~0.511645
Gaussian: p=N(0.0,1.0), q=N(2.0,0.25)
D_KL(p||q) = 8.806853
D_KL(q||p) = 2.318147
ratio D_KL(p||q)/D_KL(q||p) = 3.799091
MC (N=4000000): D_KL(p||q)~8.806647, D_KL(q||p)~2.317821
ベルヌーイ分布の例では \(D_{KL}(p\|q)=0.368064\) に対し \(D_{KL}(q\|p)=0.510826\) と、両者の比は約 \(0.72\) で明確に異なります。ガウス分布の例(分散が異なる \(p=\mathcal{N}(0,1)\) と \(q=\mathcal{N}(2,0.25)\) )では差はさらに大きく、\(D_{KL}(p\|q)=8.807\) に対し \(D_{KL}(q\|p)=2.318\) と、約 \(3.8\) 倍の開きがあります。いずれもモンテカルロ推定による独立なクロスチェックが閉形式の値と有効数字3桁程度で一致しており、この非対称性が単なる式変形上のものではなく、実際に異なる数値を生むことが確認できます。ガウスの例で差が特に大きいのは、\(D_{KL}(p\|q)\) が \(q\) の裾(分散 \(0.25\) )に対して \(p\) の広がり(分散 \(1\) )を強引に押し込める格好になり、\(\ln(s_2/s_1)\) の項が負に効く一方で二次形式の項が大きくなるためです。
下図左は \(p,q\) の密度と両方向のKL値、右はベルヌーイ・ガウス両方の例を並べた棒グラフです。

イェンセンの不等式(ギブスの不等式)の非負性チェック
式(4)の非負性を、多数のランダムな離散分布ペア・ガウス分布ペアで確認します。あわせて、\(p=q\) のとき厳密に \(0\) になること、\(p\neq q\) の場合は(差が小さくても)厳密に正になることも確認します。
import numpy as np
rng = np.random.default_rng(42)
# 離散分布のランダムなペア(ディリクレ分布からサンプル)でD_KL >= 0を検証
n_trials, k_max = 20000, 8
min_kl, violations = np.inf, 0
for _ in range(n_trials):
k = rng.integers(2, k_max + 1)
p = rng.dirichlet(np.ones(k) * rng.uniform(0.3, 5.0))
q = rng.dirichlet(np.ones(k) * rng.uniform(0.3, 5.0))
kl = np.sum(p * np.log(p / q))
min_kl = min(min_kl, kl)
violations += kl < -1e-9
print(f"離散分布 trials={n_trials} (次元 2-{k_max}): violations={violations}, min D_KL={min_kl:.3e}")
# 等号成立条件: p == q なら厳密に0
p = rng.dirichlet(np.ones(5))
print(f"D_KL(p||p) (ランダムなp): {np.sum(p*np.log(p/p)):.3e} (厳密に0)")
# ごくわずかな摂動: 一次の項が消えるため、KLは摂動の2乗のオーダーで正になる
q2 = p.copy()
q2[0] += 1e-9
q2[1] -= 1e-9
print(f"D_KL(p||q), q=pを2成分だけ1e-9摂動: {np.sum(p*np.log(p/q2)):.3e} ((1e-9)^2のオーダー)")
# 連続分布: ランダムな1次元ガウス分布ペア(閉形式)でD_KL >= 0を検証
n_gauss = 5000
min_kl_g, viol_g = np.inf, 0
for _ in range(n_gauss):
mu1, s1 = rng.uniform(-5, 5), rng.uniform(0.1, 3)
mu2, s2 = rng.uniform(-5, 5), rng.uniform(0.1, 3)
kl_g = np.log(s2 / s1) + (s1**2 + (mu1 - mu2) ** 2) / (2 * s2**2) - 0.5
min_kl_g = min(min_kl_g, kl_g)
viol_g += kl_g < -1e-9
print(f"ガウス分布 trials={n_gauss}: violations={viol_g}, min D_KL={min_kl_g:.3e}")
実行結果:
離散分布 trials=20000 (次元 2-8): violations=0, min D_KL=2.044e-08
D_KL(p||p) (ランダムなp): 0.000e+00 (厳密に0)
D_KL(p||q), q=pを2成分だけ1e-9摂動: -5.653e-18 ((1e-9)^2のオーダー)
ガウス分布 trials=5000: violations=0, min D_KL=1.729e-04
離散分布 \(20{,}000\) 組・ガウス分布 \(5{,}000\) 組のいずれについても、閾値 \(-10^{-9}\) を下回る(=非負性が破れる)ケースは0件でした。\(p=q\) のときは(浮動小数点演算上も)厳密に \(0\) になることが確認できます。\(p\) をごく僅か(\(10^{-9}\) オーダー)摂動させた場合の値 \(-5.653\times10^{-18}\) については、絶対値としては \((10^{-9})^2=10^{-18}\) のオーダーで、これはイェンセンの不等式が等号(\(p=q\) )近傍で2次のオーダーで開くこと(KLダイバージェンスが \(q=p\) の周りで2次のテイラー展開を持ち、1次の項が消えること。これはフィッシャー情報量に基づく局所的な計量としてのKLダイバージェンスの解釈と対応します)と整合的です。ただし符号がマイナスになっているのは、この大きさ(\(10^{-18}\) )が倍精度浮動小数点の丸め誤差の水準に達しているためであり、数学的な非負性そのものが破れているわけではありません。この点も含めて数値実験の限界として明記しておきます。
クロスエントロピー損失とKLダイバージェンス最小化の等価性
式(5)の関係、および one-hot ラベルの場合に \(H(p)=0\) が厳密に成り立つことを、具体的な数値と最適化の実行結果で確認します。
import numpy as np
from scipy.optimize import minimize
rng = np.random.default_rng(0)
def safe_xlogy(p, q):
with np.errstate(divide="ignore", invalid="ignore"):
return np.where(p > 0, p * np.log(q), 0.0)
# one-hotラベル(分類タスクの正解ラベル)
p_onehot = np.array([0.0, 1.0, 0.0, 0.0])
q_model = np.array([0.05, 0.85, 0.05, 0.05])
H_p = -np.sum(safe_xlogy(p_onehot, p_onehot))
H_pq = -np.sum(safe_xlogy(p_onehot, q_model))
KL_pq = H_pq - H_p
print(f"one-hot p={p_onehot}, model q={q_model}")
print(f"H(p)={H_p:.6f} H(p,q)={H_pq:.6f} D_KL(p||q)=H(p,q)-H(p)={KL_pq:.6f}")
print("pがone-hotなのでH(p)=0が厳密に成立し、クロスエントロピー損失はKLダイバージェンスそのもの。")
# ラベルスムージング: H(p)はthetaに依存しない非ゼロの定数になる
eps, K = 0.1, 4
p_smooth = np.full(K, eps / K)
p_smooth[1] = 1 - eps + eps / K
H_p_s = -np.sum(safe_xlogy(p_smooth, p_smooth))
H_pq_s = -np.sum(safe_xlogy(p_smooth, q_model))
print(f"\nラベルスムージング p={np.round(p_smooth,4)}")
print(f"H(p)={H_p_s:.6f} (thetaに依存しない定数) H(p,q)={H_pq_s:.6f} D_KL(p||q)={H_pq_s-H_p_s:.6f}")
# argmin自体の一致確認: q_theta=softmax(theta) を p_smooth に(a)クロスエントロピー損失
# H(p,q_theta)、(b)KLダイバージェンス D_KL(p||q_theta) それぞれで直接最小化し、
# 両者が同じq*に収束することを確認する
def softmax(z):
e = np.exp(z - np.max(z))
return e / np.sum(e)
def ce_loss(theta, p):
return -np.sum(safe_xlogy(p, softmax(theta)))
def kl_loss(theta, p):
q = softmax(theta)
return np.sum(np.where(p > 0, p * np.log(p / q), 0.0))
theta0 = rng.normal(size=K)
q_ce = softmax(minimize(ce_loss, theta0, args=(p_smooth,), method="BFGS").x)
q_kl = softmax(minimize(kl_loss, theta0, args=(p_smooth,), method="BFGS").x)
print(f"\nクロスエントロピー損失によるargmin -> q* = {np.round(q_ce,6)}")
print(f"KLダイバージェンスによるargmin -> q* = {np.round(q_kl,6)}")
print(f"両者の最大絶対差: {np.max(np.abs(q_ce-q_kl)):.3e}")
print(f"いずれも真のp_smoothに収束: {np.allclose(q_ce,p_smooth,atol=1e-4)} / {np.allclose(q_kl,p_smooth,atol=1e-4)}")
実行結果:
one-hot p=[0. 1. 0. 0.], model q=[0.05 0.85 0.05 0.05]
H(p)=-0.000000 H(p,q)=0.162519 D_KL(p||q)=H(p,q)-H(p)=0.162519
pがone-hotなのでH(p)=0が厳密に成立し、クロスエントロピー損失はKLダイバージェンスそのもの。
ラベルスムージング p=[0.025 0.925 0.025 0.025]
H(p)=0.348780 (thetaに依存しない定数) H(p,q)=0.375010 D_KL(p||q)=0.026230
クロスエントロピー損失によるargmin -> q* = [0.025002 0.925004 0.024994 0.025001]
KLダイバージェンスによるargmin -> q* = [0.025002 0.925004 0.024994 0.025001]
両者の最大絶対差: 1.062e-08
いずれも真のp_smoothに収束: True / True
one-hot ラベルの例では \(H(p)=0\) (浮動小数点表示上は \(-0.000000\) )が厳密に成り立ち、\(H(p,q)=0.162519\) と \(D_{KL}(p\|q)=0.162519\) が完全に一致しています。ラベルスムージングの例では \(H(p)=0.348780\) という非ゼロの定数が現れますが、これは真のラベル分布 \(p\) のみで決まりモデルパラメータには依存しないため、\(H(p,q_\theta)\) を最小化する \(\theta\) と \(D_{KL}(p\|q_\theta)\) を最小化する \(\theta\) は数学的に同一のはずです。実際に BFGS 法でそれぞれ独立に最適化した結果、両者が収束した \(q^*\) の最大絶対差は \(1.062\times10^{-8}\) と最適化アルゴリズムの数値誤差の範囲内で一致しており、しかもどちらも真の分布 \(p_{\text{smooth}}\) に収束しています(softmax の下でクロスエントロピー損失・KLダイバージェンスがいずれも \(q=p\) で最小値をとることの直接的な確認でもあります)。
まとめ
- 微分エントロピー \(h(X)=\frac12\ln(2\pi e\sigma^2)\) (ガウス分布)は、離散エントロピーと異なり負の値をとりうること(\(\sigma<\sigma^*=1/\sqrt{2\pi e}\approx0.2420\) で負)、また変数変換 \(Y=aX+b\) に対して不変ではなく \(h(Y)=h(X)+\ln|a|\) となることを、閉形式・数値積分・モンテカルロ推定・二分探索という独立な4つの方法で確認した。
- \(D_{KL}(p\|q)\ge 0\) はイェンセンの不等式(ギブスの不等式)から導出でき、等号は \(p=q\) (ほとんど至るところ)のときに限る。この非負性を離散・連続それぞれ数千組のランダムな分布ペアで数値的にも確認した。
- KLダイバージェンスの非対称性 \(D_{KL}(p\|q)\neq D_{KL}(q\|p)\) を、ベルヌーイ分布・ガウス分布の具体例で数値的に示した(ガウスの例では約3.8倍の開き)。
- クロスエントロピー損失 \(H(p,q)=H(p)+D_{KL}(p\|q)\) の分解から、\(H(p)\) がモデルパラメータに依存しないため、クロスエントロピー損失の最小化とKLダイバージェンスの最小化が等価であることを導出し、one-hotラベルでは両者が数値として厳密に一致すること、ラベルスムージングでも両者の最適化結果(argmin)が一致することを確認した。連続値・多変量ガウスへの具体的な一般化は ガウス分布間クロスエントロピーの閉形式解の数理導出 を参照。
参考
- C.M. ビショップ, パターン認識と機械学習 上 , 丸善出版 (2012)