ai_learning/common/foundations/information_theory.md

9.7 KiB
Raw Blame History

Основы теории информации

Что измеряет информация

Редкое событие сообщает больше, чем ожидаемое. Если событие имеет вероятность p, его самоинформация


I(p)=-\log p.

Эта форма следует из естественных требований: информация непрерывно зависит от p, убывает при росте вероятности и складывается для независимых событий:


I(pq)=I(p)+I(q).

Логарифм по основанию 2 даёт биты, натуральный логарифм — наты. В машинном обучении обычно используется натуральный логарифм. Невозможное событие имеет бесконечную самоинформацию, достоверное — нулевую.

Энтропия

Для дискретной случайной величины X\sim p энтропия — ожидаемая самоинформация:


H(X)
=\mathbb{E}_{X\sim p}[-\log p(X)]
=-\sum_x p(x)\log p(x).

Используется соглашение 0\log0=0, получаемое по пределу. Энтропия не измеряет «хаос» отдельного исхода: это средняя неопределённость до наблюдения исхода.

Для Бернулли X\sim\operatorname{Bernoulli}(p):


H(X)=-p\log p-(1-p)\log(1-p).

При p=0 или 1 исход известен и H=0. Максимум достигается при p=1/2. Проверим производной:


\frac{dH}{dp}
=-\log p-1+\log(1-p)+1
=\log\frac{1-p}{p}.

Равенство нулю даёт p=1/2, а


\frac{d^2H}{dp^2}=-\frac1p-\frac1{1-p}<0,

поэтому это максимум.

import numpy as np

def binary_entropy(p):
    p = np.asarray(p, dtype=float)
    terms = np.where(p > 0, p * np.log(p), 0.0)
    q = 1 - p
    terms_q = np.where(q > 0, q * np.log(q), 0.0)
    return -(terms + terms_q)

print(binary_entropy(np.array([0.1, 0.5, 0.9])))

Кодирование и смысл энтропии

Если исход x кодируется примерно -\log_2p(x) битами, частые исходы получают короткие коды, редкие — длинные. Для длинной последовательности независимых исходов средняя длина оптимального кода не может быть существенно меньше H(X) битов на символ. Поэтому энтропия — фундаментальный предел сжатия, а не только абстрактная формула.

Кросс-энтропия

Пусть данные порождены истинным распределением p, а модель использует q. Средняя длина кода модели:


H(p,q)
=\mathbb{E}_{x\sim p}[-\log q(x)]
=-\sum_xp(x)\log q(x).

Это кросс-энтропия. Она штрафует модель особенно сильно, если та назначает малую вероятность реально встречающемуся событию.

Для классификации одного объекта с one-hot-меткой \mathbf{y} и предсказанными вероятностями \hat{\mathbf{p}}:


\ell=-\sum_{k=1}^{K}y_k\log\hat p_k
=-\log\hat p_{k^\star}.

Сумма исчезает, потому что только правильный класс имеет y_k=1.

Дивергенция Кульбака—Лейблера


D_{\mathrm{KL}}(p\|q)
=\sum_xp(x)\log\frac{p(x)}{q(x)}.

Разложим кросс-энтропию:


\begin{aligned}
H(p,q)
&=-\sum_xp(x)\log q(x)\\
&=-\sum_xp(x)\log p(x)
  +\sum_xp(x)\log\frac{p(x)}{q(x)}\\
&=H(p)+D_{\mathrm{KL}}(p\|q).
\end{aligned}

Так как H(p) не зависит от модели q, минимизация кросс-энтропии эквивалентна минимизации D_{\mathrm{KL}}(p\|q).

KL-дивергенция неотрицательна. Из неравенства \log u\leq u-1:


\begin{aligned}
-D_{\mathrm{KL}}(p\|q)
&=\sum_xp(x)\log\frac{q(x)}{p(x)}\\
&\leq\sum_xp(x)\left(\frac{q(x)}{p(x)}-1\right)\\
&=\sum_xq(x)-\sum_xp(x)=0.
\end{aligned}

Следовательно, D_{\mathrm{KL}}\geq0, с равенством при p=q почти всюду. Однако это не расстояние: обычно D_{\mathrm{KL}}(p\|q)\ne D_{\mathrm{KL}}(q\|p), и не выполняется неравенство треугольника.

