Перейти к содержимому
Ступень 11.3 Вероятность и теория информации

Энтропия, KL-дивергенция, perplexity

Как измерить неопределённость распределения и расстояние между двумя распределениями — энтропия, cross-entropy, KL и perplexity, а также что делает с ними температура. На этом языке потом описывают дообучение и дистилляцию LLM.

УРОКstage-1/1-3-probability/03-entropy-kl.mdx1 ч 40 минУрок 3 из 4
После урока вы сможете
  • Считать информацию, энтропию и perplexity распределения в битах и натах и объяснять их смысл как «число вариантов»
  • Связывать три величины формулой H(p,q)=H(p)+KL(p∥q)H(p, q) = H(p) + \mathrm{KL}(p \Vert q) и объяснять, почему обучение LLM минимизирует KL до данных
  • Различать прямую и обратную KL и узнавать их в RLHF, GRPO и дистилляции; не попадаться в ловушку F.kl_div
  • Предсказывать, как температура меняет распределение и его энтропию

В уроке 1.3.2 вы узнали, что LLM учат минимизировать перекрёстная энтропияперекрёстная энтропияEN cross-entropy. Но что именно она измеряет и почему её минимум не равен нулю? Ответ даёт теория информации Клода Шеннона (1948). Это четыре числа, которые вы будете встречать в каждой статье о языковых моделях:

  • энтропия — насколько неопределённо распределение;
  • cross-entropy — сколько «стоит» описать данные с помощью модели;
  • KL-дивергенция — насколько одно распределение отличается от другого;
  • perplexity — та же энтропия, пересчитанная в «число вариантов».

KL-дивергенция особенно важна для второй половины курса. В обучение с подкреплением на основе отзывов людейобучение с подкреплением на основе отзывов людей (RLHF)EN reinforcement learning from human feedback (RLHF) (дообучении модели по оценкам людей) и GRPO (алгоритме обучения с подкреплением от DeepSeek, его вы видели в «Китайском угле» урока 1.3.1) она держит обучаемую модель рядом с исходной. В дистилляциидистилляцияEN (knowledge) distillation — обучении маленькой модели копировать большую — она измеряет, насколько ученик похож на учителя. А в DeepSeek-V3.2 с её помощью учат одну из деталей механизма внимания. Все эти темы ждут вас на ступенях 5–6; сейчас важно понять саму KL. В конце урока разберём температуру — ручку, которой регулируют энтропию при генерации.

Информация: сколько «удивления» в событии

Заголовок раздела «Информация: сколько «удивления» в событии»

Сообщение «завтра взойдёт солнце» не несёт информации: вы и так это знали. Сообщение «в Шанхае выпал снег» несёт много — это редкость. Шеннон предложил мерить информацию события через его вероятность:

I(x)=−log⁡2p(x)I(x) = -\log_2 p(x)

Это собственная информациясобственная информация («удивление»)EN self-information (surprisal)I(x) = −log p(x). Чем менее вероятно событие, тем больше информации оно несёт. В битах при log₂, в натах при ln.. Читаем: «чем меньше вероятность, тем больше информации». Единица измерения при логарифме по основанию 2 — бит:

  • честная монета, p=1/2p = 1/2: I=−log⁡212=1I = -\log_2 \frac{1}{2} = 1 бит — один ответ «да/нет»;
  • один из 8 равновероятных вариантов: log⁡28=3\log_2 8 = 3 бита — три вопроса «да/нет» (урок 1.0.2);
  • верный токен, которому свежая модель Qwen дала вероятность 1/151 9361/151\,936: log⁡2151 936≈17.2\log_2 151\,936 \approx 17.2 бита;
  • событие с p=1p = 1: ноль бит, никакого удивления.

Почему именно логарифм? Для независимых событий вероятности перемножаются, а информация должна складываться: два броска монеты — это 2 бита. Логарифм превращает произведение в сумму (урок 1.0.2).

