Дивергенция Йенсена — Шеннона

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
(Версия 1.0)
(уточнение)
Строка 92: Строка 92:
Таким образом, генератор неявно стремится минимизировать дивергенцию Йенсена — Шеннона между сгенерированными данными и реальной выборкой. Стоит отметить, что в последующих работах (например, в Wasserstein GAN) было показано, что JSD может приводить к затуханию градиентов, если распределения <tex>p_{data}</tex> и <tex>p_g</tex> не пересекаются, что стимулировало переход к метрике Вассерштейна (Wasserstein distance).
Таким образом, генератор неявно стремится минимизировать дивергенцию Йенсена — Шеннона между сгенерированными данными и реальной выборкой. Стоит отметить, что в последующих работах (например, в Wasserstein GAN) было показано, что JSD может приводить к затуханию градиентов, если распределения <tex>p_{data}</tex> и <tex>p_g</tex> не пересекаются, что стимулировало переход к метрике Вассерштейна (Wasserstein distance).
-
Помимо архитектуры GAN, JSD активно применяется в задачах [[Обработка естественного языка|обработки естественного языка (NLP)]] для оценки качества тематических моделей (topic modeling) и сравнения эмбеддингов документов, а также в биоинформатике для сопоставления генетических последовательностей и белковых профилей.
+
Помимо архитектуры [[Генеративно-состязательная сеть|Генеративно-состязательной сети (GAN)]], JSD активно применяется в задачах [[Обработка естественного языка|обработки естественного языка (NLP)]] для оценки качества тематических моделей (topic modeling) и сравнения [[эмбеддинг|эмбеддингов]] документов, а также в биоинформатике для сопоставления генетических последовательностей и белковых профилей.
== См. также ==
== См. также ==

Версия 13:55, 17 июня 2026

Статья написана с использованием LLM Gemini 3.1 Pro и проверена участником Artem Abdulmanov 16:29, 17 июня 2026 (MSD)

Промпт приводится полностью в Обсуждение:Дивергенция Йенсена — Шеннона


Содержание

Введение

Дивергенция Йенсена — Шеннона (англ. Jensen–Shannon divergence, JSD) — это теоретико-информационная мера сходства между двумя распределениями вероятностей. В машинном обучении и математической статистике данный функционал применяется для количественной оценки того, насколько одно распределение отличается от другого, решая проблему несимметричности классических метрик расстояния в пространстве распределений.

Мотивировка и историческая справка

Исторически базовым способом измерения различий между распределениями выступала дивергенция Кульбака — Лейблера (KL-дивергенция). Однако её практическое применение сопряжено с двумя существенными проблемами. Во-первых, она не обладает свойством симметричности: значение D_{KL}(P \parallel Q) в общем случае не равно D_{KL}(Q \parallel P). Во-вторых, KL-дивергенция может обращаться в бесконечность, если распределение Q(x) равно нулю в тех точках, где P(x) больше нуля.

Для преодоления этих ограничений Цзяньхуа Линь (Jianhua Lin) в своей работе 1991 года предложил новую меру, основанную на энтропии Шеннона [1]. Предложенная дивергенция вычисляет усреднённое отклонение каждого из распределений от их общей смеси (среднего распределения). Это делает новую меру симметричной, всегда конечной и глубоко укоренённой в фундаментальных законах теории информации.

Математический аппарат и свойства

Пусть заданы два дискретных распределения вероятностей P и Q, определённых на одном и том же пространстве событий \mathcal{X}. Введём распределение M, которое является их поэлементным средним:

 M = \frac{1}{2}(P + Q)

Дивергенция Йенсена — Шеннона определяется как среднее арифметическое KL-дивергенций от распределений P и Q до их смеси M:

 JSD(P \parallel Q) = \frac{1}{2} D_{KL}(P \parallel M) + \frac{1}{2} D_{KL}(Q \parallel M)

Альтернативное, но математически эквивалентное определение можно записать через энтропию Шеннона H:

 JSD(P \parallel Q) = H(M) - \frac{1}{2}(H(P) + H(Q))

Дивергенция Йенсена — Шеннона обладает рядом важнейших аналитических свойств:

  • Симметричность: JSD(P \parallel Q) = JSD(Q \parallel P).
  • Неотрицательность: JSD(P \parallel Q) \ge 0, причём равенство нулю достигается тогда и только тогда, когда распределения P и Q идентичны.
  • Ограниченность: Если при вычислении логарифмов и энтропии используется основание 2 (измерение в битах), то значение функционала жёстко ограничено отрезком [0, 1].
  • Связь с метрическими пространствами: Сама по себе дивергенция Йенсена — Шеннона не является метрикой, так как не удовлетворяет неравенству треугольника. Однако квадратный корень из её значения \sqrt{JSD(P \parallel Q)} строго удовлетворяет всем аксиомам метрики и называется расстоянием Йенсена — Шеннона (Jensen–Shannon distance).

Практика на Python (NumPy, SciPy)

При реализации алгоритма «с нуля» крайне важно учитывать аспекты численной стабильности. Ниже приведён надёжный код с использованием библиотеки NumPy, а также показано использование готового решения из пакета SciPy.