def kl_divergence(p, q):
    p = np.asarray(p, dtype=float)
    q = np.asarray(q, dtype=float)
    mask = p > 0
    if np.any(q[mask] == 0):
        return np.inf
    return np.sum(p[mask] * np.log(p[mask] / q[mask]))

p = np.array([0.8, 0.2])
q = np.array([0.6, 0.4])
print(kl_divergence(p, q))
print(kl_divergence(q, p))

Максимальное правдоподобие

Для независимых наблюдений \{x^{(i)}\}_{i=1}^n:


\mathcal{L}(\theta)
=\prod_{i=1}^{n}p_\theta(x^{(i)}).

Логарифм монотонен, поэтому максимум не изменится:


\arg\max_\theta\mathcal{L}(\theta)
=\arg\max_\theta\sum_{i=1}^{n}\log p_\theta(x^{(i)}).

Эквивалентно минимизируется отрицательное лог-правдоподобие:


-\frac1n\sum_i\log p_\theta(x^{(i)}).

Эмпирические частоты заменяют истинное ожидание, поэтому это эмпирическая кросс-энтропия между распределением данных и моделью.

Softmax и стабильная кросс-энтропия

Логиты \mathbf{z}\in\mathbb{R}^K преобразуются в вероятности:


p_k=\frac{e^{z_k}}{\sum_j e^{z_j}}.

Для правильного класса y:


\begin{aligned}
-\log p_y
&=-\log\frac{e^{z_y}}{\sum_j e^{z_j}}\\
&=-z_y+\log\sum_j e^{z_j}.
\end{aligned}

Применяя устойчивый logsumexp с m=\max_jz_j, получаем


\ell=-z_y+m+\log\sum_j e^{z_j-m}.
def cross_entropy_from_logits(logits, target):
    logits = np.asarray(logits, dtype=float)
    m = logits.max()
    logsumexp = m + np.log(np.exp(logits - m).sum())
    return logsumexp - logits[target]

print(cross_entropy_from_logits([1000.0, 1001.0, 999.0], 1))

Градиент по логитам имеет простую форму. Для \ell=-z_y+\log\sum_j e^{z_j}:


\frac{\partial\ell}{\partial z_k}
=-\mathbb{1}\{k=y\}
+\frac{e^{z_k}}{\sum_j e^{z_j}}
=p_k-\mathbb{1}\{k=y\}.

Условная энтропия и взаимная информация


H(Y\mid X)
=-\sum_{x,y}p(x,y)\log p(y\mid x)

измеряет оставшуюся неопределённость о Y после знания X. Взаимная информация:


\begin{aligned}
I(X;Y)
&=D_{\mathrm{KL}}(p(x,y)\|p(x)p(y))\\
&=\sum_{x,y}p(x,y)
\log\frac{p(x,y)}{p(x)p(y)}\\
&=H(Y)-H(Y\mid X).
\end{aligned}

Она показывает, насколько знание одной переменной уменьшает неопределённость другой. I(X;Y)\geq0 и равна нулю при независимости.

Непрерывный случай

Дифференциальная энтропия


h(X)=-\int p(x)\log p(x)\,dx

может быть отрицательной и меняется при смене масштаба. Поэтому её нельзя интерпретировать как обычное число битов отдельной непрерывной величины. KL-дивергенция и взаимная информация сохраняют более надёжный смысл при корректных плотностях.

Типичные ошибки

  • Энтропия распределения и кросс-энтропия двух распределений — разные вещи.
  • KL-дивергенция не симметрична и не является метрикой.
  • Нельзя вычислять log(softmax(z)) наивно при больших логитах.
  • Нулевая вероятность модели для возможного события даёт бесконечную потерю.
  • Дифференциальная энтропия может быть отрицательной.
  • Независимость наблюдений в выводе правдоподобия — предположение, а не факт.

Резюме

Самоинформация измеряет неожиданность, энтропия — её среднее. Кросс-энтропия оценивает кодирование данных моделью и равна энтропии плюс KL-дивергенция. Отрицательное лог-правдоподобие связывает эти идеи с обучением классификаторов, а взаимная информация измеряет статистическую зависимость.