энтропияэнтропия (информационная)EN (Shannon) entropyH(p) = −Σ p log p — среднее «удивление», мера неопределённости распределения. Максимальна у равномерного распределения. распределения — это матожидание информации (урок 1.3.1), то есть «сколько удивления в среднем»:

H(p)=Ex∼p[−log⁡p(x)]=−∑ipilog⁡piH(p) = \mathbb{E}_{x \sim p}\big[-\log p(x)\big] = -\sum_i p_i \log p_i

Читаем: «удивление каждого исхода −log⁡pi-\log p_i умножаем на его вероятность и складываем» — то же взвешенное среднее, что матожидание в уроке 1.3.1. Слагаемые с pi=0p_i = 0 пропускают: по соглашению 0⋅log⁡0=00 \cdot \log 0 = 0. Невозможное событие никогда не случается и средней неопределённости не добавляет.

Посчитаем руками энтропию нечестной монеты [0.9,0.1][0.9, 0.1] (орёл с вероятностью 0.9, решка — 0.1) в битах. Удивление орла −log⁡20.9≈0.152-\log_2 0.9 \approx 0.152 бита, решки −log⁡20.1≈3.32-\log_2 0.1 \approx 3.32 бита. Взвешиваем вероятностями: 0.9⋅0.152+0.1⋅3.32≈0.137+0.332=0.470.9 \cdot 0.152 + 0.1 \cdot 3.32 \approx 0.137 + 0.332 = 0.47 бита. Редкая решка очень удивительна, но случается редко, поэтому в среднем удивления меньше, чем у честной монеты (1 бит).

РаспределениеЭнтропия, битСмысл
честная монета [0.5,0.5][0.5, 0.5]1.00полная неопределённость между двумя вариантами
нечестная монета [0.9,0.1][0.9, 0.1]0.47почти всегда угадываем
[0.99,0.01][0.99, 0.01]0.08почти уверены
уверенное [1,0][1, 0]0неопределённости нет
8 равновероятных исходов3.00log⁡28\log_2 8
«Карп прыгает через…»: [0.71,0.12,0.08,0.05,0.04][0.71, 0.12, 0.08, 0.05, 0.04]1.41модель неплохо, но не полностью уверена

Два крайних случая стоит запомнить. Энтропия минимальна (ноль) у one-hot распределения и максимальна у равномерного: для KK исходов H=log⁡KH = \log K. Для словаря Qwen это log⁡2151 936≈17.2\log_2 151\,936 \approx 17.2 бита или ln⁡151 936≈11.93\ln 151\,936 \approx 11.93 ната — ровно тот начальный loss свежей модели, который вы считали в уроке 1.3.2.

У энтропии есть очень конкретный смысл. Пусть надо передавать по каналу исходы A, B, C, D с вероятностями 12,14,18,18\frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \frac{1}{8}. Код фиксированной длины тратит 2 бита на символ. Умнее дать частым символам короткие коды: A → 0, B → 10, C → 110, D → 111. Средняя длина: 12⋅1+14⋅2+18⋅3+18⋅3=1.75\frac{1}{2} \cdot 1 + \frac{1}{4} \cdot 2 + \frac{1}{8} \cdot 3 + \frac{1}{8} \cdot 3 = 1.75 бита. А энтропия этого распределения — тоже ровно 1.75 бита.

Это не совпадение. Теорема Шеннона: при кодировании без потерь меньше чем H(p)H(p) бит на символ в среднем потратить нельзя, а приблизиться к H(p)H(p) можно. Языковая модель — это, по сути, архиватор: чем точнее она предсказывает следующий токен, тем короче код текста. Поэтому в статьях качество модели иногда меряют в «битах на байт» (бит на байтбит на байт (BPB)EN bits per byte (BPB)Loss, пересчитанный на байт исходного текста; в отличие от perplexity, его можно сравнивать между моделями с разными токенизаторами., урок 4.2.3).

Пусть настоящие данные приходят из распределения pp, а код построен под распределение модели qq. Тогда средняя длина сообщения — это cross-entropy:

