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