f-ダイバージェンスの統一理論 — KLダイバージェンスからχ²まで

2つの確率分布がどれだけ「異なる」かを測定する方法は一つではありません。統計的仮説検定ではKLダイバージェンスやχ²統計量を使い、生成モデルの学習ではJensen-Shannonダイバージェンスやワッサースタイン距離を使います。これらは一見バラバラの概念に見えますが、実はf-ダイバージェンス(f-divergence)という一つの統一的な枠組みから、特別な場合として導かれることをご存知でしょうか。

f-ダイバージェンスは、1960年代にチサール(Csiszár)、モリモト(Morimoto)、アリ・シルベイ(Ali-Silvey)によって独立に導入された概念です。凸関数 $f$ の選び方一つで、まったく異なる性質を持つ多様な「距離」が生み出されます。

f-ダイバージェンスを理解すると、以下のような分野に直接つながります。

  • 生成モデル: GAN(敵対的生成ネットワーク)の学習目的関数は、f-ダイバージェンスの変分表現から導かれます。f-GANはこの対応を直接利用した手法です
  • 統計的検定: ネイマン・ピアソンの補題やχ²検定の背後にある数理構造が、f-ダイバージェンスの枠組みで統一的に理解できます
  • 情報理論: 通信路容量やレート歪み関数の議論で登場する様々な情報量の不等式が、f-ダイバージェンスの性質から導かれます
  • ベイズ統計: 事前分布と事後分布の乖離の測定、変分推論(Variational Inference)の目的関数設計に関わります

本記事の内容

  • f-ダイバージェンスの統一的な定義と直感的理解
  • 主要なf-ダイバージェンス(KL、逆KL、χ²、Hellinger、Jensen-Shannon、全変動)の導出
  • f-ダイバージェンスの基本性質(非負性、凸性、データ処理不等式、同時凸性)
  • 変分表現(Fenchel双対)とGANへの接続
  • 各ダイバージェンス間の不等式関係
  • Pythonによる数値計算と可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

2つの分布の「違い」を測る — 統一的な枠組みへ

なぜ統一理論が必要か

確率分布間の「距離」を測る指標は驚くほど多くの種類があります。主なものだけでも、

  • KLダイバージェンス: $D_{\mathrm{KL}}(P \| Q) = \int p(x) \log \frac{p(x)}{q(x)} dx$
  • χ²ダイバージェンス: $\chi^2(P \| Q) = \int \frac{(p(x) – q(x))^2}{q(x)} dx$
  • ヘリンジャー距離の二乗: $H^2(P, Q) = \int (\sqrt{p(x)} – \sqrt{q(x)})^2 dx$
  • 全変動距離: $\mathrm{TV}(P, Q) = \frac{1}{2}\int |p(x) – q(x)| dx$
  • Jensen-Shannonダイバージェンス: $\mathrm{JS}(P \| Q) = \frac{1}{2}D_{\mathrm{KL}}(P \| M) + \frac{1}{2}D_{\mathrm{KL}}(Q \| M)$($M = \frac{P+Q}{2}$)

これらは個別に定義されて個別に性質が証明されてきましたが、実はすべて一つの凸関数 $f$ のパラメータとして統一できるのです。これが f-ダイバージェンスの力です。

統一的な枠組みを持つことの利点は大きく3つあります。第一に、個々のダイバージェンスの性質(非負性、データ処理不等式など)を個別に証明する必要がなくなり、f-ダイバージェンス全体に対して一度証明すれば十分です。第二に、ダイバージェンス間の不等式関係が凸関数 $f$ の性質から体系的に導けます。第三に、「新しいダイバージェンス」を目的に応じて設計する際の指針が得られます。

密度比という視点

f-ダイバージェンスの核心的なアイデアは、2つの分布の比較を密度比(density ratio、likelihood ratio)$\frac{p(x)}{q(x)}$ を通じて行うことです。

密度比は、各点 $x$ において $P$ と $Q$ がどれだけ異なるかを示す局所的な指標です。$p(x)/q(x) = 1$ なら、その点では2つの分布は同じ値を持ちます。$p(x)/q(x) > 1$ なら $P$ の方が高い確率密度を持ち、$p(x)/q(x) < 1$ なら $Q$ の方が高い確率密度を持ちます。

f-ダイバージェンスは、この密度比に凸関数 $f$ を適用してから $Q$ に関する期待値を取ることで、局所的な比較を一つのスカラー値に集約します。

この直感を踏まえて、f-ダイバージェンスの正式な定義に進みましょう。

f-ダイバージェンスの定義

正式な定義

$P$ と $Q$ を同じ可測空間上の2つの確率分布とし、$P$ が $Q$ に対して絶対連続($Q(A) = 0 \Rightarrow P(A) = 0$)であると仮定します。$f: (0, \infty) \to \mathbb{R}$ を凸関数で $f(1) = 0$ を満たすものとします。このとき、$P$ から $Q$ へのf-ダイバージェンスは次のように定義されます。

$$ D_f(P \| Q) = \int q(x) f\left(\frac{p(x)}{q(x)}\right) dx = E_Q\left[f\left(\frac{p(X)}{q(X)}\right)\right] $$

ここで $p(x)$、$q(x)$ はそれぞれ $P$、$Q$ の確率密度関数(離散の場合は確率質量関数)です。

