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