こちらの続きです。
![](https://www.saecanet.com/wp-content/uploads/2024/08/tapiocaGFVL4351_TP_V4-160x90.jpg)
交差エントロピー(クロスエントロピー) 及び カルバック・ライブラー情報量(Kullback-Leibler情報量、カルバック・ライブラー・ダイバージェンス) の定義を確認します。
以降の数式、導出は以下の資料を参照引用しています。
- http://www.mi.u-tokyo.ac.jp/mds-oudan/lecture_document_2019_math7/%E6%99%82%E7%B3%BB%E5%88%97%E8%A7%A3%E6%9E%90%EF%BC%88%EF%BC%93%EF%BC%89_2019.pdf
- https://ja.wikipedia.org/wiki/%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC
始めに 交差エントロピー の定義を確認します。
真の分布を \(p(x)\)、モデルの分布を \(g(x)\) としたとき(以下同様)、\(p\)、\(q\) がいずれも 離散確率分布 の場合は
\[H(p,q)=-\displaystyle\sum p(x)\log q(x)\] 連続確率分布 の場合は
\[H(p,q)=-\displaystyle\int_{-\infty}^\infty p(x)\log q(x)\,dx\]
続いて カルバック・ライブラー情報量 の定義を確認します。
離散確率分布 の場合は
\[D_{\mathrm{KL}}(p\parallel q)=\displaystyle\sum p(x)\log\dfrac{p(x)}{q(x)}\]
連続確率分布 の場合は
\[D_{\mathrm{KL}}(p\parallel q)=\displaystyle\int_{-\infty}^\infty p(x)\log\dfrac{p(x)}{q(x)}\,dx\] それでは、2つの 一変量正規分布 を具体例として カルバック・ライブラー情報量 を確認します。
一変量正規分布間 の カルバック・ライブラー情報量 は以下の通りです。
\[ D_{\mathrm{KL}}(p\parallel q) = \log \dfrac{\sigma_2}{\sigma_1} + \dfrac{\sigma_1^2 + (\mu_1 - \mu_2)^2}{2\sigma^2_2} - \dfrac{1}{2} \]
参考引用資料
- https://statproofbook.github.io/P/norm-kl.html
- https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence
- https://sucrose.hatenablog.com/entry/2013/07/20/190146
始めにサンプルデータを作成します。
\(p(x)\) は 平均値 が \(\mu_1=0\)、分散が \(\sigma_1^2=1\) の正規分布、\(g(x)\) は 平均値 が \(\mu_2=2\) 、分散が \(\sigma_2^2=4\) の正規分布とします。
library(ggplot2)
library(dplyr)
<- 0
mu_1 <- 2
mu_2 <- 1
sigma2_1 <- 4
sigma2_2 <- 500
n <- seq(-5, 5, length.out = n)
x <- dnorm(x = x, mean = mu_1, sd = sigma2_1^0.5)
p <- dnorm(x = x, mean = mu_2, sd = sigma2_2^0.5)
q <- data.frame(x, p) %>%
tidydf data.frame(q) %>%
::gather(key = "Distribution", value = "Density", colnames(.)[-1])
tidyr%>% ggplot(mapping = aes(x = x, y = Density, colour = Distribution)) +
tidydf geom_line()
カルバック・ライブラー情報量 を求めます。
<- function(mu_1, mu_2, sigma2_1, sigma2_2) {
kl_divergence log(sigma2_2^0.5 / sigma2_1^0.5) + (sigma2_1 + (mu_1 - mu_2)^2) / (2 * sigma2_2) - 1 / 2
}kl_divergence(mu_1 = mu_1, mu_2 = mu_2, sigma2_1 = sigma2_1, sigma2_2 = sigma2_2)
[1] 0.8181472
続いて、平均値 および 分散 をそれぞれ変化させた場合の カルバック・ライブラー情報量 の変化を確認します。
始めに 分散 は同一( \(\sigma_1^2=\sigma_2^2=5\) )とし、平均値 は \(\mu_1=0\)、\(\mu_2\) は -5から5 まで変化させた場合です。
<- sigma2_2 <- 5
sigma2_1 <- NULL
kld <- seq(-5, 5, length.out = n)
mu_2 for (iii in mu_2) {
<- c(kld, kl_divergence(mu_1 = mu_1, mu_2 = iii, sigma2_1 = sigma2_1, sigma2_2 = sigma2_2))
kld
}ggplot(mapping = aes(x = mu_2, y = kld)) +
geom_line() +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0)
平均値 が同一(\(\mu_1=\mu_2=0\)) の場合、つまり 同一分布 の場合に カルバック・ライブラー情報量 は 最小(=0) となります。
続いて 平均値 は同一(\(\mu_1=\mu_2=0\))とし、分散 は \(\sigma_1^2=5\)、\(\sigma_2^2\) は 1から10 まで変化させた場合です。
<- 0
mu_2 <- NULL
kld <- seq(1, 10, length.out = n)
sigma2_2 for (iii in sigma2_2) {
<- c(kld, kl_divergence(mu_1 = mu_1, mu_2 = mu_2, sigma2_1 = sigma2_1, sigma2_2 = iii))
kld
}ggplot(mapping = aes(x = sigma2_2, y = kld)) +
geom_line() +
geom_hline(yintercept = 0)
分散 が同一(\(\sigma^2_1=\sigma^2_2=5\)) の場合、つまり 同一分布の場合 に カルバック・ライブラー情報量 は 最小(=0) となります。
以上です。