この定義の構造を分解して理解しましょう。

  1. 密度比 $t = p(x)/q(x)$ を計算する — 各点での $P$ と $Q$ の相対的な違いを表す
  2. 凸関数 $f(t)$ を適用する — 密度比の偏差を「ペナルティ」に変換する。$f(1) = 0$ なので、$P = Q$ の点ではペナルティなし
  3. $Q$ に関する期待値 を取る — ペナルティを $Q$ の重みで平均する

$f(1) = 0$ という条件は、$P = Q$ のとき $D_f(P \| Q) = E_Q[f(1)] = 0$ となることを保証しています。凸性の条件は、$D_f(P \| Q) \geq 0$(非負性)を保証するために必要です。

離散版の定義

離散確率分布 $P = (p_1, p_2, \dots, p_n)$、$Q = (q_1, q_2, \dots, q_n)$ に対しては、

$$ D_f(P \| Q) = \sum_{i=1}^{n} q_i f\left(\frac{p_i}{q_i}\right) $$

です。$q_i = 0$ かつ $p_i > 0$ の場合は $D_f = \infty$ と定義します。$q_i = 0$ かつ $p_i = 0$ の項は、$\lim_{t \to 0} q_i f(p_i/q_i) = 0$ により0とします。

定義を理解したところで、具体的な凸関数 $f$ を選ぶことで、冒頭で挙げた個々のダイバージェンスが得られることを確認しましょう。

主要なf-ダイバージェンスの導出

KLダイバージェンス

$f(t) = t \log t$ を選びます。$f$ の凸性は $f”(t) = 1/t > 0$($t > 0$)から確認でき、$f(1) = 1 \cdot \log 1 = 0$ です。

$$ D_f(P \| Q) = \int q(x) \cdot \frac{p(x)}{q(x)} \log \frac{p(x)}{q(x)} \, dx = \int p(x) \log \frac{p(x)}{q(x)} \, dx = D_{\mathrm{KL}}(P \| Q) $$

交差エントロピーとKLダイバージェンスの関係で学んだKLダイバージェンスが、確かに $f(t) = t \log t$ のf-ダイバージェンスとして得られました。

逆KLダイバージェンス

$f(t) = -\log t$ を選びます。$f”(t) = 1/t^2 > 0$ で凸、$f(1) = 0$ です。

$$ D_f(P \| Q) = \int q(x) \left(-\log \frac{p(x)}{q(x)}\right) dx = \int q(x) \log \frac{q(x)}{p(x)} \, dx = D_{\mathrm{KL}}(Q \| P) $$

これは逆KLダイバージェンスです。KLダイバージェンスは非対称($D_{\mathrm{KL}}(P \| Q) \neq D_{\mathrm{KL}}(Q \| P)$)であり、引数の順序を入れ替えることは $f$ を変えることに対応します。

変分推論では、$D_{\mathrm{KL}}(Q \| P)$ を最小化する近似分布 $Q$ を求めます(逆方向のKL)。KLダイバージェンスと逆KLダイバージェンスの最小化は、質的に異なる結果を与えます。前者はmode-covering($P$ が大きいところに $Q$ も配置する)、後者はmode-seeking($Q$ が大きいところに $P$ も大きいことを要求する)的な振る舞いをします。

χ²ダイバージェンス(ピアソン)

$f(t) = (t – 1)^2$ を選びます。$f”(t) = 2 > 0$ で凸、$f(1) = 0$ です。

$$ D_f(P \| Q) = \int q(x) \left(\frac{p(x)}{q(x)} – 1\right)^2 dx = \int \frac{(p(x) – q(x))^2}{q(x)} \, dx = \chi^2(P \| Q) $$

これはピアソンのχ²ダイバージェンスです。統計的検定で使われるχ²統計量は、このダイバージェンスにサンプルサイズ $n$ を乗じたものです。

逆χ²ダイバージェンス(ネイマン)

$f(t) = (1 – t)^2 / t = 1/t – 2 + t$ を選ぶと、ネイマンのχ²ダイバージェンスが得られます。

$$ D_f(P \| Q) = \int \frac{(p(x) – q(x))^2}{p(x)} \, dx = \chi^2(Q \| P) $$

ヘリンジャー距離の二乗

$f(t) = (\sqrt{t} – 1)^2 = t – 2\sqrt{t} + 1$ を選びます。$f”(t) = 1/(4t^{3/2}) > 0$ で凸、$f(1) = 0$ です。

$$ D_f(P \| Q) = \int q(x) \left(\sqrt{\frac{p(x)}{q(x)}} – 1\right)^2 dx = \int \left(\sqrt{p(x)} – \sqrt{q(x)}\right)^2 dx = H^2(P, Q) $$

これはヘリンジャー距離の二乗です。ヘリンジャー距離 $H(P, Q) = \sqrt{H^2(P, Q)}$ は真の距離(三角不等式を満たす)であり、0から $\sqrt{2}$ の間の値を取ります。

ヘリンジャー距離はKLダイバージェンスと異なり対称です。$f(t) = (\sqrt{t} – 1)^2$ は $f(t) = t \cdot f(1/t)$ の関係(後述する双対性)を満たすからです。

全変動距離

$f(t) = \frac{1}{2}|t – 1|$ を選びます。この関数は $t = 1$ で微分不可能ですが、凸であり $f(1) = 0$ を満たします。

