【AICで使う】KL divergence(カルバック-ライブラー情報量)をわかりやすく解説|python

こんにちは、今回はKL divergenceを解説します。

KL divergenceは、2つの確率分布間の相違を測定するために使用され、NLPにおける文書や単語の分布を比較する際に役立ちます。

レベル感としては、統計検定1級でAICの導出に使われる~という文脈で登場します。

【良いモデルとは】AIC(赤池情報量基準)について|R

KL Divergence(カルバック-ライブラー情報量)

Kullback-Leibler (KL) divergence(カルバック・ライブラー発散)は、確率論および情報理論において、二つの確率分布間の差異を定量化するために用いられる尺度です。

この概念は、二つの確率分布 \(P\)と \(Q\) が与えられたとき、分布 \(P\)がどの程度分布 \(Q\)から逸脱しているかを測定するために使用されます。

KL divergenceは、情報理論における相対エントロピーとしても知られています。

連続確率分布の場合は、以下のようになります。

$$D_{KL}(P||Q)=\int_{-∞}^{∞}p(x)log(\frac{p(x)}{q(x)})dx$$

交差エントロピーから情報エントロピーを引くことで求められます。

いずれも期待値であり、交差エントロピーからシャノンエントロピーを引いたものは余分な情報量の平均です。

0であることが望ましいですね。

$$D_{KL}(P||Q)=H(P,Q)-H(P)=\boldsymbol{E}_{x~P}[-logQ(x)]-\boldsymbol{E}_{x~P}[-logP(x)]$$

PとQは確率分布で、\(p(x)\)と\(q(x)\)はそれぞれの確率密度関数ですね。

距離の尺度ですので、非負性があります。

もう少し厳密にいうと、対数をとっている分母分子をひっくり返してみるとわかります。

$$D_{KL}(P||Q)=\int_{-∞}^{∞}p(x)log(\frac{p(x)}{q(x)})dx=\int_{-∞}^{∞}p(x)(-log\frac{q(x)}{p(x)})$$

$$D_{KL}(P||Q)=\int_{-∞}^{∞}p(x)(-log\frac{q(x)}{p(x)})≧-log(\int_{-∞}^{∞}p(x)\frac{q(x)}{p(x)})=0$$

\(-log\)の凸性ですね。上の不等式はイェンセンの不等式と呼びます。

ただ、距離尺度とは言いつつ、以下のように

「分布\(Q\)を使用して分布\(P\)を表現しようとした場合に生じる情報の損失量」と「分布\(P\)を使用して分布\(Q\)を表現しようとした場合に生じる情報の損失量」は異なります。

$$D_{KL}(P||Q)≠D_{KL}(Q||P)$$

数学的な分布間の距離(ユークリッド距離とかマンハッタン距離)とは異なる概念であり、情報理論における一方の分布を使用して別の分布の事象をどれだけ「効率的に」説明できるか、という「情報損失」という方が正確です。

情報量|解釈と使い方

エントロピーや情報量がよくわからない方は、こちらから見てください。

よく「情報量が多い」などという言葉がありますが、情報理論において「ある確率変数Xが実現値xをとった時にどれほど、利得があるか」という意味です。

より稀な事象が起きた方が、情報量は大きいので、確率の逆数を使うというのは直感的にわかるはずです。

対数の底に2を選ぶのは慣習的なものですが、実はなんでも良いです。

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

そして、情報量の期待値をとると、シャノンエントロピーになります。

$$H(P)=E_{P(x)}=-\int P(x)log_2 P(x)$$

さて、シャノンエントロピーの一部を変えてみます。

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

上は交差エントロピーと呼ばれますが、シャノンエントロピーの差分を計算することで、ある分布\(Q\)を使用して別の分布\(P\)を表現しようとした場合に生じる情報の損失量を見ることができるのです。

そしてこの差分を表す量こそがKL divergenceなのです。

最尤法との関わり

では、KL情報量が統計においてどう使われていくのかを深掘りしていきます。

込み入っているので、飛ばしていただいても構いません。(下は関連コンテンツです)

【尤度って?】尤度関数と最尤推定量の解説と例題

【python】尤度比検定で統計モデルの比較をしよう|統計的仮説検定

前提として、AICなどの情報量基準は、一般にモデル選択のための指標として使われます。

なので、先ほどの\(D_{KL}(P||Q)=\int_{-∞}^{∞}p(y)log(\frac{p(y)}{q(y)})dy\)で、PやQといった分布は以下のように解釈することができます。

\(p(y)\):知りたい真の分布

\(q(y)\):作った数理モデル

$$D_{KL}(P||Q)=\int_{-∞}^{∞}p(y)log(\frac{p(y)}{q(y)})dy=E_ylogp(y)-E_ylogq(y)$$