import numpy as np
from scipy.spatial.distance import jensenshannon
 
def calculate_jsd(p, q, epsilon=1e-10):
    """
    Вычисляет дивергенцию Йенсена-Шеннона между распределениями p и q.
 
    Параметры:
    p, q: одномерные массивы numpy с вероятностями.
    epsilon: малая константа для избежания деления на ноль и логарифма нуля.
    """
    # 1. Принудительная нормализация распределений (сумма должна быть равна 1)
    p = p / np.sum(p)
    q = q / np.sum(q)
 
    # 2. Вычисление среднего распределения M
    m = 0.5 * (p + q)
 
    # 3. Вычисление KL-дивергенции для P || M и Q || M
    # Используем epsilon для численной стабильности
    kl_p_m = np.sum(p * np.log2((p + epsilon) / (m + epsilon)))
    kl_q_m = np.sum(q * np.log2((q + epsilon) / (m + epsilon)))
 
    # 4. Итоговое значение JSD
    jsd = 0.5 * kl_p_m + 0.5 * kl_q_m
    return jsd
 
# Пример использования
dist_p = np.array([0.1, 0.4, 0.5])
dist_q = np.array([0.2, 0.2, 0.6])
 
jsd_custom = calculate_jsd(dist_p, dist_q)
print(f"JSD (своя реализация): {jsd_custom:.4f} бит")
 
# Альтернатива: использование готовой функции из SciPy.
# ВАЖНО: функция jensenshannon возвращает РАССТОЯНИЕ (квадратный корень из JSD), 
# поэтому для получения дивергенции результат нужно возвести в квадрат.
js_distance = jensenshannon(dist_p, dist_q, base=2)
jsd_scipy = js_distance ** 2
print(f"JSD (SciPy): {jsd_scipy:.4f} бит")

В экосистеме глубинного обучения (например, PyTorch) встроенной функции для JSD нет, однако её легко реализовать, комбинируя функцию `torch.nn.functional.kl_div` для двух половин формулы.

Особенности вычисления и численные проблемы

При практическом применении дивергенции Йенсена — Шеннона в задачах машинного обучения инженеры регулярно сталкиваются со следующими нюансами:

  • Деление на ноль и логарифм нуля: Если вероятность P(x) = 0, математически предел выражения 0 \log 0 равен 0. В программном коде это вызывает значение `NaN`. Для борьбы с этим к знаменателю и аргументу логарифма прибавляют малое значение \epsilon (например, 10^{-10}).
  • Отсутствие нормализации: Формулы выведены для истинных распределений вероятностей (сумма элементов равна 1). Если подать на вход сырые логиты или частоты без предварительного применения функции Softmax или деления на сумму, результат будет математически бессмысленным.
  • Выбор основания логарифма: При использовании логарифма по основанию 2 результат измеряется в битах и лежит в пределах [0, 1]. При использовании натурального логарифма (основание e) результат измеряется в натах, и его верхняя граница составляет \ln(2) \approx 0.693. В программных библиотеках по умолчанию чаще используется натуральный логарифм.

Применение в современном ML и Generative Adversarial Networks

Дивергенция Йенсена — Шеннона приобрела колоссальную популярность благодаря своему центральному месту в теории Генеративно-состязательных нейросетей (GAN).

В оригинальной статье 2014 года Иэн Гудфеллоу (Ian Goodfellow) доказал, что процесс обучения GAN математически эквивалентен минимизации JSD [1]. Дискриминатор D обучается отличать истинное распределение данных p_{data} от распределения генератора p_g. При фиксированном генераторе G, оптимальный дискриминатор имеет вид:

 D_{G}^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)}

Если подставить этот оптимальный дискриминатор обратно в функцию потерь минимаксной игры V(G, D), то критерий качества генератора примет вид:

 \max_D V(G, D) = -\log(4) + 2 \cdot JSD(p_{data} \parallel p_g)

Таким образом, генератор неявно стремится минимизировать дивергенцию Йенсена — Шеннона между сгенерированными данными и реальной выборкой. Стоит отметить, что в последующих работах (например, в Wasserstein GAN) было показано, что JSD может приводить к затуханию градиентов, если распределения p_{data} и p_g не пересекаются, что стимулировало переход к метрике Вассерштейна (Wasserstein distance).

Помимо архитектуры Генеративно-состязательной сети (GAN), JSD активно применяется в задачах обработки естественного языка (NLP) для оценки качества тематических моделей (topic modeling) и сравнения эмбеддингов документов, а также в биоинформатике для сопоставления генетических последовательностей и белковых профилей.

См. также

Примечания


Литература

  • Lin J. Divergence measures based on the Shannon entropy // IEEE Transactions on Information theory. — 1991. — С. 145-151.
  • Goodfellow I. et al. Generative adversarial nets // Advances in neural information processing systems. — 2014. — С. 2672-2680.
  • Cover T. M., Thomas J. A. Elements of Information Theory. — Hoboken, New Jersey: John Wiley & Sons, 2006.