$$ D_f(P \| Q) = \int q(x) \cdot \frac{1}{2}\left|\frac{p(x)}{q(x)} – 1\right| dx = \frac{1}{2}\int |p(x) – q(x)| \, dx = \mathrm{TV}(P, Q) $$

全変動距離は確率分布の差の $L^1$ ノルムの半分です。$\mathrm{TV}(P, Q)$ は0から1の間の値を取り、確率的な解釈として「$P$ と $Q$ を最もよく区別するイベント $A$ での確率の最大差」に等しくなります。

$$ \mathrm{TV}(P, Q) = \max_A |P(A) – Q(A)| $$

Jensen-Shannonダイバージェンス

$f(t) = t \log t – (1+t) \log \frac{1+t}{2}$ を選ぶと、Jensen-Shannon(JS)ダイバージェンスが得られます。

$$ D_f(P \| Q) = \frac{1}{2}D_{\mathrm{KL}}(P \| M) + \frac{1}{2}D_{\mathrm{KL}}(Q \| M), \quad M = \frac{P + Q}{2} $$

JSダイバージェンスは対称であり、$[0, \log 2]$ の有界な値を取ります。GANの原論文(Goodfellow et al., 2014)の最適判別器のもとでの目的関数は、JSダイバージェンスの定数倍に帰着されます。

一覧表

以下に主要なf-ダイバージェンスをまとめます。

名称 $f(t)$ $D_f(P \| Q)$ 対称性
KL $t \log t$ $\int p \log(p/q)$ 非対称
逆KL $-\log t$ $\int q \log(q/p)$ 非対称
χ²(ピアソン) $(t-1)^2$ $\int (p-q)^2/q$ 非対称
ヘリンジャー² $(\sqrt{t}-1)^2$ $\int (\sqrt{p}-\sqrt{q})^2$ 対称
全変動 $\frac{1}{2}|t-1|$ $\frac{1}{2}\int |p-q|$ 対称
JS $t\log t – (1+t)\log\frac{1+t}{2}$ $\frac{1}{2}D_{\mathrm{KL}}(P\|M) + \frac{1}{2}D_{\mathrm{KL}}(Q\|M)$ 対称
$\alpha$-divergence $\frac{t^\alpha – 1}{\alpha(\alpha-1)}$ $\alpha \neq 1-\alpha$ で非対称

この表を見ると、一つの統一的な定義から驚くほど多様なダイバージェンスが生まれることがわかります。次に、すべてのf-ダイバージェンスに共通する基本性質を証明しましょう。

f-ダイバージェンスの基本性質

性質1: 非負性

定理: 任意のf-ダイバージェンスは非負であり、$P = Q$ のときに限り0になります。

$$ D_f(P \| Q) \geq 0, \quad D_f(P \| Q) = 0 \iff P = Q $$

証明: イェンセンの不等式を使います。$f$ が凸であるため、

$$ D_f(P \| Q) = E_Q\left[f\left(\frac{p(X)}{q(X)}\right)\right] \geq f\left(E_Q\left[\frac{p(X)}{q(X)}\right]\right) $$

$Q$ に関する期待値を計算すると、

$$ E_Q\left[\frac{p(X)}{q(X)}\right] = \int q(x) \cdot \frac{p(x)}{q(x)} \, dx = \int p(x) \, dx = 1 $$

$f(1) = 0$ であるため、

$$ D_f(P \| Q) \geq f(1) = 0 $$

等号条件は、$f$ が狭義凸で $p(x)/q(x)$ がほとんどすべての点で定数(= 1)のとき、すなわち $P = Q$ のときに成立します。

この証明のエレガントさは、凸性と $f(1) = 0$ というわずか2つの条件だけで非負性が保証されていることです。個々のダイバージェンス(KL、χ²、ヘリンジャーなど)の非負性を個別に証明する必要はありません。

性質2: データ処理不等式

定理: 確率的な変換(マルコフカーネル)$T$ に対して、

$$ D_f(TP \| TQ) \leq D_f(P \| Q) $$

ここで $TP$ は $P$ を $T$ で変換した分布です。

直感的には、データに何らかの処理を施すと情報が失われ、2つの分布の区別がより困難になるため、ダイバージェンスが減少する——というデータ処理不等式の一般化です。

証明の概略: 条件付き期待値とイェンセンの不等式を組み合わせます。$Y = T(X)$ とすると、

$$ D_f(TP \| TQ) = \int q_Y(y) f\left(\frac{p_Y(y)}{q_Y(y)}\right) dy $$

ベイズの定理より $p_Y(y)/q_Y(y) = E_{Q(\cdot|y)}[p(X)/q(X) \mid Y = y]$ と表せます。イェンセンの不等式($f$ の凸性)から、

$$ f\left(\frac{p_Y(y)}{q_Y(y)}\right) = f\left(E_{Q(\cdot|y)}\left[\frac{p(X)}{q(X)}\right]\right) \leq E_{Q(\cdot|y)}\left[f\left(\frac{p(X)}{q(X)}\right)\right] $$

両辺に $q_Y(y)$ を掛けて $y$ で積分すると、右辺は $D_f(P \| Q)$ に帰着します。

データ処理不等式はすべてのf-ダイバージェンスに対して成り立つため、これは非常に強い結果です。十分統計量の特徴づけにも直接関連しており、$T$ が $P$ と $Q$ の間の十分統計量であれば等号が成立します。

