ai_learning/common/foundations/information_theory.md

280 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Основы теории информации
## Что измеряет информация
Редкое событие сообщает больше, чем ожидаемое. Если событие имеет вероятность
\(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,
\]
поэтому это максимум.
```python
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)\), и не выполняется
неравенство треугольника.
```python
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}.
\]
```python
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-дивергенция.
Отрицательное лог-правдоподобие связывает эти идеи с обучением классификаторов,
а взаимная информация измеряет статистическую зависимость.