H(p,q)=−∑ipilog⁡qiH(p, q) = -\sum_i p_i \log q_i

Если q=pq = p, то H(p,q)=H(p)H(p, q) = H(p), и лучше не бывает. Любая ошибка модели удлиняет код. Разница между «ценой с чужим кодом» и «идеальной ценой» — это и есть KL-дивергенцияKL-дивергенция (дивергенция Кульбака — Лейблера)EN Kullback–Leibler divergenceKL(p ‖ q) = Σ p log(p / q) = H(p, q) − H(p) ≥ 0. Несимметрична, поэтому не настоящее расстояние.:

H(p,q)=H(p)+KL(p∥q)H(p, q) = H(p) + \mathrm{KL}(p \Vert q)

Это тождество — главное в уроке. Оно объясняет три вещи:

  1. Почему loss LLM не падает до нуля. H(p)H(p) — энтропия самого языка: после «Я выпил чашку…» осмысленных продолжений много («чая», «кофе», «воды»). Модель тут ни при чём, и эта часть loss неустранима (неустранимый lossнеустранимый lossEN irreducible lossЧасть loss, которую нельзя убрать никаким масштабом, — непредсказуемость самого текста (слагаемое E в формуле Chinchilla)., урок 5.1.1).
  2. Что на самом деле минимизирует обучение. H(p)H(p) не зависит от параметров модели. Значит, минимизируя cross-entropy, мы минимизируем KL(pданных∥qмодели)\mathrm{KL}(p_{\text{данных}} \Vert q_{\text{модели}}) — подтягиваем распределение модели к распределению языка.
  3. Связь с правдоподобием из урока 1.3.2. В отдельной позиции текста цель — one-hot с нулевой энтропией, и cross-entropy совпадает с KL и с −log⁡qt-\log q_t. Но один и тот же контекст встречается в корпусе с разными продолжениями, поэтому в среднем по корпусу цель — уже распределение языка с ненулевой энтропией. Отсюда и пункт 1.
KL(p∥q)=∑ipilog⁡piqi=Ex∼p[log⁡p(x)−log⁡q(x)]\mathrm{KL}(p \Vert q) = \sum_i p_i \log \frac{p_i}{q_i} = \mathbb{E}_{x \sim p}\big[\log p(x) - \log q(x)\big]

Читаем: «для каждого исхода берём логарифм отношения вероятностей и усредняем с весами pp». Запись p∥qp \Vert q читается «pp относительно qq». Свойства:

  • KL(p∥q)≥0\mathrm{KL}(p \Vert q) \ge 0, и KL=0\mathrm{KL} = 0 только при p=qp = q (неравенство Гиббса);
  • несимметрична: KL(p∥q)≠KL(q∥p)\mathrm{KL}(p \Vert q) \ne \mathrm{KL}(q \Vert p), поэтому это не расстояние в обычном смысле, а «дивергенция»;
  • если qi=0q_i = 0 там, где pi>0p_i > 0, то KL(p∥q)=∞\mathrm{KL}(p \Vert q) = \infty: модель «не верит» в то, что случается.

Пример. p=[0.5,0.5]p = [0.5, 0.5] (честная монета), q=[0.9,0.1]q = [0.9, 0.1]:

KL(p∥q)=0.5ln⁡0.50.9+0.5ln⁡0.50.1=−0.294+0.805≈0.511 ната,\mathrm{KL}(p \Vert q) = 0.5 \ln \frac{0.5}{0.9} + 0.5 \ln \frac{0.5}{0.1} = -0.294 + 0.805 \approx 0.511 \text{ ната},

а KL(q∥p)=0.9ln⁡1.8+0.1ln⁡0.2≈0.368\mathrm{KL}(q \Vert p) = 0.9 \ln 1.8 + 0.1 \ln 0.2 \approx 0.368. Разные числа — асимметрия налицо.

Асимметрия — не формальность. Пусть цель pp имеет два пика, а модель qq может «уместить» только один. Рассмотрим цель p=[0.495,0.01,0.495]p = [0.495, 0.01, 0.495] и двух кандидатов:

КандидатKL(p∥q)\mathrm{KL}(p \Vert q), прямаяKL(q∥p)\mathrm{KL}(q \Vert p), обратная
A — один пик: [0.98,0.01,0.01][0.98, 0.01, 0.01]1.5930.630
B — размазан: [0.34,0.32,0.34][0.34, 0.32, 0.34]0.3370.854
  • Прямая KL KL(p∥q)\mathrm{KL}(p \Vert q) усредняет по pp. Она жестоко штрафует модель, если та даёт малую вероятность тому, что в данных встречается часто. Поэтому выбирает B — покрыть все пики, пусть и размыто (mode covering). Так устроено обычное обучение на текстах (cross-entropy): модель старается не пропустить ни одного варианта.
  • Обратная KL KL(q∥p)\mathrm{KL}(q \Vert p) (обратная KL-дивергенцияобратная KL-дивергенция (reverse KL)EN reverse KL divergenceKL(q ‖ p), где q — модель, p — цель. «Ищет моду» — модель концентрируется на одном пике цели. Прямая KL(p ‖ q) «покрывает» все пики.) усредняет по qq. Ей всё равно, что модель пропустила второй пик, но она штрафует за вероятность там, где цель почти нулевая. Поэтому выбирает A — уверенно сесть на один пик (mode seeking).

Где это встретится в курсе. В таблице πθ\pi_\theta — обучаемая модель («политика» с параметрами θ\theta, урок 1.0.3), а πref\pi_{\text{ref}} — её исходная копия до дообучения. Претрейн — обучение на огромном корпусе текстов, обучение с учителем на инструкцияхобучение с учителем на инструкциях (SFT)EN supervised fine-tuning (SFT) — дообучение на примерах «вопрос — хороший ответ».

Где в LLMКакая KLЗачем
Претрейн и SFT (cross-entropy)прямая, KL(pданных∥q)\mathrm{KL}(p_{\text{данных}} \Vert q)покрыть всё разнообразие текста
RLHF и GRPO (модули 6.3–6.4)обратная, KL(πθ∥πref)\mathrm{KL}(\pi_\theta \Vert \pi_{\text{ref}}) по ответам самой моделине уходить далеко от исходной модели
Классическая дистилляцияпрямая, от учителя к ученикуученик копирует «мягкие» вероятности учителя
On-policy дистилляция (тренд 2025–2026)обратная, по ответам ученикаученик уверенно делает то, что одобрил бы учитель

Последнее равенство в определении — матожидание по pp. Значит, KL можно оценить, не перебирая все исходы: сэмплировать xx из pp и усреднить log⁡p(x)−log⁡q(x)\log p(x) - \log q(x). Для ответов LLM перебрать все варианты невозможно (их астрономически много), поэтому в RLHF и GRPO KL всегда оценивают именно так — по сгенерированным ответам (урок 6.3.1). У такой оценки есть подвох: отдельные слагаемые бывают отрицательными, и разброс велик. Как DeepSeek с этим справляется — в китайском углу ниже.

Энтропию в битах трудно почувствовать. Поэтому её переводят обратно в «число вариантов»:

PPL(p)=2H(p) в битах=eH(p) в натах\mathrm{PPL}(p) = 2^{H(p) \text{ в битах}} = e^{H(p) \text{ в натах}}

У равномерного распределения на KK исходах perplexity равна ровно KK. Поэтому perplexity — это эффективное число равновероятных вариантов. У распределения «Карп прыгает через…» энтропия 1.41 бита, а perplexity 21.41≈2.662^{1.41} \approx 2.66: модель «колеблется» примерно между двумя-тремя словами, хотя формально вариантов пять.

перплексияперплексияEN perplexity языковой модели на тексте — это eсредний losse^{\text{средний loss}} (урок 1.3.2), то есть perplexity cross-entropy, а не энтропии. При loss 3.0 ната perplexity ≈20\approx 20: на каждом шаге модель в среднем выбирает будто из 20 равновероятных токенов. У свежей модели Qwen perplexity примерно равна размеру словаря, 151 936. Та же идея «эффективного числа» стоит за параметром perplexity в алгоритме t-SNE (урок 2.3.2).