性質3: 分布の対に関する同時凸性

定理: $D_f(P \| Q)$ は $(P, Q)$ の対に関して凸です。すなわち、任意の $\lambda \in [0, 1]$ と分布の対 $(P_1, Q_1)$、$(P_2, Q_2)$ に対して、

$$ D_f(\lambda P_1 + (1-\lambda) P_2 \| \lambda Q_1 + (1-\lambda) Q_2) \leq \lambda D_f(P_1 \| Q_1) + (1-\lambda) D_f(P_2 \| Q_2) $$

この性質は、混合分布のダイバージェンスが成分のダイバージェンスの混合以下であることを意味しています。混合することで分布間の区別が困難になる、という直感的にも自然な結果です。

性質4: 双対性

$f^*(t) = t f(1/t)$ で定義される共役凸関数(perspective transform)を用いると、

$$ D_{f^*}(P \| Q) = D_f(Q \| P) $$

が成り立ちます。つまり、$f$ を $f^*$ に置き換えることは、引数の $P$ と $Q$ を入れ替えることに対応します。

$f(t) = f^*(t)$ を満たすとき——すなわち $f(t) = tf(1/t)$——f-ダイバージェンスは対称になります。ヘリンジャー距離や全変動距離がこの条件を満たします。KLダイバージェンス($f(t) = t \log t$)の共役は $f^*(t) = -\log t$(逆KL)であり、確かに引数の入れ替えに対応しています。

性質5: 十分統計量による特徴づけ

$T$ が $P$ と $Q$ に対する十分統計量であるとは、すべてのf-ダイバージェンスについてデータ処理不等式の等号が成立することと同値です。

$$ T \text{ が十分統計量} \iff D_f(TP \| TQ) = D_f(P \| Q) \quad \forall f $$

これは、十分統計量が「2つの分布を区別するために必要な情報をすべて保存する」変換であることの定量的な表現です。

f-ダイバージェンスの基本性質を理解したところで、次に深層学習との接点として重要な変分表現を見ていきましょう。

変分表現とGANへの接続

Fenchel双対による変分表現

f-ダイバージェンスの変分表現(variational representation)は、深層学習における生成モデルの学習と密接に関連する重要な結果です。

凸関数 $f$ のFenchel共役(凸共役)は次のように定義されます。

$$ f^*(y) = \sup_{t \in \mathrm{dom}(f)} \{yt – f(t)\} $$

凸解析の基本定理から、凸関数 $f$ に対して $f^{**} = f$(二重共役は元の関数に一致)が成り立つため、

$$ f(t) = \sup_{y \in \mathrm{dom}(f^*)} \{yt – f^*(y)\} $$

これをf-ダイバージェンスの定義式に代入すると、

$$ D_f(P \| Q) = \int q(x) \sup_{y} \left\{y \cdot \frac{p(x)}{q(x)} – f^*(y)\right\} dx $$

$\sup$ を積分の外に出す($y$ を $x$ の関数 $T(x)$ に拡張する)と、変分下界が得られます。

$$ D_f(P \| Q) = \sup_{T: \mathcal{X} \to \mathrm{dom}(f^*)} \left\{E_P[T(X)] – E_Q[f^*(T(X))]\right\} $$

ここで $T$ は任意の可測関数です。上界が達成されるのは $T^*(x) = f'(p(x)/q(x))$ のときです。

f-GANへの応用

上の変分表現は、GAN(Generative Adversarial Network)の学習に直接利用できます。f-GAN(Nowozin et al., 2016)は、次のミニマックス問題を解きます。

$$ \min_\theta \max_\omega \left\{E_{x \sim P_{\mathrm{data}}}[T_\omega(x)] – E_{x \sim P_{\theta}}[f^*(T_\omega(x))]\right\} $$

ここで $P_\theta$ は生成器が生成する分布(パラメータ $\theta$ で制御)、$T_\omega$ は判別器(パラメータ $\omega$ で制御)です。

内側の最大化(判別器の学習)は、f-ダイバージェンス $D_f(P_{\mathrm{data}} \| P_\theta)$ の変分下界を締める操作です。外側の最小化(生成器の学習)は、$P_\theta$ を $P_{\mathrm{data}}$ に近づける操作です。

$f$ の選び方によって異なるGANの変種が得られます。

GAN の種類 $f(t)$ $f^*(y)$ の活性化
標準GAN (JS) $t\log t – (1+t)\log\frac{1+t}{2}$ $-\log(1 – \exp(y))$
KL-GAN $t \log t$ $\exp(y – 1)$
逆KL-GAN $-\log t$ $-1 – \log(-y)$
χ²-GAN $(t-1)^2$ $y + y^2/4$
Hellinger-GAN $(\sqrt{t}-1)^2$ $y/(1-y)$

Goodfellow et al.(2014)の原論文のGANは、最適判別器のもとでJSダイバージェンスを最小化していることに対応します。f-GANの枠組みでは、$f$ の選択を変えるだけで様々な学習目的関数を試すことができ、問題に応じた最適なダイバージェンスを選択する自由度が生まれます。

変分表現の実用上の意義

