はじめに: 情報の測定
La 情報理論1948 年にクロード シャノンによって設立され、私たちにツールを提供します。 不確実性を定量化するには、メッセージに含まれる情報量を測定します。 モデルがどれだけ現実に近似しているかを評価します。機械学習では、次の概念が登場します。 どこでも: クロスエントロピー 分類用のデフォルトの損失関数、 の KL ダイバージェンス VAE と知識の蒸留の中心です。
何を学ぶか
- 情報内容: -log(p) としての驚き
- エントロピー: 分布の不確実性の尺度
- クロスエントロピー: 分類に最もよく使用される損失
- KL ダイバージェンス: 分布間の非対称距離
- 相互情報量: 変数間の依存関係
- 複雑性と言語モデルとの関係
情報内容: サプライズ
L'情報内容 確率のある出来事の(または自己情報) p その出来事がどれほど「驚くべきこと」かを測定します。
直感: 非常に可能性の高い出来事 (P\\約1) 情報はほとんどありません(驚きは少ない)。珍しい出来事(P\\約0) 多くの情報をもたらします(大きな驚き)。基数 2 の単位は、 少し: 1ビット そして公平なコイントスの情報量。
エントロピー: 平均的な不確実性
L'エントロピ そして情報コンテンツの期待値、つまり 中程度の驚き 分布の:
継続的な展開の場合:
基本的な特性:
- H(X) \\geq 0 常に(不確実性は決して否定的ではありません)
- H(X) = 0 場合のみ X 決定的 (単一のイベントの確率は 1)
- H(X) 一様分布の最大値(最大不確かさ)
Esempio: 公正なコインの場合 (P(T) = P(C) = 0.5)、 エントロピーe H = -0.5\\log_2(0.5) - 0.5\\log_2(0.5) = 1 少し。 不正なコインの場合 P(T) = 0.99、エントロピーは約 0.08 ビットです。 不確実性はほとんどなく、ほぼ常に結果がわかります。
import numpy as np
def entropy(probs):
"""Calcola entropia in bit (log base 2)."""
probs = np.array(probs)
probs = probs[probs > 0] # Evita log(0)
return -np.sum(probs * np.log2(probs))
# Moneta equa
print(f"Moneta equa: H = {entropy([0.5, 0.5]):.4f} bit")
# Moneta truccata
print(f"Moneta truccata (0.99): H = {entropy([0.99, 0.01]):.4f} bit")
# Dado a 6 facce (uniforme)
print(f"Dado equo: H = {entropy([1/6]*6):.4f} bit")
# Dado truccato (3 esce il 50%)
probs_loaded = [0.1, 0.1, 0.5, 0.1, 0.1, 0.1]
print(f"Dado truccato: H = {entropy(probs_loaded):.4f} bit")
クロスエントロピー: 分類の喪失
La クロスエントロピー 真の分布の間 p そして モデルによって予測された分布 q 必要なビット数を測定する 平均して データをエンコードする p を使用して 最適なコード q:
分類では、 p およびターゲット分布 (ワンホット) e q そしてソフトマックスの出力。ラベル付き単一サンプルの場合 y (ワンホット) と予測 \\ハット{y}:
二項分類の場合、次のように単純化されます。 バイナリクロスエントロピー:
基本的な接続: クロスエントロピーの最小化は次と同等です。 対数尤度を最大化する モデルの。これにより、クロスエントロピーが発生する理由が説明されます。 分類のための自然損失: 最大値を割り当てるモデルを探しています。 観測データに対する確率。
import numpy as np
def cross_entropy(p, q):
"""Cross-entropy H(p, q) usando logaritmo naturale."""
q = np.clip(q, 1e-15, 1 - 1e-15) # Evita log(0)
return -np.sum(p * np.log(q))
def binary_cross_entropy(y_true, y_pred):
"""Binary cross-entropy per un singolo campione."""
y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)
return -(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
# Classificazione a 3 classi
y_true = np.array([0, 0, 1]) # Classe 3
# Predizione buona
y_pred_good = np.array([0.05, 0.05, 0.90])
print(f"Buona predizione: CE = {cross_entropy(y_true, y_pred_good):.4f}")
# Predizione mediocre
y_pred_mid = np.array([0.2, 0.3, 0.5])
print(f"Predizione media: CE = {cross_entropy(y_true, y_pred_mid):.4f}")
# Predizione sbagliata
y_pred_bad = np.array([0.7, 0.2, 0.1])
print(f"Predizione errata: CE = {cross_entropy(y_true, y_pred_bad):.4f}")
# Binary cross-entropy
print(f"\nBCE(y=1, pred=0.9) = {binary_cross_entropy(1, 0.9):.4f}")
print(f"BCE(y=1, pred=0.5) = {binary_cross_entropy(1, 0.5):.4f}")
print(f"BCE(y=1, pred=0.1) = {binary_cross_entropy(1, 0.1):.4f}")
KL ダイバージェンス: 分布間の距離
La KL ダイバージェンス (カルバック・ライブラー) 分布がどの程度かを測定します。 q 参照分布とは異なります p:
重要なプロパティ:
- D_{\\text{KL}}(p \\| q) \\geq 0 常に (ギブズの不等式)
- D_{\\text{KL}}(p \\| q) = 0 もし、そしてその場合に限り p = q
- 左右対称ではありません: D_{\\text{KL}}(p \\| q) \\neq D_{\\text{KL}}(q \\| p)
関係 H(p, q) = H(p) + D_{\\text{KL}}(p \\| q) それを私たちに教えてくれます クロスエントロピーとエントロピー p プラスKLダイバージェンス。限り H(p) かつ定数(機種に依存しない)、 を最小限に抑える クロスエントロピーは、KL 発散を最小限に抑えることと同じです.
VAE における KL ダイバージェンス
Nei 変分オートエンコーダ、損失には KL 発散項が含まれます。 潜在分布を標準ガウス分布に近づけます。
import numpy as np
def kl_divergence(p, q):
"""KL divergence D_KL(p || q)."""
p = np.array(p, dtype=float)
q = np.array(q, dtype=float)
mask = p > 0
return np.sum(p[mask] * np.log(p[mask] / q[mask]))
# Due distribuzioni su 4 classi
p = np.array([0.25, 0.25, 0.25, 0.25]) # Uniforme
q1 = np.array([0.3, 0.2, 0.3, 0.2]) # Leggermente diversa
q2 = np.array([0.9, 0.03, 0.04, 0.03]) # Molto diversa
print(f"KL(p || q1) = {kl_divergence(p, q1):.6f}")
print(f"KL(p || q2) = {kl_divergence(p, q2):.6f}")
# Asimmetria della KL
print(f"\nKL(p || q1) = {kl_divergence(p, q1):.6f}")
print(f"KL(q1 || p) = {kl_divergence(q1, p):.6f}")
# KL per VAE (Gaussiana vs standard normal)
def kl_gaussian(mu, log_var):
"""KL divergence tra N(mu, sigma^2) e N(0, 1)."""
return -0.5 * np.sum(1 + log_var - mu**2 - np.exp(log_var))
mu = np.array([0.5, -0.3, 0.1])
log_var = np.array([-0.5, 0.2, -0.1])
print(f"\nKL(N(mu,sigma^2) || N(0,1)) = {kl_gaussian(mu, log_var):.4f}")
相互情報
La 相互情報 確率変数がどれだけの情報を持っているかを測定します 別のもので提供されます:
Se I(X; Y) = 0、変数は独立しています。 ML では、相互 情報であり、次の用途に使用されます。 機能の選択 (最も有益な機能を選択してください)、 クラスタリングの評価、およびその目的としてInfoNCE 損失 対照的な学習のこと。
Perplexity: 言語パターンの評価
La 困惑 言語モデルを評価するための標準的な指標。そして次のように定義されます トークンごとの平均クロスエントロピーの指数:
の困惑 k これは、平均してモデル e が あたかも一様にどちらかを選択しなければならないかのように「混乱している」 k オプション あらゆる段階で。複雑さが低いほど、モデルは優れています。
概要と ML との関係
覚えておくべき重要なポイント
- エントロピ H(X): 不確実性を測定します。一様分布の最大値です。
- クロスエントロピー H(p,q): 分類の標準損失
- KL ダイバージェンス: VAE で使用される分布間の距離 (非対称)
- クロスエントロピーを最小化 = 対数尤度を最大化 = KL を最小化
- 相互情報: 依存性の尺度、特徴選択と対照学習で使用されます。
- 困惑: 言語モデルの標準指標。低いほど優れており、
次の記事で: 探索してみます PCAと寸法削減。 共分散行列、固有ベクトル、SVD を使用してデータをどのように圧縮できるかを見ていきます。 ほとんどの情報を保持します。