При генерации логиты zz делят на температуратемпература (сэмплирования)EN temperatureЛогиты делятся на T перед softmax. T < 1 — распределение острее, T > 1 — площе, T → 0 — greedy. TT перед softmax:

pi(T)=ezi/T∑jezj/Tp_i(T) = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}}

Разница логитов zi−zjz_i - z_j превращается в (zi−zj)/T(z_i - z_j)/T. При T<1T < 1 разницы растут — распределение становится острее, энтропия падает. При T>1T > 1 разницы сжимаются — распределение площе, энтропия растёт. Порядок токенов (какой вероятнее) не меняется никогда.

import torch
logits = torch.tensor([3.2, 1.6, 1.1, 0.3, -0.4, -1.5]) # 6 токенов
for T in [0.5, 1.0, 2.0]:
p = torch.softmax(logits / T, dim=-1) # делим логиты на температуру
H = -(p * p.log2()).sum() # энтропия в битах
print(f"T={T}: p={[round(x, 3) for x in p.tolist()]} H={H:.2f} бит PPL={2 ** H:.2f}")
T=0.5: p=[0.944, 0.038, 0.014, 0.003, 0.001, 0.0] H=0.38 бит PPL=1.30
T=1.0: p=[0.706, 0.143, 0.086, 0.039, 0.019, 0.006] H=1.40 бит PPL=2.64
T=2.0: p=[0.436, 0.196, 0.153, 0.102, 0.072, 0.042] H=2.20 бит PPL=4.59

Предельные случаи: при T→0T \to 0 вся вероятность уходит самому большому логиту (жадная генерация, H→0H \to 0), при T→∞T \to \infty распределение стремится к равномерному (H→log⁡26≈2.58H \to \log_2 6 \approx 2.58 бита). Делить на ноль нельзя, поэтому «температура 0» в API реализована как отдельный режим argmax. Название пришло из физики: в распределении Больцмана p∝e−E/kTp \propto e^{-E/kT} при высокой температуре частицы равномерно занимают все состояния.

Подвигайте ползунок температуры в песочнице и посмотрите, как меняются вероятности, энтропия и perplexity (виджет считает энтропию в битах). Top-k и top-p пока оставьте выключенными: их разберём в уроке 4.1.3.

Песочница: softmax и сэмплированиеинтерактив
КонтекстКарп прыгает через…
ТокенЛогитВероятность
Нажмите, чтобы вытянуть 20 токенов из этого распределения

Температура встречается не только при генерации. В классической дистилляции (Хинтон и соавторы, 2015) учителя «размягчают» температурой T>1T > 1, чтобы ученик видел не только правильный ответ, но и то, какие ошибки учитель считает «почти правильными»: «кошка» больше похожа на «собаку», чем на «автомобиль».

Реализуйте энтропию, KL и softmax с температурой на чистом Python. Тесты проверят числа из урока, асимметрию KL, обработку нулей и разложение H(p,q)=H(p)+KL(p∥q)H(p, q) = H(p) + \mathrm{KL}(p \Vert q).

Энтропия, KL и температура8 тестов
import math

LOGITS = [3.2, 1.6, 1.1, 0.3, -0.4, -1.5]   # логиты модели для 6 токенов


def entropy(p, base=2):
    """Энтропия H(p) = −Σ p·log(p). По умолчанию в битах (base=2); base=math.e — в натах.

    Слагаемые с p = 0 пропускайте: по соглашению 0·log 0 = 0.
    """
    # TODO: ваш код
    ...


def kl(p, q):
    """KL(p ‖ q) = Σ p·ln(p / q) в натах.

    Слагаемые с p = 0 пропускайте. Если p > 0, а q = 0 — верните math.inf.
    """
    # TODO: ваш код
    ...


