Здравствуйте! В прошлом уроке мы перешли от surprisal отдельного исхода к энтропии : средней неопределённости одной дискретной случайной величины. Теперь объектом станет пара переменных. Это позволяет строго отделить две разные идеи:
- сколько неопределённости содержится в совместном исходе ;
- сколько неопределённости о остаётся после того, как уже известно.
К концу урока вы сможете брать заданную таблицу , находить маргинальные и условные распределения, а затем вычислять , и несколькими согласованными способами.
Совместное распределение: таблица как распределение одной составной величины
Пусть принимает значения , а — значения . Совместное распределение задаёт вероятность каждой пары:
Его удобно представлять таблицей: строки соответствуют значениям , столбцы — значениям . Каждая ячейка — вероятность одного атомарного совместного исхода. Все ячейки должны быть неотрицательны, а их сумма должна быть равна единице:
Например, пусть обозначает температуру, а — влажность. Совместное распределение может быть таким:
Последний столбец и последняя строка получаются маргинализацией:
То есть, чтобы забыть одну из переменных, мы складываем вероятности по её возможным значениям.
Например,
Совместная энтропия
Пару следует рассматривать как одну дискретную случайную величину, чьи исходы — пары значений. Поэтому формула не требует нового принципа:
Здесь единица измерения — биты. Для таблицы температуры и влажности:
Это средний surprisal совместного наблюдения. Если вы одновременно узнали температуру и влажность, именно характеризует неопределённость такого парного исхода до наблюдения.
Полезные проверки результата:
Добавление переменной не может уменьшить неопределённость полного совместного объекта: из пары можно восстановить и , и .
При независимости
и тогда
В нашем примере переменные не независимы. Например,
но
Поэтому совместная энтропия меньше суммы маргинальных:
Information Theory, Lecture 1: Defining Entropy and Information - Oxford Mathematics 3rd Yr Lecture
Посмотрите фрагменты лекции «Information Theory, Lecture 1» от Oxford Mathematics. Лектор формально рассматривает пару переменных как единую случайную величину, затем выводит условную энтропию как среднее количество неопределённости, остающееся после наблюдения условия.
Вначале посмотрите совместную энтропию. Обратите внимание на ключевое переосмысление: вектор (X_1,X_2) имеет обычное дискретное распределение на множестве пар. Затем посмотрите условную энтропию. Проследите два представления величины H(Y\mid X): через двойную сумму по совместному распределению и как среднее энтропий условных распределений.
Условные распределения: что остаётся неизвестным после наблюдения
Совместная таблица отвечает на вопрос о неопределённости пары. Однако во многих ML-задачах требуется другой вопрос: насколько неопределённа метка, если признаки уже наблюдались? Или: насколько неопределённо следующее действие политики, если известно состояние?
Для этого нужна условная вероятность. При :
Фиксировав конкретное , мы получаем полноценное распределение по . Его энтропия:
Это ещё не , а энтропия при конкретном условии. Общая условная энтропия усредняет эти величины с весами вероятности условия:
Эквивалентная запись сразу через совместное распределение:
Это ожидаемый surprisal после того, как стало известно.