変分表現が重要なのは、$D_f(P \| Q)$ を計算するために密度比 $p(x)/q(x)$ を直接計算する必要がない点です。変分表現では、$P$ と $Q$ からのサンプルさえあれば、判別器 $T$ の最適化を通じてf-ダイバージェンスを推定できます。

これは高次元の問題で特に重要です。高次元空間での密度推定は「次元の呪い」により困難ですが、密度比の推定は相対的に容易であることが知られています(杉山・鈴木・川上, 2012)。変分表現はこの密度比推定のアプローチを自然に取り込んでいます。

GANとの接続を理解したところで、次にf-ダイバージェンス間の不等式関係を見ていきましょう。

f-ダイバージェンス間の不等式

ピンスカーの不等式

全変動距離とKLダイバージェンスの間には、次の有名な不等式が成り立ちます。

$$ \mathrm{TV}(P, Q) \leq \sqrt{\frac{1}{2} D_{\mathrm{KL}}(P \| Q)} $$

これはピンスカーの不等式(Pinsker’s inequality)と呼ばれ、チサールによる一般化された形式では次のように書けます。

$$ \mathrm{TV}(P, Q)^2 \leq \frac{1}{2} D_{\mathrm{KL}}(P \| Q) $$

直感的には、KLダイバージェンスが小さければ全変動距離も小さい——つまり、KLダイバージェンスの意味で近い分布は、確率的なイベントの判定においても近い——ことを意味しています。

KLダイバージェンスとχ²ダイバージェンスの関係

$$ D_{\mathrm{KL}}(P \| Q) \leq \log(1 + \chi^2(P \| Q)) \leq \chi^2(P \| Q) $$

第2の不等式は $\log(1+x) \leq x$ から直ちに従います。第1の不等式の証明にはイェンセンの不等式を使います。

$\log$ が凹関数であることから、

$$ D_{\mathrm{KL}}(P \| Q) = E_P\left[\log \frac{p(X)}{q(X)}\right] = -E_P\left[\log \frac{q(X)}{p(X)}\right] \leq \log E_P\left[\frac{q(X)}{p(X)}\right]^{-1} $$

ではなく、直接的に導くには $\log t \leq t – 1$ を使って、

$$ D_{\mathrm{KL}}(P \| Q) = \int p \log \frac{p}{q} \, dx \leq \int p \left(\frac{p}{q} – 1\right) dx = \int \frac{p^2}{q} \, dx – 1 = \chi^2(P \| Q) $$

より精密な不等式 $D_{\mathrm{KL}} \leq \log(1 + \chi^2)$ を示すには、対数の凸性を利用します。

ヘリンジャー距離との関係

$$ H^2(P, Q) \leq D_{\mathrm{KL}}(P \| Q) $$

$$ \mathrm{TV}(P, Q)^2 \leq H^2(P, Q) \leq 2\,\mathrm{TV}(P, Q) $$

ヘリンジャー距離は全変動距離とKLダイバージェンスの「中間」に位置する指標であり、両方から不等式で抑えられます。これらの不等式は、統計的検定の検出力の解析で重要な役割を果たします。

不等式の全体像

以上の不等式を整理すると、次の順序関係が得られます。

$$ \mathrm{TV}^2 \leq H^2 \leq D_{\mathrm{KL}} \leq \chi^2 $$

小さい側の指標ほど「鈍感」で、大きい側の指標ほど「敏感」です。χ²ダイバージェンスは密度比の二乗偏差を測るため最も敏感ですが、裾の重い分布では値が発散しやすいという欠点があります。全変動距離は有界($[0, 1]$)で安定していますが、分布の違いの細かい情報を失います。用途に応じて適切なダイバージェンスを選択する指針として、この順序関係は有用です。

これらの不等式関係をPythonで数値的に検証してみましょう。

Pythonによる数値計算と可視化

各ダイバージェンスの計算と比較

2つのガウス分布間のf-ダイバージェンスを計算し、パラメータの変化に対する振る舞いを比較します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy.integrate import quad

def kl_divergence(p_pdf, q_pdf, x_range=(-10, 10)):
    """KLダイバージェンスの数値計算"""
    def integrand(x):
        px, qx = p_pdf(x), q_pdf(x)
        if px < 1e-30 or qx < 1e-30:
            return 0.0
        return px * np.log(px / qx)
    return quad(integrand, x_range[0], x_range[1])[0]

def chi2_divergence(p_pdf, q_pdf, x_range=(-10, 10)):
    """χ²ダイバージェンスの数値計算"""
    def integrand(x):
        px, qx = p_pdf(x), q_pdf(x)
        if qx < 1e-30:
            return 0.0
        return (px - qx)**2 / qx
    return quad(integrand, x_range[0], x_range[1])[0]

def hellinger_sq(p_pdf, q_pdf, x_range=(-10, 10)):
    """ヘリンジャー距離の二乗の数値計算"""
    def integrand(x):
        px, qx = p_pdf(x), q_pdf(x)
        return (np.sqrt(max(px, 0)) - np.sqrt(max(qx, 0)))**2
    return quad(integrand, x_range[0], x_range[1])[0]

def total_variation(p_pdf, q_pdf, x_range=(-10, 10)):
    """全変動距離の数値計算"""
    def integrand(x):
        return 0.5 * abs(p_pdf(x) - q_pdf(x))
    return quad(integrand, x_range[0], x_range[1])[0]