def softmax_t(logits, T=1.0):
    """Softmax с температурой: softmax(logits / T). Должен быть устойчив к логитам порядка 1000."""
    # TODO: ваш код
    ...


# Проверьте себя кнопкой «Запустить»:
print(entropy([0.5, 0.5]), entropy([0.25] * 4))           # 1.0 2.0
print(kl([0.5, 0.5], [0.9, 0.1]))                           # ≈ 0.5108
print(kl([0.9, 0.1], [0.5, 0.5]))                           # ≈ 0.3681 — KL несимметрична
for T in (0.5, 1.0, 2.0):
    p = softmax_t(LOGITS, T)
    if p:                                                   # покажется, когда softmax_t заработает
        print(T, [round(x, 3) for x in p], entropy(p))      # энтропия растёт с T

В PyTorch есть готовая функция, но с неочевидным порядком аргументов: F.kl_div(input, target) считает KL(target∥model)\mathrm{KL}(\text{target} \Vert \text{model}) и ждёт в input логарифмы вероятностей модели, а в target — обычные вероятности цели. Так её используют при дистилляции:

import torch
import torch.nn.functional as F
teacher_logits = torch.tensor([[2.0, 1.0, 0.1]]) # «учитель»: батч из 1 примера, 3 токена
student_logits = torch.tensor([[1.0, 1.5, 0.5]]) # «ученик»
p = F.softmax(teacher_logits, dim=-1) # цель
log_q = F.log_softmax(student_logits, dim=-1) # ЛОГ-вероятности модели
kl_manual = (p * (p.log() - log_q)).sum(dim=-1).mean()
kl_torch = F.kl_div(log_q, p, reduction="batchmean") # KL(p ‖ q): сначала log q, потом p
wrong = F.kl_div(F.softmax(student_logits, dim=-1), p, reduction="batchmean") # вероятности вместо логарифмов
print(round(kl_manual.item(), 4), round(kl_torch.item(), 4), round(wrong.item(), 4))
0.2616 0.2616 -1.1903

Ошибочный вариант не падает с ошибкой — он молча возвращает отрицательное число. Запомните правило отладки: KL меньше нуля — значит, где-то перепутаны аргументы или логарифмы. И используйте reduction="batchmean": вариант по умолчанию "mean" делит ещё и на размер словаря и даёт число, которое не является KL.

Проверь себя6 вопросов
1 Чему равна энтропия распределения [0.5,0.25,0.25][0.5, 0.25, 0.25] в битах?
2 У цели pp два пика, а модель qq умеет изобразить только один. Какую KL нужно минимизировать, чтобы модель уверенно села на один пик, а не размазалась между двумя?
3 Какие утверждения о KL-дивергенции верны?Можно выбрать несколько ответов
4 Средний loss модели на тексте — 3.0 ната на токен. Чему равна perplexity? Округлите до одного знака.
5 Что происходит с распределением softmax(z/T)\mathrm{softmax}(z / T) при T→0T \to 0?
6 Ваш код посчитал KL-дивергенцию между учителем и учеником и выдал −1.19. Что это значит?
  • Информация события — −log⁡p-\log p, энтропия — её среднее. Энтропия от 0 (полная уверенность) до log⁡K\log K (равномерное распределение) и равна минимальной средней длине кода.
  • H(p,q)=H(p)+KL(p∥q)H(p, q) = H(p) + \mathrm{KL}(p \Vert q): обучение на cross-entropy подтягивает модель к данным по KL, а энтропия самого языка — неустранимая часть loss.
  • KL неотрицательна и несимметрична. Прямая KL покрывает все пики, обратная садится на один. KL держит модель рядом с референсом в RLHF и GRPO и переносит знания в дистилляции.
  • Perplexity = eHe^{H} — эффективное число вариантов. Температура делает распределение острее (T<1T < 1) или площе (T>1T > 1), не меняя порядок токенов.

Дальше: статистика экспериментов — почему любой результат на бенчмарке содержит шум, как построить доверительный интервал и честно сравнить две модели.