Энтропия, KL-дивергенция, perplexity
Как измерить неопределённость распределения и расстояние между двумя распределениями — энтропия, cross-entropy, KL и perplexity, а также что делает с ними температура. На этом языке потом описывают дообучение и дистилляцию LLM.
Зачем это нужно
Заголовок раздела «Зачем это нужно»В уроке 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. В конце урока разберём температуру — ручку, которой регулируют энтропию при генерации.
Информация: сколько «удивления» в событии
Заголовок раздела «Информация: сколько «удивления» в событии»Сообщение «завтра взойдёт солнце» не несёт информации: вы и так это знали. Сообщение «в Шанхае выпал снег» несёт много — это редкость. Шеннон предложил мерить информацию события через его вероятность:
Это собственная информациясобственная информация («удивление»)EN self-information (surprisal)I(x) = −log p(x). Чем менее вероятно событие, тем больше информации оно несёт. В битах при log₂, в натах при ln.. Читаем: «чем меньше вероятность, тем больше информации». Единица измерения при логарифме по основанию 2 — бит:
- честная монета, : бит — один ответ «да/нет»;
- один из 8 равновероятных вариантов: бита — три вопроса «да/нет» (урок 1.0.2);
- верный токен, которому свежая модель Qwen дала вероятность : бита;
- событие с : ноль бит, никакого удивления.
Почему именно логарифм? Для независимых событий вероятности перемножаются, а информация должна складываться: два броска монеты — это 2 бита. Логарифм превращает произведение в сумму (урок 1.0.2).
Энтропия: среднее удивление
Заголовок раздела «Энтропия: среднее удивление»энтропияэнтропия (информационная)EN (Shannon) entropyH(p) = −Σ p log p — среднее «удивление», мера неопределённости распределения. Максимальна у равномерного распределения. распределения — это матожидание информации (урок 1.3.1), то есть «сколько удивления в среднем»:
Читаем: «удивление каждого исхода умножаем на его вероятность и складываем» — то же взвешенное среднее, что матожидание в уроке 1.3.1. Слагаемые с пропускают: по соглашению . Невозможное событие никогда не случается и средней неопределённости не добавляет.
Посчитаем руками энтропию нечестной монеты (орёл с вероятностью 0.9, решка — 0.1) в битах. Удивление орла бита, решки бита. Взвешиваем вероятностями: бита. Редкая решка очень удивительна, но случается редко, поэтому в среднем удивления меньше, чем у честной монеты (1 бит).
| Распределение | Энтропия, бит | Смысл |
|---|---|---|
| честная монета | 1.00 | полная неопределённость между двумя вариантами |
| нечестная монета | 0.47 | почти всегда угадываем |
| 0.08 | почти уверены | |
| уверенное | 0 | неопределённости нет |
| 8 равновероятных исходов | 3.00 | |
| «Карп прыгает через…»: | 1.41 | модель неплохо, но не полностью уверена |
Два крайних случая стоит запомнить. Энтропия минимальна (ноль) у one-hot распределения и максимальна у равномерного: для исходов . Для словаря Qwen это бита или ната — ровно тот начальный loss свежей модели, который вы считали в уроке 1.3.2.
Энтропия — это длина кода
Заголовок раздела «Энтропия — это длина кода»У энтропии есть очень конкретный смысл. Пусть надо передавать по каналу исходы A, B, C, D с вероятностями
. Код фиксированной длины тратит 2 бита на символ. Умнее дать
частым символам короткие коды: A → 0, B → 10, C → 110, D → 111. Средняя длина:
бита. А энтропия этого
распределения — тоже ровно 1.75 бита.
Это не совпадение. Теорема Шеннона: при кодировании без потерь меньше чем бит на символ в среднем потратить нельзя, а приблизиться к можно. Языковая модель — это, по сути, архиватор: чем точнее она предсказывает следующий токен, тем короче код текста. Поэтому в статьях качество модели иногда меряют в «битах на байт» (бит на байтбит на байт (BPB)EN bits per byte (BPB)Loss, пересчитанный на байт исходного текста; в отличие от perplexity, его можно сравнивать между моделями с разными токенизаторами., урок 4.2.3).
Cross-entropy: платим за чужой код
Заголовок раздела «Cross-entropy: платим за чужой код»Пусть настоящие данные приходят из распределения , а код построен под распределение модели . Тогда средняя длина сообщения — это cross-entropy:
Если , то , и лучше не бывает. Любая ошибка модели удлиняет код. Разница между «ценой с чужим кодом» и «идеальной ценой» — это и есть KL-дивергенцияKL-дивергенция (дивергенция Кульбака — Лейблера)EN Kullback–Leibler divergenceKL(p ‖ q) = Σ p log(p / q) = H(p, q) − H(p) ≥ 0. Несимметрична, поэтому не настоящее расстояние.:
Это тождество — главное в уроке. Оно объясняет три вещи:
- Почему loss LLM не падает до нуля. — энтропия самого языка: после «Я выпил чашку…» осмысленных продолжений много («чая», «кофе», «воды»). Модель тут ни при чём, и эта часть loss неустранима (неустранимый lossнеустранимый lossEN irreducible lossЧасть loss, которую нельзя убрать никаким масштабом, — непредсказуемость самого текста (слагаемое E в формуле Chinchilla)., урок 5.1.1).
- Что на самом деле минимизирует обучение. не зависит от параметров модели. Значит, минимизируя cross-entropy, мы минимизируем — подтягиваем распределение модели к распределению языка.
- Связь с правдоподобием из урока 1.3.2. В отдельной позиции текста цель — one-hot с нулевой энтропией, и cross-entropy совпадает с KL и с . Но один и тот же контекст встречается в корпусе с разными продолжениями, поэтому в среднем по корпусу цель — уже распределение языка с ненулевой энтропией. Отсюда и пункт 1.
KL-дивергенция
Заголовок раздела «KL-дивергенция»Читаем: «для каждого исхода берём логарифм отношения вероятностей и усредняем с весами ». Запись читается « относительно ». Свойства:
- , и только при (неравенство Гиббса);
- несимметрична: , поэтому это не расстояние в обычном смысле, а «дивергенция»;
- если там, где , то : модель «не верит» в то, что случается.
Пример. (честная монета), :
а . Разные числа — асимметрия налицо.
Прямая и обратная KL: кто кого покрывает
Заголовок раздела «Прямая и обратная KL: кто кого покрывает»Асимметрия — не формальность. Пусть цель имеет два пика, а модель может «уместить» только один. Рассмотрим цель и двух кандидатов:
| Кандидат | , прямая | , обратная |
|---|---|---|
| A — один пик: | 1.593 | 0.630 |
| B — размазан: | 0.337 | 0.854 |
- Прямая KL усредняет по . Она жестоко штрафует модель, если та даёт малую вероятность тому, что в данных встречается часто. Поэтому выбирает B — покрыть все пики, пусть и размыто (mode covering). Так устроено обычное обучение на текстах (cross-entropy): модель старается не пропустить ни одного варианта.
- Обратная KL (обратная KL-дивергенцияобратная KL-дивергенция (reverse KL)EN reverse KL divergenceKL(q ‖ p), где q — модель, p — цель. «Ищет моду» — модель концентрируется на одном пике цели. Прямая KL(p ‖ q) «покрывает» все пики.) усредняет по . Ей всё равно, что модель пропустила второй пик, но она штрафует за вероятность там, где цель почти нулевая. Поэтому выбирает A — уверенно сесть на один пик (mode seeking).
Где это встретится в курсе. В таблице — обучаемая модель («политика» с параметрами , урок 1.0.3), а — её исходная копия до дообучения. Претрейн — обучение на огромном корпусе текстов, обучение с учителем на инструкцияхобучение с учителем на инструкциях (SFT)EN supervised fine-tuning (SFT) — дообучение на примерах «вопрос — хороший ответ».
| Где в LLM | Какая KL | Зачем |
|---|---|---|
| Претрейн и SFT (cross-entropy) | прямая, | покрыть всё разнообразие текста |
| RLHF и GRPO (модули 6.3–6.4) | обратная, по ответам самой модели | не уходить далеко от исходной модели |
| Классическая дистилляция | прямая, от учителя к ученику | ученик копирует «мягкие» вероятности учителя |
| On-policy дистилляция (тренд 2025–2026) | обратная, по ответам ученика | ученик уверенно делает то, что одобрил бы учитель |
KL по сэмплам
Заголовок раздела «KL по сэмплам»Последнее равенство в определении — матожидание по . Значит, KL можно оценить, не перебирая все исходы: сэмплировать из и усреднить . Для ответов LLM перебрать все варианты невозможно (их астрономически много), поэтому в RLHF и GRPO KL всегда оценивают именно так — по сгенерированным ответам (урок 6.3.1). У такой оценки есть подвох: отдельные слагаемые бывают отрицательными, и разброс велик. Как DeepSeek с этим справляется — в китайском углу ниже.
Perplexity: эффективное число вариантов
Заголовок раздела «Perplexity: эффективное число вариантов»Энтропию в битах трудно почувствовать. Поэтому её переводят обратно в «число вариантов»:
У равномерного распределения на исходах perplexity равна ровно . Поэтому perplexity — это эффективное число равновероятных вариантов. У распределения «Карп прыгает через…» энтропия 1.41 бита, а perplexity : модель «колеблется» примерно между двумя-тремя словами, хотя формально вариантов пять.
перплексияперплексияEN perplexity языковой модели на тексте — это (урок 1.3.2), то есть perplexity cross-entropy, а не энтропии. При loss 3.0 ната perplexity : на каждом шаге модель в среднем выбирает будто из 20 равновероятных токенов. У свежей модели Qwen perplexity примерно равна размеру словаря, 151 936. Та же идея «эффективного числа» стоит за параметром perplexity в алгоритме t-SNE (урок 2.3.2).
Температура
Заголовок раздела «Температура»При генерации логиты делят на температуратемпература (сэмплирования)EN temperatureЛогиты делятся на T перед softmax. T < 1 — распределение острее, T > 1 — площе, T → 0 — greedy. перед softmax:
Разница логитов превращается в . При разницы растут — распределение становится острее, энтропия падает. При разницы сжимаются — распределение площе, энтропия растёт. Порядок токенов (какой вероятнее) не меняется никогда.
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.30T=1.0: p=[0.706, 0.143, 0.086, 0.039, 0.019, 0.006] H=1.40 бит PPL=2.64T=2.0: p=[0.436, 0.196, 0.153, 0.102, 0.072, 0.042] H=2.20 бит PPL=4.59Предельные случаи: при вся вероятность уходит самому большому логиту (жадная генерация, ), при распределение стремится к равномерному ( бита). Делить на ноль нельзя, поэтому «температура 0» в API реализована как отдельный режим argmax. Название пришло из физики: в распределении Больцмана при высокой температуре частицы равномерно занимают все состояния.
Подвигайте ползунок температуры в песочнице и посмотрите, как меняются вероятности, энтропия и perplexity (виджет считает энтропию в битах). Top-k и top-p пока оставьте выключенными: их разберём в уроке 4.1.3.
Температура встречается не только при генерации. В классической дистилляции (Хинтон и соавторы, 2015) учителя «размягчают» температурой , чтобы ученик видел не только правильный ответ, но и то, какие ошибки учитель считает «почти правильными»: «кошка» больше похожа на «собаку», чем на «автомобиль».
Практика
Заголовок раздела «Практика»Реализуйте энтропию, KL и softmax с температурой на чистом Python. Тесты проверят числа из урока, асимметрию KL, обработку нулей и разложение .
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
Заголовок раздела «Ловушка PyTorch: F.kl_div»В PyTorch есть готовая функция, но с неочевидным порядком аргументов: F.kl_div(input, target) считает
и ждёт в input логарифмы вероятностей модели, а в target —
обычные вероятности цели. Так её используют при дистилляции:
import torchimport 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, потом pwrong = 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.
Проверь себя
Заголовок раздела «Проверь себя»- Информация события — , энтропия — её среднее. Энтропия от 0 (полная уверенность) до (равномерное распределение) и равна минимальной средней длине кода.
- : обучение на cross-entropy подтягивает модель к данным по KL, а энтропия самого языка — неустранимая часть loss.
- KL неотрицательна и несимметрична. Прямая KL покрывает все пики, обратная садится на один. KL держит модель рядом с референсом в RLHF и GRPO и переносит знания в дистилляции.
- Perplexity = — эффективное число вариантов. Температура делает распределение острее () или площе (), не меняя порядок токенов.
Дальше: статистика экспериментов — почему любой результат на бенчмарке содержит шум, как построить доверительный интервал и честно сравнить две модели.