def js_divergence(p_pdf, q_pdf, x_range=(-10, 10)):
    """JSダイバージェンスの数値計算"""
    m_pdf = lambda x: 0.5 * (p_pdf(x) + q_pdf(x))
    return 0.5 * kl_divergence(p_pdf, m_pdf, x_range) + \
           0.5 * kl_divergence(q_pdf, m_pdf, x_range)

# P = N(0, 1), Q = N(mu, 1) で mu を変化させる
mu_range = np.linspace(0.01, 3.0, 100)
results = {name: [] for name in ['KL', 'chi2', 'Hellinger^2', 'TV', 'JS']}

for mu in mu_range:
    p = lambda x: norm.pdf(x, 0, 1)
    q = lambda x, m=mu: norm.pdf(x, m, 1)
    xr = (-8, 8 + mu)

    results['KL'].append(kl_divergence(p, q, xr))
    results['chi2'].append(chi2_divergence(p, q, xr))
    results['Hellinger^2'].append(hellinger_sq(p, q, xr))
    results['TV'].append(total_variation(p, q, xr))
    results['JS'].append(js_divergence(p, q, xr))

# プロット
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左: 各ダイバージェンスの比較
for name, values in results.items():
    axes[0].plot(mu_range, values, label=name, linewidth=2)
axes[0].set_xlabel('Mean shift $\\mu$')
axes[0].set_ylabel('Divergence value')
axes[0].set_title('f-Divergences: $P = N(0,1)$ vs $Q = N(\\mu, 1)$')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
axes[0].set_ylim(0, 5)

# 右: 不等式の検証 TV^2 <= H^2 <= KL <= chi^2
tv_sq = [v**2 for v in results['TV']]
axes[1].plot(mu_range, tv_sq, label='$TV^2$', linewidth=2)
axes[1].plot(mu_range, results['Hellinger^2'], label='$H^2$', linewidth=2)
axes[1].plot(mu_range, results['KL'], label='$D_{KL}$', linewidth=2)
axes[1].plot(mu_range, results['chi2'], label='$\\chi^2$', linewidth=2)
axes[1].set_xlabel('Mean shift $\\mu$')
axes[1].set_ylabel('Divergence value')
axes[1].set_title('Inequality chain: $TV^2 \\leq H^2 \\leq D_{KL} \\leq \\chi^2$')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
axes[1].set_ylim(0, 5)

plt.tight_layout()
plt.show()

左のグラフから、各ダイバージェンスが平均のずれ $\mu$ に対してどのように増加するかが読み取れます。χ²ダイバージェンスが最も急速に増加し、全変動距離は最もゆっくり増加して1に漸近します。JSダイバージェンスは $\log 2 \approx 0.693$ に上界を持つため、大きな $\mu$ では飽和します。KLダイバージェンスは $\mu^2/2$ で増加し(同じ分散のガウス分布間のKLダイバージェンスの解析公式 $D_{\mathrm{KL}}(N(0,1) \| N(\mu, 1)) = \mu^2/2$)、2次的な増加を示します。

右のグラフでは、不等式の連鎖 $\mathrm{TV}^2 \leq H^2 \leq D_{\mathrm{KL}} \leq \chi^2$ が数値的にも確かに成立していることが確認できます。すべての $\mu$ において4つの曲線の順序が保たれています。

ガウス分布間のf-ダイバージェンスの解析公式

2つのガウス分布 $P = N(\mu_1, \sigma_1^2)$、$Q = N(\mu_2, \sigma_2^2)$ の間のダイバージェンスには解析公式が存在します。これらを可視化します。

def kl_gaussian(mu1, s1, mu2, s2):
    """ガウス分布間のKLダイバージェンスの解析公式"""
    return np.log(s2/s1) + (s1**2 + (mu1-mu2)**2)/(2*s2**2) - 0.5

def chi2_gaussian(mu1, s1, mu2, s2):
    """ガウス分布間のχ²ダイバージェンスの解析公式"""
    r = s1**2 / s2**2
    d = (mu1 - mu2)**2 / s2**2
    return np.sqrt(r**2 / (2*r - 1)) * np.exp(d * r / (2*r - 1)) - 1 \
        if 2*r - 1 > 0 else np.inf

# 分散の比に対するKLダイバージェンスの変化
sigma_ratios = np.linspace(0.2, 5.0, 200)
kl_vals = [kl_gaussian(0, r, 0, 1) for r in sigma_ratios]
kl_vals_rev = [kl_gaussian(0, 1, 0, r) for r in sigma_ratios]

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左: KL(N(0,sigma^2) || N(0,1)) vs sigma
axes[0].plot(sigma_ratios, kl_vals, 'b-', linewidth=2,
             label='$D_{KL}(N(0,\\sigma^2) \\| N(0,1))$')
axes[0].plot(sigma_ratios, kl_vals_rev, 'r--', linewidth=2,
             label='$D_{KL}(N(0,1) \\| N(0,\\sigma^2))$')
axes[0].axvline(x=1, color='k', linestyle=':', alpha=0.5)
axes[0].set_xlabel('$\\sigma$')
axes[0].set_ylabel('KL Divergence')
axes[0].set_title('KL Divergence between Gaussians (different variance)')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
axes[0].set_ylim(0, 5)