ただ、真のモデルp(y)は未知なので、情報量を計算することはできません。

なので、左辺の\(E_ylogq(y)\)の大小関係をモデルごとに比較してあげれば、情報量の相対比較はできる、というわけです。

\(E_ylogq(y)\)は平均対数尤度ですが、これは直接計算できるのでしょうか?

答えはNOです。

なぜなら、真の分布\(p(y)\)で積分しているからです。

$$E_ylogq(y)=\int logq(y)dp(y)$$

ここで使うのが、経験分布関数です。

ここの\(x_i\)は各データであり、データごとに累積する関数です。

データが増えるほど、真の分布\(p(x)\)に寄っていくことが知られており、解析では\(p(y)\)を\(\hat{p}_n(y)\)で置き換えてあげることが多いです。

$$\hat{p}_n(y)=\frac{1}{n}I(x_i)$$

先ほどの式に\(\hat{p}_n(y)\)を代入してあげると、対数尤度になります。

(データがある点で、\(\frac{1}{n}\)ずつ\(q(x_i)\)をかけて足し合わせたものになるので)

$$E_ylogq(y)=n\int logq(y)d\hat{p}_n(y)=\sum_{i=1}^nlogq(X_i)$$

そして、大数の法則により対数尤度は平均対数尤度に確率収束します。

$$\frac{1}{n}\sum_{i=1}^nlogq(X_i)→E_ylogq(y)$$

最適なパラメータを探索する際には、対数尤度を最大化します。

→これは平均対数尤度を最大化することに繋がり(最尤法)、それは結果的にKL情報量を最小にすることに繋がります。

つまり、最尤法は近似的にKL情報量を最小化していることになります。

NLP(自然言語処理)での使い方|CODE

生成AI、特に自然言語処理(NLP)や画像生成における機械学習モデルでもKL情報量は使われています。

最も簡単な例をコードで説明します。

テキストデータの簡単なアプローチは、単語の出現頻度を使用することです。

例えば、単語の確率分布は以下のように定義できます:

$$P(w)=\frac{単語wの出現数}{単語の総数}$$

from collections import Counter
import numpy as np

def calculate_word_frequencies(document):
    word_count = Counter(document)
    total_words = len(document)
    return {word: count / total_words for word, count in word_count.items()}

def kl_divergence(dist_p, dist_q):
    divergence = 0
    for word in dist_p:
        if word in dist_q:
            divergence += dist_p[word] * np.log(dist_p[word] / dist_q[word])
    return divergence

# 簡単な例
doc1 = ["apple", "banana", "apple", "orange", "banana", "apple"]
doc2 = ["apple", "orange", "orange", "cherry", "cherry", "orange"]

dist_p = calculate_word_frequencies(doc1)
dist_q = calculate_word_frequencies(doc2)

# KL divergence
kl_div = kl_divergence(dist_p, dist_q)
kl_div

生成AIモデルの場合(特にGANやVAEなど)、潜在空間の分布も重要です。

これらのモデルはデータを低次元の潜在ベクトルにマッピングしてから、その潜在ベクトルの分布を分析します。

ただ、使い方は同じでモデルが生成したデータの分布が実際のデータの分布にどれだけ近いかを測定する(情報損失として)ために使用されます

では変分オートエンコーダについて少し解説します。

VAEでKL情報量はどう使われる?

VAEでは、潜在変数の事後分布を近似するために、KL情報量を最小化することを目指します。

標準的なVAEの文脈でのKL divergenceは、次のように表現されます

$$D_{KL}(q_φ(z|x)||p(z))$$

・\(q_φ(z|x)\)はエンコーダによって提供される潜在変数\(z\)の条件付き分布です。

・\(p(z)\)は潜在変数の事前分布ですね。通常は標準正規分布が使用されます。

エンコーダが提供する事後分布が事前分布からどれだけ離れているのかを測定します。

強めの仮定ですが、事後分布が多変量正規分布になる場合を想定してみます。

$$D_{KL}(q_φ(z|x)||p(z))=\frac{1}{2}(tr(\sum)+μ^Tμ-k-log det(\sum))$$

\(tr(\sum)\)は共分散行列の対角成分の和

\(μ^Tμ\)は平均ベクトルの二乗ノルム

\(k\)は潜在空間の次元数

\(log det(\sum)\)は共分散行列の行列式の自然対数ですね。

KL情報量の項は、VAEの損失関数の一部として使用され、エンコーダがデータに対してより表現力豊かで、かつ事前分布に従う潜在表現を学習することを助けます。

このプロセスによって、データの低次元の潜在表現を効果的に抽出し、その分布を分析するのに役立つということですね。

FOLLOW ME !