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