# 右: 2次元のヒートマップ (mu, sigma) -> KL
mu_grid = np.linspace(-3, 3, 100)
sigma_grid = np.linspace(0.2, 3.0, 100)
MU, SIGMA = np.meshgrid(mu_grid, sigma_grid)
KL_grid = np.vectorize(lambda m, s: kl_gaussian(m, s, 0, 1))(MU, SIGMA)

im = axes[1].contourf(MU, SIGMA, KL_grid, levels=30, cmap='viridis')
axes[1].contour(MU, SIGMA, KL_grid, levels=[0.1, 0.5, 1, 2, 3],
                colors='white', linewidths=0.5)
axes[1].plot(0, 1, 'r*', markersize=15, label='$P = Q = N(0,1)$')
axes[1].set_xlabel('$\\mu_P$')
axes[1].set_ylabel('$\\sigma_P$')
axes[1].set_title('$D_{KL}(N(\\mu_P, \\sigma_P^2) \\| N(0,1))$')
axes[1].legend()
plt.colorbar(im, ax=axes[1])

plt.tight_layout()
plt.show()

左のグラフから、KLダイバージェンスの非対称性が明確に読み取れます。$D_{\mathrm{KL}}(N(0,\sigma^2) \| N(0,1))$ と $D_{\mathrm{KL}}(N(0,1) \| N(0,\sigma^2))$ は $\sigma = 1$ でともに0になりますが、$\sigma$ が1から離れるにつれて異なる速さで増加します。特に $\sigma \to 0$ では前者は $+\infty$ に発散しますが、後者はそうではありません($Q$ のサポートに $P$ のサポートが含まれている限り発散しない)。

右のヒートマップでは、ガウス分布のパラメータ空間における KLダイバージェンスの等高線が表示されています。最小値は $(\mu, \sigma) = (0, 1)$ の赤い星の点で、$P = Q$ に対応します。等高線が楕円形であり、平均のずれと分散のずれの両方がKLダイバージェンスに寄与していることがわかります。

f-GANの変分下界の可視化

最後に、f-ダイバージェンスの変分下界が最適な判別器 $T^*$ のもとで真の値に一致することを数値的に確認します。

from scipy.optimize import minimize_scalar

# 簡単な1次元の例: P = N(0,1), Q = N(2,1)
p_pdf = lambda x: norm.pdf(x, 0, 1)
q_pdf = lambda x: norm.pdf(x, 2, 1)

# KLダイバージェンスの真の値
kl_true = kl_gaussian(0, 1, 2, 1)
print(f"KL(P || Q) の真の値: {kl_true:.4f}")
print(f"理論値 (mu^2/2): {2**2/2:.4f}")

# 変分下界: sup_T { E_P[T(X)] - E_Q[exp(T(X) - 1)] }  (KL: f*(y) = exp(y-1))
# 最適な T*(x) = log(p(x)/q(x)) = f'(p(x)/q(x)) = 1 + log(p(x)/q(x))

# 線形関数 T(x) = ax + b での変分下界
a_range = np.linspace(-3, 3, 200)
b_range = np.linspace(-5, 5, 200)

best_bound = -np.inf
best_a, best_b = 0, 0

x_samples_p = np.random.RandomState(42).randn(50000)
x_samples_q = np.random.RandomState(42).randn(50000) + 2

for a in a_range:
    for b in [0]:  # bを0に固定して探索を簡略化
        T_p = a * x_samples_p + b
        T_q = a * x_samples_q + b
        bound = np.mean(T_p) - np.mean(np.exp(T_q - 1))
        if bound > best_bound:
            best_bound = bound
            best_a, best_b = a, b

print(f"\n線形関数 T(x) = {best_a:.2f}x での変分下界: {best_bound:.4f}")

# 最適な T*(x) = log(p(x)/q(x)) での変分下界
T_star_p = np.log(norm.pdf(x_samples_p, 0, 1) /
                   norm.pdf(x_samples_p, 2, 1))
T_star_q = np.log(norm.pdf(x_samples_q, 0, 1) /
                   norm.pdf(x_samples_q, 2, 1))
optimal_bound = np.mean(T_star_p) - np.mean(np.exp(T_star_q - 1))
print(f"最適 T*(x) = log(p/q) での変分下界: {optimal_bound:.4f}")

# 判別器の関数形を可視化
x_vis = np.linspace(-5, 7, 300)
T_star_vis = np.log(norm.pdf(x_vis, 0, 1) / norm.pdf(x_vis, 2, 1))
T_linear_vis = best_a * x_vis

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左: 分布と最適判別器
ax2 = axes[0].twinx()
axes[0].plot(x_vis, norm.pdf(x_vis, 0, 1), 'b-', linewidth=2, label='P = N(0,1)')
axes[0].plot(x_vis, norm.pdf(x_vis, 2, 1), 'r-', linewidth=2, label='Q = N(2,1)')
ax2.plot(x_vis, T_star_vis, 'g--', linewidth=2, label='$T^*(x) = \\log(p/q)$')
ax2.plot(x_vis, T_linear_vis, 'm:', linewidth=2,
         label=f'$T(x) = {best_a:.1f}x$')
axes[0].set_xlabel('$x$')
axes[0].set_ylabel('Density', color='b')
ax2.set_ylabel('$T(x)$', color='g')
lines1, labels1 = axes[0].get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
axes[0].legend(lines1 + lines2, labels1 + labels2, fontsize=9, loc='upper right')
axes[0].set_title('Distributions and Discriminators')
axes[0].grid(True, alpha=0.3)