На схеме особенно важно не спутать два объекта:
и
Первый относится к одному конкретному срезу распределения. Второй усредняет все срезы, причём частые значения должны влиять сильнее редких.
Прочитайте два коротких подраздела из Dive into Deep Learning. Они связывают определения совместной и условной энтропии с интуицией ML: сколько информации содержится в паре переменных и сколько неопределённости в целевой переменной остаётся после наблюдения входа.
В подразделе 22.11.3.1, «Joint Entropy», прочитайте объяснение от фразы двух предельных случаев и соотнесите их с проверками H(X,Y)=H(X)+H(Y) при независимости и H(X,Y)=H(X)=H(Y), когда X=Y. Затем в подразделе 22.11.3.2, «Conditional Entropy», начните с мотивации от перехода к условной неопределённости. Дочитайте подраздел до равенства H(Y\mid X)=H(X,Y)-H(X), обращая внимание, что условная энтропия — это одно число, полученное усреднением по всем наблюдаемым X.
Полный расчёт из совместной таблицы
Вернёмся к температуре и влажности . Уже найдены маргинальные распределения:
Их энтропии:
Энтропия температуры при известной влажности
Начнём с . Для берём первый столбец и нормируем его на :
Поэтому
А при высокой влажности:
Теперь взвешиваем по вероятности каждого уровня влажности:
Знание влажности уменьшает среднюю неопределённость температуры:
Но это уменьшение происходит в среднем. Обратите внимание:
Конкретное наблюдение в этом примере делает температуру слегка более неопределённой, чем безусловно. Это не противоречит общему неравенству : редкие и частые условия усредняются с разными весами.
Энтропия влажности при известной температуре
Теперь меняем направление условия. Для холодной температуры:
Аналогично:
Взвешенное среднее:
Итак,
Условная энтропия обычно несимметрична: знать влажность и предсказывать температуру — не то же самое, что знать температуру и предсказывать влажность.
Самая полезная формула-проверка
Условные вероятности удовлетворяют факторизации:
Подставим её в совместную энтропию:
Первое слагаемое равно , второе — . Поэтому:
Аналогично:
Для примера:
Эти равенства полезнее, чем просто вычислительная экономия. Они позволяют обнаружить ошибки в нормировке, перепутанную ось таблицы или неверное направление условия.
Краткая памятка для таблицы, в которой строки — , а столбцы — :
| Требуется найти | Операция |
|---|---|
| Сложить строку | |
| Сложить столбец | |
| Разделить столбец на его сумму | |
| Разделить строку на её сумму | |
| Посчитать энтропию всех ячеек | |
| Энтропия каждого нормированного столбца, затем среднее с весами | |
| Энтропия каждой нормированной строки, затем среднее с весами |
Если маргинальная вероятность условия равна нулю, например , то не определено обычным делением. На практике это не создаёт вклада в , поскольку такой случай имеет нулевой вес . В коде важно обработать его без деления на ноль и без nan.
PyTorch: расчёт и автоматические проверки тождеств
Ниже функция для одной двумерной таблицы, где строки соответствуют , а столбцы — . Она возвращает совместную энтропию, маргинальные энтропии и обе условные энтропии.
import math
import torch
def entropy(probs: torch.Tensor, dim=None, base: float = 2.0) -> torch.Tensor:
"""Entropy of a normalized discrete distribution."""
probs = torch.as_tensor(probs, dtype=torch.float64)
if (probs < 0).any() or not torch.isfinite(probs).all():
raise ValueError("Probabilities must be finite and non-negative.")
tiny = torch.finfo(probs.dtype).tiny
log_probs = probs.clamp_min(tiny).log()
terms = torch.where(
probs > 0,
probs * log_probs,
torch.zeros_like(probs),
)
return -terms.sum(dim=dim) / math.log(base)
def joint_entropy_summary(
p_xy: torch.Tensor,
base: float = 2.0,
) -> dict[str, torch.Tensor]:
"""
Rows are X values; columns are Y values.
p_xy[i, j] = P(X=x_i, Y=y_j).
"""
p_xy = torch.as_tensor(p_xy, dtype=torch.float64)
if p_xy.ndim != 2:
raise ValueError("Expected a 2D joint-probability table.")
if not torch.allclose(
p_xy.sum(),
torch.tensor(1.0, dtype=p_xy.dtype),
atol=1e-12,
rtol=1e-12,
):
raise ValueError("Joint probabilities must sum to 1.")
p_x = p_xy.sum(dim=1)
p_y = p_xy.sum(dim=0)
h_xy = entropy(p_xy, base=base)
h_x = entropy(p_x, base=base)
h_y = entropy(p_y, base=base)
# Conditional entropies from the two-variable chain rule.
h_x_given_y = h_xy - h_y
h_y_given_x = h_xy - h_x
return {
"p_x": p_x,
"p_y": p_y,
"H(X)": h_x,
"H(Y)": h_y,
"H(X,Y)": h_xy,
"H(X|Y)": h_x_given_y,
"H(Y|X)": h_y_given_x,
}
Применим её к таблице температуры и влажности:
p_tm = torch.tensor([
[0.1, 0.2], # cold
[0.4, 0.1], # mild
[0.1, 0.1], # hot
])
summary = joint_entropy_summary(p_tm)
for name, value in summary.items():
print(f"{name}: {value}")
Ожидаемые ключевые значения:
p_x: tensor([0.3000, 0.5000, 0.2000], dtype=torch.float64)
p_y: tensor([0.6000, 0.4000], dtype=torch.float64)
H(X): 1.4855
H(Y): 0.9710
H(X,Y): 2.3219
H(X|Y): 1.3510
H(Y|X): 0.8365
В production-коде или экспериментальном ноутбуке полезно не только получить метрики, но и проверять структуру распределения:
result = joint_entropy_summary(p_tm)
assert torch.allclose(
result["H(X,Y)"],
result["H(Y)"] + result["H(X|Y)"],
)
assert torch.allclose(
result["H(X,Y)"],
result["H(X)"] + result["H(Y|X)"],
)
assert result["H(X|Y)"] <= result["H(X)"] + 1e-12
assert result["H(Y|X)"] <= result["H(Y)"] + 1e-12
Две крайние конструкции полезны как unit tests.
Независимые переменные. Если , знание не меняет распределение , поэтому:
p_x = torch.tensor([0.7, 0.3])
p_y = torch.tensor([0.25, 0.75])
p_independent = torch.outer(p_x, p_y)
independent = joint_entropy_summary(p_independent)
print(independent["H(X)"])
print(independent["H(X|Y)"])
Детерминированная зависимость. Если для честного бинарного , то после наблюдения неопределённости о не остаётся:
p_equal = torch.tensor([
[0.5, 0.0],
[0.0, 0.5],
])
equal = joint_entropy_summary(p_equal)
print(equal["H(X,Y)"]) # 1 bit
print(equal["H(X|Y)"]) # 0 bits
print(equal["H(Y|X)"]) # 0 bits
Итог
Из совместного распределения можно систематически получить все нужные энтропийные величины:
Главные ориентиры:
- совместная энтропия — неопределённость пары как одного объекта;
- условная энтропия — средняя неопределённость одной переменной после наблюдения другой;
- и в общем случае различаются;
- энтропия при конкретном условии может быть больше безусловной , хотя усреднённая величина не превосходит ;
- тождества
и
служат одновременно определением, способом расчёта и сильной проверкой реализации.
В следующем уроке мы расширим это двухпеременное разложение на последовательности случайных величин и применим цепное правило энтропии — основу для анализа авторегрессивных моделей и источников данных.
Can't find a good explanation? Sign up and we'll make it for you
Sign up