# 右: 変分下界の a 依存性
bounds = []
for a in a_range:
    T_p = a * x_samples_p
    T_q = a * x_samples_q
    bound = np.mean(T_p) - np.mean(np.exp(T_q - 1))
    bounds.append(bound)

axes[1].plot(a_range, bounds, 'b-', linewidth=2, label='Variational bound')
axes[1].axhline(y=kl_true, color='r', linestyle='--', linewidth=2,
                label=f'True KL = {kl_true:.4f}')
axes[1].axhline(y=optimal_bound, color='g', linestyle=':', linewidth=2,
                label=f'Optimal $T^*$ bound = {optimal_bound:.4f}')
axes[1].set_xlabel('Slope $a$ of linear $T(x) = ax$')
axes[1].set_ylabel('Variational lower bound')
axes[1].set_title('Variational Bound vs True KL')
axes[1].legend(fontsize=9)
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

左のグラフでは、2つのガウス分布と判別器関数を重ねて表示しています。最適判別器 $T^*(x) = \log(p(x)/q(x))$ は密度比の対数であり、線形な近似判別器よりも柔軟にフィットしていることがわかります。

右のグラフでは、線形判別器のパラメータ $a$ を変化させたときの変分下界の値を示しています。変分下界は常に真のKLダイバージェンスの値以下であり、最適判別器を使った場合にのみ等号が成立します。線形判別器では制約が強いため真の値には届きませんが、それでもかなり良い近似が得られています。深層ニューラルネットワークを判別器として使えば、より柔軟な関数クラスで変分下界を最適化できるため、真の値にさらに近づけることが期待されます。これがf-GANやWasserstein GANの数学的な背景です。

α-ダイバージェンスとレーニイ・ダイバージェンス

α-ダイバージェンスの定義

f-ダイバージェンスの重要な部分族として、α-ダイバージェンスがあります。

$$ f_\alpha(t) = \frac{t^\alpha – 1}{\alpha(\alpha – 1)}, \quad \alpha \neq 0, 1 $$

を選ぶと、

$$ D_\alpha(P \| Q) = \frac{1}{\alpha(\alpha-1)}\left(\int p(x)^\alpha q(x)^{1-\alpha} \, dx – 1\right) $$

が得られます。特殊な場合として、

  • $\alpha \to 1$: KLダイバージェンス $D_{\mathrm{KL}}(P \| Q)$ に収束
  • $\alpha \to 0$: 逆KLダイバージェンス $D_{\mathrm{KL}}(Q \| P)$ に収束
  • $\alpha = 1/2$: ヘリンジャー距離の二乗の4倍
  • $\alpha = 2$: ピアソンのχ²ダイバージェンス
  • $\alpha = -1$: ネイマンのχ²ダイバージェンス

レーニイ・ダイバージェンスとの関係

レーニイ・ダイバージェンス(Rényi divergence)は、α-ダイバージェンスと密接に関連しますが、f-ダイバージェンスではありません。次のように定義されます。

$$ D_\alpha^{(\mathrm{R})}(P \| Q) = \frac{1}{\alpha – 1} \log \int p(x)^\alpha q(x)^{1-\alpha} \, dx, \quad \alpha > 0, \alpha \neq 1 $$

α-ダイバージェンスとレーニイ・ダイバージェンスの関係は、

$$ D_\alpha^{(\mathrm{R})}(P \| Q) = \frac{1}{\alpha – 1} \log\left(1 + \alpha(\alpha-1) D_\alpha(P \| Q)\right) $$

です。レーニイ・ダイバージェンスは $\alpha \to 1$ でKLダイバージェンスに一致します。レーニイ・ダイバージェンスはf-ダイバージェンスの加法性(データ処理不等式)を持ちますが、同時凸性は一般に持ちません。

まとめ

本記事では、f-ダイバージェンスの統一理論について解説しました。

  • 統一的な定義: f-ダイバージェンスは凸関数 $f$ を1つ選ぶことで定義され、$f$ の選び方によってKL、χ²、ヘリンジャー、全変動、JSなどの多様なダイバージェンスが生まれる
  • 共通性質: 非負性、データ処理不等式、同時凸性、双対性はすべてのf-ダイバージェンスに共通であり、$f$ の凸性と $f(1) = 0$ から導かれる
  • 変分表現: Fenchel双対による変分下界は、密度比を直接計算せずにサンプルからf-ダイバージェンスを推定する方法を与え、GANの学習目的関数の理論的基盤となる
  • 不等式の連鎖: $\mathrm{TV}^2 \leq H^2 \leq D_{\mathrm{KL}} \leq \chi^2$ という順序関係が成り立ち、用途に応じた適切なダイバージェンスの選択を導く
  • α-ダイバージェンス: パラメータ $\alpha$ を連続的に変化させることで、KLからχ²までを滑らかにつなぐ1パラメータ族を構成できる

f-ダイバージェンスの統一理論は、情報理論・統計学・機械学習をつなぐ橋渡し的な役割を果たしています。個々のダイバージェンスを個別に学ぶのではなく、統一的な視点から理解することで、新しい問題に対して適切なダイバージェンスを設計・選択する力が身につきます。

次のステップとして、以下の記事も参考にしてください。