Классическое определение вероятности 🎲
Ты обучил классификатор, который определяет мошеннические транзакции. Метрика accuracy — 99,2%. Красивое число, можно нести в презентацию. А потом кто-то из команды задаёт неудобный вопрос: «А сколько вообще мошеннических транзакций в датасете?» Ты смотришь — 0,8%. И тут же понимаешь: модель, которая всегда отвечает «не мошенничество», выдаёт ровно те же 99,2%. Ты потратил три дня на архитектуру, которая не лучше константы.
Это не ошибка в коде и не проблема с гиперпараметрами. Это ошибка в вероятностной интуиции. Мы по умолчанию думаем, что если у события два исхода, то шансы примерно пополам — и почти всегда ошибаемся. Классическое определение вероятности, с которого начинается вся теория, устроено предельно просто: посчитай общее число исходов, посчитай сколько из них тебе подходят, подели одно на другое. Но у этой простоты есть жёсткое условие, которое в учебниках прячут в одно слово, а в реальных данных оно нарушается почти всегда: все исходы должны быть равновозможными.
Разберёмся честно. Классическая формула $P(A) = m/n$ — это не «определение вероятности вообще», это определение вероятности в очень узком, идеализированном мире симметричных кубиков, честных монет и хорошо перемешанных урн. Внутри этого мира она работает безупречно и даёт нам всю вычислительную технику: комбинаторику, свойства вероятности, умение считать «хотя бы один». За пределами этого мира она начинает врать — и вместо неё придётся брать статистическое определение, а потом и аксиоматику Колмогорова, которая заменяет оба подхода.
В этом уроке мы пройдём весь путь: от формулы $m/n$ и её условий применимости через комбинаторику (правило произведения, перестановки, размещения, сочетания — и главное, как выбрать нужную формулу, а не угадывать) к классическим задачам про урны, кости и карты, а оттуда — к парадоксу дней рождения, коллизиям хешей, утечкам между train и test и вопросу «какова вероятность хотя бы одной ошибки на 100 предсказаниях». Всё это — одна и та же формула, просто в разных костюмах.
🎯 Ты узнаешь:
- Как устроена формула $P(A) = m/n$ и что именно в ней считается — исходы, а не «события вообще»
- Почему равновозможность исходов — сильнейшее допущение, которое на реальных данных нарушается чаще, чем кажется
- Всю комбинаторику, нужную для подсчёта $m$ и $n$: правило произведения, перестановки, размещения, сочетания — с ясным критерием выбора формулы
- Как решать классические задачи про урны, кости, карты и знаменитый парадокс дней рождения
- Почему статистическое определение спасает там, где классическое ломается, и как аксиоматика Колмогорова заменила их оба
История: откуда это взялось?
История теории вероятностей началась не в университете, а за игорным столом. В 1654 году французский аристократ и заядлый игрок шевалье де Мере обратился к Блезу Паскалю с двумя задачами. Первая: почему при бросании одного кубика четыре раза выпадение хотя бы одной шестёрки выгодно ставить, а при бросании двух кубиков 24 раза выпадение хотя бы одной пары шестёрок — уже невыгодно? Ведь пропорция та же: $4/6 = 24/36$. Вторая, более серьёзная — «задача о разделе ставки»: как справедливо поделить банк, если игру пришлось прервать досрочно, а игроки набрали разное число очков?
Паскаль начал переписку с Пьером Ферма, и летом-осенью 1654 года в нескольких письмах эти двое, по сути, изобрели дисциплину. Ключевая идея была именно та, которую мы сегодня называем классическим определением: разложить ситуацию на равновозможные элементарные исходы, пересчитать их, и вероятность — это доля благоприятных. Интуиция де Мере ошибалась потому, что он складывал вероятности вместо того, чтобы считать исходы: правильный ответ — $1 - (5/6)^4 \approx 0{,}518$ против $1 - (35/36)^{24} \approx 0{,}491$, то есть первая игра действительно чуть выгодна, а вторая чуть убыточна. Разница меньше трёх процентов — и де Мере нащупал её на практике за годы игры, но объяснить не мог.
Дальше формулу довели до канонического вида. Христиан Гюйгенс в 1657 году выпустил первый в истории учебник по вероятности — «De ratiociniis in ludo aleae». Якоб Бернулли в «Ars Conjectandi» (издано посмертно в 1713 году) добавил схему испытаний и закон больших чисел — мост между «сколько исходов благоприятны» и «как часто событие реально происходит». А формулировку, которую ты встретишь в любом учебнике, дал Пьер-Симон Лаплас в «Аналитической теории вероятностей» (1812): вероятность есть отношение числа благоприятных случаев к числу всех возможных случаев, «при условии, что все они равновозможны».
Вот эта оговорка Лапласа и стала трещиной, которая через сто лет обрушила всю конструкцию. Что значит «равновозможны»? Если определить это как «имеют равную вероятность», получается порочный круг: вероятность определяется через равновероятность. Математики XIX века спорили об этом десятилетиями, пока в 1933 году Андрей Николаевич Колмогоров в книге «Grundbegriffe der Wahrscheinlichkeitsrechnung» не разрубил узел: он вообще отказался определять, что такое вероятность, и вместо этого задал аксиомы — правила, которым она обязана подчиняться. Классическое определение при этом не выбросили: оно осталось как удобный частный случай, самый быстрый способ посчитать вероятность там, где симметрия действительно есть. Мы им и займёмся — но с полным пониманием границ.
Классическое определение: считаем исходы
Интуиция
Представь, что перед тобой лототрон с абсолютно одинаковыми шарами — одинаковый вес, размер, покрытие, всё. Отличаются только номера. Никакой физической причины, по которой один шар выпадал бы чаще другого, не существует. В такой ситуации ты можешь рассуждать чисто арифметически: если шаров 49, то каждый выпадает «в одну сорок девятую случаев». Если тебя интересует событие «выпал чётный номер», ты просто считаешь, сколько чётных номеров среди 49, и делишь.
Ключевое слово здесь — симметрия. Классическое определение работает не потому, что мы что-то измерили, а потому, что мы можем указать симметрию, из которой равенство шансов следует логически. Кубик симметричен относительно перестановки граней. Монета симметрична относительно переворота. Хорошо перемешанная колода симметрична относительно перестановки карт. Никаких экспериментов не нужно — достаточно посмотреть на устройство объекта.
Чтобы применить формулу, надо сначала аккуратно построить пространство элементарных исходов $\Omega$ — полный список того, чем эксперимент может закончиться, причём список должен быть таким, чтобы исходы были попарно несовместны (два сразу не бывает), исчерпывающи (что-то из списка обязательно случится) и равновозможны. Это самый ответственный шаг, и именно здесь совершается 90% ошибок: люди строят пространство исходов «как удобно», а не «как честно», и получают неверный ответ при абсолютно правильной арифметике.
Определение: Пусть эксперимент имеет конечное число $n$ элементарных исходов, которые попарно несовместны, образуют полную группу и равновозможны. Пусть событию $A$ благоприятствуют $m$ из этих исходов. Тогда вероятностью события $A$ называется число
$$P(A) = \frac{m}{n} = \frac{\text{число благоприятных исходов}}{\text{число всех исходов}}.$$
Обрати внимание на три требования в определении. Исходов конечное число — бесконечные случаи (например, «наугад выбрана точка отрезка») классическая формула не берёт вообще, там нужна геометрическая вероятность, это следующий урок. Исходы образуют полную группу и попарно несовместны — то есть ровно один из них обязательно реализуется. И исходы равновозможны — вот об это условие и разбиваются реальные задачи, ему мы посвятим отдельный большой раздел.
Примеры с разбором
Пример 1 (простой): игральный кубик, событие «выпало число больше 4»
Решение:
Шаг 1. Строим пространство исходов. Кубик может показать одну из шести граней:
$$\Omega = \{1,\,2,\,3,\,4,\,5,\,6\}, \qquad n = 6.$$Исходы несовместны (одновременно 3 и 5 не выпадет), исчерпывающи (что-то выпадет обязательно) и равновозможны — кубик правильный, грани симметричны.
Шаг 2. Выделяем благоприятные исходы. Событию $A = \{\text{выпало число больше 4}\}$ благоприятствуют исходы 5 и 6:
$$A = \{5,\,6\}, \qquad m = 2.$$Шаг 3. Применяем формулу.
$$P(A) = \frac{m}{n} = \frac{2}{6} = \frac{1}{3} \approx 0{,}333.$$Проверим наш ответ: событие «выпало число больше 4» — это ровно треть граней, и интуиция говорит то же самое. Сходится.
Ответ: $P(A) = 1/3 \approx 0{,}333$.
Пример 2 (средний): два кубика, событие «сумма очков равна 7»
Здесь начинается самое интересное: как именно строить $\Omega$.
Решение:
Шаг 1. Выбираем правильное пространство исходов. Соблазн такой: «сумма может быть от 2 до 12, значит $n = 11$». Это грубая ошибка — суммы не равновозможны. Сумму 2 даёт единственная комбинация $(1,1)$, а сумму 7 — целых шесть комбинаций. Правильное пространство исходов — упорядоченные пары «что на первом кубике, что на втором»:
$$\Omega = \{(i,\,j) : i,\,j \in \{1,\dots,6\}\}.$$По правилу произведения (о нём подробно ниже) $n = 6 \cdot 6 = 36$, и вот эти 36 пар действительно равновозможны: кубики независимы и каждый симметричен.
Шаг 2. Перечисляем благоприятные исходы. Сумма 7 получается при парах:
- $(1,\,6)$
- $(2,\,5)$
- $(3,\,4)$
- $(4,\,3)$
- $(5,\,2)$
- $(6,\,1)$
Итого $m = 6$. Пары $(3,4)$ и $(4,3)$ — разные исходы, потому что кубики различимы (представь, что один красный, другой синий).
Шаг 3. Считаем.
$$P(A) = \frac{6}{36} = \frac{1}{6} \approx 0{,}167.$$Ответ: $P = 1/6 \approx 0{,}167$. Кстати, 7 — самая вероятная сумма при двух кубиках, именно поэтому она играет особую роль в настольных играх.
Пример 3 (сложный): в урне 6 белых и 4 чёрных шара, вынимают наугад 3 шара. Какова вероятность, что ровно 2 из них белые?
Решение:
Шаг 1. Определяем структуру эксперимента. Достаём 3 шара из 10, порядок доставания нас не интересует (нам важен только состав тройки), возврата нет. Значит, элементарный исход — это неупорядоченный набор из 3 шаров, а число таких наборов считается сочетаниями:
$$n = C_{10}^{3} = \frac{10 \cdot 9 \cdot 8}{3 \cdot 2 \cdot 1} = 120.$$Все 120 троек равновозможны — шары одинаковы на ощупь, перемешаны, тянем вслепую.
Шаг 2. Считаем благоприятные исходы. Нужно выбрать 2 белых из 6 и 1 чёрный из 4. Это независимые выборы, значит их числа перемножаются:
$$m = C_{6}^{2} \cdot C_{4}^{1} = \frac{6 \cdot 5}{2} \cdot 4 = 15 \cdot 4 = 60.$$Шаг 3. Делим.
$$P(A) = \frac{60}{120} = \frac{1}{2} = 0{,}5.$$Проверим наш ответ через полную группу. Посчитаем все четыре варианта — 3 белых, 2 белых, 1 белый, 0 белых:
- 3 белых: $C_6^3 \cdot C_4^0 = 20 \cdot 1 = 20$
- 2 белых: $C_6^2 \cdot C_4^1 = 15 \cdot 4 = 60$
- 1 белый: $C_6^1 \cdot C_4^2 = 6 \cdot 6 = 36$
- 0 белых: $C_6^0 \cdot C_4^3 = 1 \cdot 4 = 4$
Сумма: $20 + 60 + 36 + 4 = 120$ — ровно $n$. Значит, разбиение на случаи полное и мы ничего не потеряли.
Ответ: $P = 0{,}5$.
Почему это важно
Классическое определение — это первый в твоей жизни инструмент, который превращает неопределённость в число, не проводя ни одного эксперимента. В ML этот навык нужен постоянно, но не в лоб: почти никогда ты не будешь считать вероятность того, что модель ошибётся, «по формуле $m/n$». Зато ты будешь постоянно считать размеры пространств: сколько всего конфигураций перебирает grid search, сколько существует вариантов разбиения выборки, сколько уникальных хешей помещается в таблицу, сколько пар объектов надо сравнить при поиске дубликатов. Это ровно та же арифметика подсчёта исходов — и она напрямую превращается в часы вычислений и рубли за GPU.
И ещё важнее — навык честно строить $\Omega$. Ошибка «суммы двух кубиков равновозможны» в ML выглядит так: «у меня бинарная классификация, значит базовая вероятность 50%». Или так: «я случайно разбил данные, значит train и test независимы». Оба утверждения ложны, и оба рушат проект тихо, без единого исключения в логах.
Равновозможность: условие, которое ломается чаще всего
Интуиция
Слово «равновозможные» в определении выглядит безобидной технической деталью — вроде «пусть функция непрерывна». На деле это самое сильное допущение во всей конструкции, и держится оно на очень тонком основании.
Классический способ его обосновать — принцип недостаточного основания (Лаплас; позже Кейнс переназвал его принципом безразличия): если у нас нет никаких причин считать один исход более вероятным, чем другой, будем считать их равновозможными. Звучит разумно ровно до того момента, пока не начинаешь применять. Проблема в том, что «нет причин считать иначе» — это утверждение не о мире, а о нашем незнании. Незнание не создаёт симметрию.
Представь, что тебе показали незнакомую урну и сказали: внутри белые и чёрные шары. Какова вероятность вытащить белый? Принцип безразличия шепчет «одна вторая» — ведь мы ничего не знаем. Но соотношение может быть 1:99. Наше незнание пропорции не делает пропорцию равной 50/50 — оно делает наш ответ бессмысленным. Классическая формула тут просто неприменима: она требует не «мы не знаем», а «мы знаем, что симметрично».
Есть и более коварная разновидность ошибки — когда исходы можно разбить по-разному, и разные разбиения дают разные ответы. Бросаем две монеты. Сколько выпало орлов? Варианты: 0, 1, 2. Три исхода — значит, каждый по $1/3$? Нет: правильное пространство — это четыре пары ОО, ОР, РО, РР, и «ровно один орёл» получается в двух случаях из четырёх, то есть $1/2$, а не $1/3$. Именно на этой ошибке в XVIII веке спотыкался даже Даламбер — он всерьёз утверждал, что вероятность выпадения хотя бы одного орла при двух бросках равна $2/3$, а не $3/4$.
Определение: Исходы называются равновозможными, если существует содержательная причина (обычно — симметрия эксперимента или устройства объекта), из которой следует, что ни один из них не имеет преимущества перед другими. Отсутствие информации о различиях само по себе равновозможности не даёт.
Как проверить равновозможность на практике
Вот рабочий чек-лист. Задай себе три вопроса:
-
Есть ли физическая или логическая симметрия? Если исходы получаются друг из друга перестановкой одинаковых объектов (грани кубика, шары в урне, карты в колоде) — да. Если нет — вероятнее всего, равновозможности нет.
-
Не схлопнул ли я несколько исходов в один? Самая частая техническая ошибка: пространство исходов строят по «результату» (сумма, количество, категория), а не по «первичному событию». Сумма двух кубиков, число орлов, «класс объекта» — это уже агрегаты, они почти никогда не равновозможны.
-
Не подменил ли я знание незнанием? Фраза «мы же не знаем, значит 50 на 50» — красный флаг. Незнание — повод собирать данные, а не повод объявлять равновероятность.
Примеры с разбором
Пример 4 (простой): «Завтра либо пойдёт дождь, либо нет — значит, вероятность дождя 0,5». Где ошибка?
Решение:
Шаг 1. Пространство исходов построено верно: $\Omega = \{\text{дождь, не дождь}\}$, они несовместны и исчерпывающи, $n = 2$.
Шаг 2. Но третье условие — равновозможность — не выполнено и ничем не обосновано. Нет никакой симметрии между «дождь» и «не дождь»: это не грани кубика, их нельзя переставить местами, ничего не изменив. В Каире вероятность дождя в июле около нуля, в Черапунджи в июле — почти единица.
Шаг 3. Вывод: классическая формула здесь неприменима вообще. Вероятность дождя оценивается статистически — по частоте дождливых дней в этом месте в это время года, или физической моделью атмосферы.
Ответ: ошибка в том, что из «двух исходов» выведена «равновозможность». Количество исходов ничего не говорит об их вероятностях.
Пример 5 (средний): в датасете для кредитного скоринга 2% дефолтов. Можно ли сказать, что вероятность дефолта случайно взятого клиента равна 0,5, раз исходов два?
Решение:
Шаг 1. Смотрим на структуру. Событий действительно два: «дефолт» / «не дефолт». Но элементарный исход эксперимента «выбрали случайного клиента из базы» — это не «дефолт или нет», это конкретный клиент. Если в базе 100 000 клиентов и мы берём одного равновероятно, то $n = 100\,000$, и вот эти сто тысяч исходов действительно равновозможны (случайный выбор мы организовали сами — это и есть источник симметрии).
Шаг 2. Считаем благоприятные. Дефолтов $2\%$ от $100\,000$, то есть $m = 2000$.
Шаг 3. Применяем формулу.
$$P(\text{дефолт}) = \frac{2000}{100\,000} = 0{,}02.$$Шаг 4. Что пошло бы не так при наивном ответе 0,5. Модель, которая всегда говорит «не дефолт», имела бы accuracy $98\%$. Если ты ждёшь базовый уровень $50\%$, ты сочтёшь это блестящим результатом. На деле это ноль полезной работы: полнота (recall) по классу дефолтов равна нулю, ни один проблемный клиент не пойман.
Ответ: $P = 0{,}02$. Классическая формула применима — но только если правильно выбрать элементарным исходом клиента, а не класс.
Пример 6 (сложный): токенизация и «равновозможные токены»
Есть соблазн рассуждать так: у языковой модели словарь из $50\,000$ токенов, значит вероятность угадать следующий токен наугад равна $1/50\,000$, и перплексия случайной модели равна $50\,000$. Разберём, где это верно, а где нет.
Решение:
Шаг 1. Где рассуждение корректно. Если модель действительно выбирает токен равномерно — то есть присваивает каждому вероятность $1/50\,000$, — то вероятность угадать конкретный правильный токен равна $1/50\,000$, а перплексия такой модели равна ровно $50\,000$. Это честное применение классической формулы: $n = 50\,000$ исходов, $m = 1$ благоприятный.
Шаг 2. Где рассуждение ломается. Реальные токены в тексте распределены крайне неравномерно. Токен-пробел или частица «the» встречаются в сотни тысяч раз чаще, чем редкий технический термин. Распределение частот подчиняется закону Ципфа — резко убывающему степенному закону.
Шаг 3. Численная иллюстрация. Возьмём условно упрощённую модель: пусть 100 самых частых токенов покрывают $50\%$ всего текста. Тогда вероятность того, что случайно взятый токен из корпуса окажется одним из этих ста, равна $0{,}5$, а не $100/50\,000 = 0{,}002$. Разница в 250 раз.
Шаг 4. Практический вывод. Даже тривиальная модель, которая всегда предсказывает наиболее частый токен, даёт точность на порядки выше «случайной». Именно поэтому перплексия настоящих моделей ($\approx 10{-}30$) сравнивается не с $50\,000$, а с перплексией юниграммной модели, которая учитывает реальные частоты (обычно несколько сотен).
Ответ: равномерность по словарю — это допущение о модели, а не факт о языке. При переходе к реальным данным равновозможность исчезает, и остаётся только частотная (статистическая) оценка.
Почему это важно
Почти каждый серьёзный провал ML-проекта, который выглядит как «модель хорошо училась, но в проде не работает», при вскрытии оказывается нарушением какой-нибудь неявной равновозможности:
-
Дисбаланс классов. Ты неявно ждёшь, что классы примерно поровну — а их 1:99. Accuracy становится бесполезной метрикой, нужны precision, recall, ROC-AUC, PR-AUC.
-
Sampling bias. Ты думаешь, что собрал «случайную выборку пользователей», а на деле собрал тех, кто дошёл до конца анкеты — то есть более мотивированных. Исходы не равновозможны, выборка смещена.
-
Утечка между train и test. Ты думаешь, что случайное разбиение делает части независимыми — а в данных есть дубликаты, или несколько строк на одного пользователя, или временна́я зависимость. Тогда «случайное» разбиение вовсе не даёт равновозможных сценариев для честной оценки.
-
Covariate shift. Обучающее распределение было одно, продовое — другое. Формально: пространство исходов поменялось между экспериментами, а мы продолжаем считать по старому.
Именно поэтому равновозможность стоит воспринимать как гипотезу, требующую обоснования, а не как настройку по умолчанию.
Свойства вероятности
Интуиция
Из формулы $P(A) = m/n$ несколько свойств вылезают буквально автоматически, потому что $m$ — это количество, а количества не бывают отрицательными и не бывают больше целого. Но эти свойства настолько важны, что позже Колмогоров возведёт их (точнее, их обобщения) в ранг аксиом — и вся современная теория будет строиться уже на них, а не на подсчёте исходов.
Представь вероятность как долю пирога. Всё пространство исходов — целый пирог, его доля равна 1. Любое событие — какой-то кусок. Кусок не может быть отрицательным и не может быть больше целого пирога. Пустой кусок — это ноль. А «всё, кроме этого куска» — это единица минус кусок. Вот и все свойства.
Свойства вероятности (следствия классического определения):
Ограниченность: $0 \le P(A) \le 1$ для любого события $A$. Потому что $0 \le m \le n$.
Достоверное событие: $P(\Omega) = 1$. Достоверному событию благоприятствуют все исходы, $m = n$.
Невозможное событие: $P(\varnothing) = 0$. Невозможному не благоприятствует ни один исход, $m = 0$.
Противоположное событие: $P(\bar{A}) = 1 - P(A)$. Если событию $A$ благоприятствуют $m$ исходов, то $\bar{A}$ благоприятствуют оставшиеся $n - m$, и $P(\bar{A}) = (n-m)/n = 1 - m/n$.
Монотонность: если $A \subseteq B$, то $P(A) \le P(B)$. Более широкому событию благоприятствует не меньше исходов.
Свойство 4 — переход к противоположному событию — самый эксплуатируемый приём во всей теории вероятностей. Всякий раз, когда в условии есть слова «хотя бы один», первым делом думай о дополнении: «хотя бы один» — это отрицание «ни одного», а «ни одного» считается в разы проще.
Примеры с разбором
Пример 7 (простой): вероятность того, что при броске кубика не выпадет шестёрка
Решение:
Шаг 1. Пусть $A = \{\text{выпала шестёрка}\}$, тогда $P(A) = 1/6$.
Шаг 2. Интересующее нас событие — противоположное: $\bar{A} = \{\text{шестёрка не выпала}\}$.
Шаг 3. По свойству 4:
$$P(\bar{A}) = 1 - \frac{1}{6} = \frac{5}{6} \approx 0{,}833.$$Проверим напрямую: благоприятны исходы 1, 2, 3, 4, 5 — их пять, $5/6$. Сходится.
Ответ: $5/6 \approx 0{,}833$.
Пример 8 (средний): модель ошибается с вероятностью 1% на каждом объекте независимо. Какова вероятность, что на 100 предсказаниях будет хотя бы одна ошибка?
Это, пожалуй, самая практически полезная задача во всём уроке.
Решение:
Шаг 1. Переходим к противоположному. Прямой подсчёт «хотя бы одна ошибка» потребовал бы суммировать вероятности ровно одной, ровно двух, ..., ровно ста ошибок. Вместо этого:
$$P(\text{хотя бы одна ошибка}) = 1 - P(\text{ни одной ошибки}).$$Шаг 2. Считаем «ни одной». Каждое предсказание верно с вероятностью $0{,}99$, предсказания независимы, значит все 100 верны с вероятностью
$$0{,}99^{100}.$$Шаг 3. Вычисляем. Используем $\ln 0{,}99 \approx -0{,}0100503$:
$$0{,}99^{100} = e^{100 \cdot (-0{,}0100503)} = e^{-1{,}00503} \approx 0{,}3660.$$Шаг 4. Финальный ответ.
$$P = 1 - 0{,}3660 = 0{,}6340.$$Практический смысл. Модель с точностью 99% на каждом объекте ошибается хотя бы раз в 63% пакетов по 100 объектов. Если этот пакет — суточная выгрузка платежей, то «ошибка раз в двое суток» звучит совсем иначе, чем «точность 99%». Полезное общее правило: если $p$ мало, то
$$1 - (1-p)^n \approx 1 - e^{-np} \approx np \quad \text{при } np \ll 1,$$то есть при малых вероятностях число ошибок примерно $np$, а вероятность «хотя бы одной» растёт почти линейно — пока не подойдёт к единице.
Ответ: $\approx 0{,}634$.
Пример 9 (сложный): свойства как инструмент проверки собственных вычислений
Ты посчитал вероятности четырёх взаимоисключающих сценариев работы рекомендательной системы и получил: $0{,}31$; $0{,}44$; $0{,}18$; $0{,}09$. Что можно сказать, не зная задачи?
Решение:
Шаг 1. Проверяем ограниченность. Все четыре числа лежат в $[0;1]$ — формальное требование выполнено.
Шаг 2. Проверяем полноту группы. Если сценарии взаимоисключающие и покрывают все возможности, их сумма обязана равняться 1:
$$0{,}31 + 0{,}44 + 0{,}18 + 0{,}09 = 1{,}02.$$Шаг 3. Вывод. Сумма больше единицы — значит, где-то ошибка. Варианты: либо сценарии на самом деле пересекаются (какой-то исход посчитан дважды), либо в одном из вычислений арифметическая ошибка, либо сценарии не взаимоисключающие и суммировать их вообще нельзя.
Шаг 4. Обратная ситуация. Если бы сумма была, скажем, $0{,}93$, это означало бы, что забыт какой-то сценарий на $7\%$ — тоже сигнал тревоги. Такая проверка стоит десять секунд и ловит огромную долю ошибок.
Ответ: набор некорректен, сумма $1{,}02 > 1$ нарушает свойства вероятности.
Почему это важно
В ML эти свойства — не формальность, а инструмент отладки, который работает каждый день. Выход softmax обязан суммироваться в единицу — если у тебя после кастомной постобработки сумма 1,03, ты сломал распределение. Калибровочная кривая обязана лежать в квадрате $[0;1]^2$. Оценка вероятности класса, вылезшая за границы, — верный признак того, что ты применил линейную регрессию там, где нужна логистическая. А правило «хотя бы один» — это тот самый расчёт, который отвечает на вопросы «как часто наш пайплайн упадёт хотя бы на одном файле из тысячи» и «сколько раз в неделю сработает ложное срабатывание при таком пороге».
Комбинаторика: как вообще посчитать $m$ и $n$
Формула $P(A) = m/n$ обманчиво проста, потому что вся реальная работа спрятана в подсчёте $m$ и $n$. Считать вручную можно, пока исходов десяток. Когда их миллионы, нужна комбинаторика. Разберём четыре инструмента: правило произведения, перестановки, размещения и сочетания — и, главное, критерий выбора между ними.
Правило произведения — фундамент всего
Интуиция. Ты собираешь конфигурацию из нескольких независимых решений. Первое решение — 4 варианта, второе — 3, третье — 5. Каждый вариант первого решения сочетается с каждым вариантом второго и каждым вариантом третьего. Дерево ветвится: сначала 4 ветки, из каждой по 3, из каждой по 5. Всего листьев $4 \cdot 3 \cdot 5 = 60$.
Правило произведения: если выбор состоит из $k$ последовательных шагов, причём на первом шаге есть $n_1$ вариантов, на втором $n_2$ (независимо от первого), ..., на $k$-м $n_k$, то общее число различных результатов равно
$$N = n_1 \cdot n_2 \cdot \ldots \cdot n_k.$$
Отсюда сразу же следует формула для выборки с возвратом с учётом порядка: если каждый из $k$ раз выбираем из одних и тех же $n$ объектов, то результатов $n^k$.
Пример 10 (простой→средний): сколько обучений запускает grid search?
Ты подбираешь гиперпараметры градиентного бустинга:
learning_rate: 0,01 / 0,05 / 0,1 / 0,3 — 4 значенияmax_depth: 3 / 5 / 7 — 3 значенияn_estimators: 100 / 300 / 500 / 1000 / 2000 — 5 значенийsubsample: 0,7 / 1,0 — 2 значения
Решение:
Шаг 1. Каждая конфигурация — это независимый выбор по каждому параметру, значит работает чистое правило произведения:
$$N = 4 \cdot 3 \cdot 5 \cdot 2 = 120 \text{ конфигураций}.$$Шаг 2. Добавим кросс-валидацию. При 5-fold CV каждая конфигурация обучается 5 раз:
$$120 \cdot 5 = 600 \text{ обучений модели}.$$Шаг 3. Переведём в часы. Пусть одно обучение занимает 90 секунд:
$$600 \cdot 90 = 54\,000 \text{ с} = 15 \text{ часов}.$$Шаг 4. Что будет, если добавить ещё один параметр. Добавили colsample_bytree с 3 значениями — и всё умножилось на 3: $360$ конфигураций, $1800$ обучений, 45 часов. Вот она, комбинаторный взрыв: линейное добавление параметров даёт мультипликативный рост перебора.
Ответ: 120 конфигураций, 600 обучений, ≈15 часов. И именно поэтому существует random search: вместо полного перебора берут $N$ случайных точек сетки, и, как мы посчитаем в заданиях, 60 случайных точек с вероятностью $\approx 95\%$ попадают в лучшие 5% конфигураций.
Перестановки: переставляем всё
Интуиция. У тебя $n$ различных объектов, и ты выкладываешь их в ряд — все до единого. На первое место $n$ кандидатов, на второе $n-1$ (один уже занят), на третье $n-2$, и так далее. По правилу произведения получается факториал.
Определение: Перестановкой из $n$ различных элементов называется любой упорядоченный набор, содержащий все эти элементы. Число перестановок:
$$P_n = n! = 1 \cdot 2 \cdot 3 \cdot \ldots \cdot n, \qquad 0! = 1.$$
Факториал растёт чудовищно быстро: $5! = 120$, $10! = 3\,628\,800$, $20! \approx 2{,}43 \cdot 10^{18}$, $70!$ уже больше числа атомов в наблюдаемой Вселенной. Это надо чувствовать физически: перебор всех перестановок практически никогда не является алгоритмом.
Пример 11 (средний): в каком порядке подавать признаки?
У тебя 8 признаков, и ты хочешь протестировать все возможные порядки их добавления в модель при жадном отборе (forward selection).
Решение:
Шаг 1. Число упорядоченных наборов всех 8 признаков:
$$P_8 = 8! = 40\,320.$$Шаг 2. Оценим стоимость. Полный жадный отбор для каждого порядка требует 8 обучений, итого $40\,320 \cdot 8 = 322\,560$ обучений. Если одно занимает 2 секунды — это больше 7 суток непрерывного счёта.
Шаг 3. Что делают на практике. Жадный отбор потому и жадный, что он не перебирает порядки: он на каждом шаге добавляет лучший из оставшихся признаков. Это $8 + 7 + 6 + \ldots + 1 = 36$ обучений вместо 322 560. Цена — не гарантируется глобальный оптимум.
Ответ: $8! = 40\,320$ порядков; полный перебор нереалистичен, поэтому используется жадная стратегия.
Размещения: выбираем часть, порядок важен
Интуиция. Теперь ты берёшь не все объекты, а только $k$ из $n$, и тебе важно, кто на каком месте. На первое место $n$ кандидатов, на второе $n-1$, ..., на $k$-е $n-k+1$. Перемножаем — получается «урезанный факториал».
Определение: Размещением из $n$ элементов по $k$ называется упорядоченный набор из $k$ различных элементов, выбранных из данных $n$. Число размещений:
$$A_n^k = n (n-1)(n-2)\cdots(n-k+1) = \frac{n!}{(n-k)!}.$$
Заметь: при $k = n$ размещения превращаются в перестановки, $A_n^n = n!/0! = n!$. Перестановки — частный случай размещений.
Пример 12 (средний): топ-3 модели
На соревновании 12 команд. Сколькими способами могут распределиться первое, второе и третье места?
Решение:
Шаг 1. Порядок важен (золото ≠ серебро), повторов нет (одна команда не займёт два места), выбираем 3 из 12. Это размещения:
$$A_{12}^{3} = 12 \cdot 11 \cdot 10 = 1320.$$Шаг 2. Вероятностное продолжение. Если считать все распределения равновозможными (что, конечно, неправда для реального соревнования, но пусть), то вероятность конкретного пьедестала — $1/1320 \approx 0{,}00076$.
Шаг 3. А если бы порядок был не важен? Тогда речь шла бы о «тройке призёров без указания мест», и ответом были бы сочетания: $C_{12}^3 = 220$ — ровно в $3! = 6$ раз меньше, потому что каждую тройку можно упорядочить шестью способами.
Ответ: $A_{12}^3 = 1320$.
Сочетания: выбираем часть, порядок не важен
Интуиция. Ты формируешь команду, а не очередь. «Аня, Боря, Вера» — это та же команда, что и «Вера, Аня, Боря». Значит, из числа размещений надо убрать дублирование: каждый набор из $k$ элементов был посчитан $k!$ раз (по числу его внутренних перестановок). Делим:
Определение: Сочетанием из $n$ элементов по $k$ называется неупорядоченный набор (подмножество) из $k$ различных элементов, выбранных из $n$. Число сочетаний:
$$C_n^k = \frac{A_n^k}{k!} = \frac{n!}{k!\,(n-k)!}.$$Обозначается также $\binom{n}{k}$ и читается «це из эн по ка» (или «эн choose ка»).
Полезные свойства, которые экономят время:
- $C_n^0 = C_n^n = 1$ — пустое подмножество одно, и полное одно
- $C_n^1 = n$
- $C_n^k = C_n^{n-k}$ — выбрать $k$ «внутрь» это то же, что выбрать $n-k$ «наружу». Практично: $C_{50}^{48} = C_{50}^{2} = 1225$, считать в такой форме несравнимо легче
- $C_n^k = C_{n-1}^{k-1} + C_{n-1}^{k}$ — рекуррентность треугольника Паскаля
- $\sum_{k=0}^{n} C_n^k = 2^n$ — всего подмножеств $n$-элементного множества
Пример 13 (сложный): сколько существует подмножеств признаков?
У тебя 20 признаков. Сколько существует непустых подмножеств признаков, и сколько подмножеств ровно из 5 признаков?
Решение:
Шаг 1. Всего подмножеств. Каждый признак либо входит в набор, либо нет — 2 варианта, 20 независимых решений, правило произведения:
$$2^{20} = 1\,048\,576.$$Непустых — на одно меньше: $1\,048\,575$.
Шаг 2. Ровно 5 признаков. Порядок признаков в модели не важен (модели всё равно, в каком порядке ты перечислил колонки), повторов нет. Значит, сочетания:
$$C_{20}^{5} = \frac{20 \cdot 19 \cdot 18 \cdot 17 \cdot 16}{5 \cdot 4 \cdot 3 \cdot 2 \cdot 1}.$$Считаем числитель по шагам: $20 \cdot 19 = 380$; $380 \cdot 18 = 6840$; $6840 \cdot 17 = 116\,280$; $116\,280 \cdot 16 = 1\,860\,480$. Знаменатель $5! = 120$.
$$C_{20}^{5} = \frac{1\,860\,480}{120} = 15\,504.$$Шаг 3. Проверим через симметрию. $C_{20}^{5} = C_{20}^{15}$ — и правда, выбрать 5 «оставить» это то же, что выбрать 15 «выбросить».
Шаг 4. Вероятностный вопрос. Если случайно выбрать подмножество из 5 признаков, какова вероятность, что оно содержит оба самых важных признака (пусть их два)? Благоприятных наборов: оба важных внутри плюс 3 любых из оставшихся 18:
$$m = C_{18}^{3} = \frac{18 \cdot 17 \cdot 16}{6} = 816.$$$$P = \frac{816}{15\,504} = \frac{51}{969} = \frac{1}{19} \approx 0{,}0526.$$
Проверим сокращение: $15\,504 / 816 = 19$ ровно. Да, $P = 1/19$.
Ответ: $2^{20} - 1 = 1\,048\,575$ непустых подмножеств; $C_{20}^5 = 15\,504$ пятёрок; вероятность попадания обоих ключевых признаков $= 1/19 \approx 5{,}3\%$.
Как выбрать формулу: два вопроса и таблица
Вот тот самый критерий, который решает 95% всех затруднений. Задай себе ровно два вопроса.
Вопрос 1: важен ли порядок? Формулировка-подсказка: если поменять элементы местами — получится другой результат или тот же самый? «Пароль», «пьедестал», «последовательность», «расстановка», «код» — порядок важен. «Команда», «комитет», «подмножество», «набор», «сколько способов выбрать» — порядок не важен.
Вопрос 2: с возвратом или без? Может ли один и тот же объект попасть в результат дважды? «Пароль из цифр» — да, цифры повторяются. «Тянем шары не возвращая» — нет. «Бросаем кубик 3 раза» — по сути с возвратом: шестёрка может выпасть трижды.
Таблица выбора — выбор $k$ элементов из $n$:
| Порядок важен | Порядок не важен | |
|---|---|---|
| С возвратом | $n^k$ | $C_{n+k-1}^{k}$ (сочетания с повторениями) |
| Без возврата | $A_n^k = \dfrac{n!}{(n-k)!}$ | $C_n^k = \dfrac{n!}{k!(n-k)!}$ |
Три из четырёх клеток встречаются постоянно, четвёртая (сочетания с повторениями) — редко, но знать о ней полезно: именно она считает, сколькими способами разложить $k$ одинаковых объектов по $n$ ящикам.
Пример 14 (комплексный): одна ситуация — четыре формулы
Есть 5 разных серверов, надо выбрать 3 для запуска задач. Сколько вариантов в каждой из четырёх трактовок?
Решение:
Вариант А: порядок важен, с возвратом. Задачи запускаются последовательно, каждая на любом сервере, один сервер может взять несколько задач, задачи различимы:
$$5^3 = 125.$$Вариант Б: порядок важен, без возврата. Задачи различимы, но на одном сервере не больше одной:
$$A_5^3 = 5 \cdot 4 \cdot 3 = 60.$$Вариант В: порядок не важен, без возврата. Просто выбираем тройку серверов «которые будут задействованы»:
$$C_5^3 = \frac{5 \cdot 4 \cdot 3}{6} = 10.$$Вариант Г: порядок не важен, с возвратом. Задачи одинаковые (три неразличимых задания), распределяем по 5 серверам, сервер может получить несколько:
$$C_{5+3-1}^{3} = C_7^3 = \frac{7 \cdot 6 \cdot 5}{6} = 35.$$Проверка логики: $C_5^3 = 10 \le A_5^3 = 60 \le 5^3 = 125$ — учёт порядка увеличивает счёт в $3! = 6$ раз, разрешение повторов ещё увеличивает. А $C_7^3 = 35$ лежит между 10 и 125 — тоже согласуется. Все четыре ответа разные, и разница огромна: 125 против 10, в 12,5 раз. Вот почему два вопроса надо задавать всегда.
Ответ: 125 / 60 / 10 / 35 соответственно.
Почему это важно
Комбинаторика в ML — это не украшение, а прямая арифметика ресурсов:
-
Размер пространства поиска. Grid search, архитектурный поиск (NAS), перебор порогов — всё это правило произведения. Понимание, что добавление одного параметра умножает время, а не прибавляет, спасает недели GPU-времени.
-
Число пар. Поиск дубликатов, построение матрицы попарных сходств, contrastive learning — везде фигурирует $C_n^2 = n(n-1)/2$. Для миллиона объектов это $5 \cdot 10^{11}$ пар, и наивный подход мгновенно упирается в физику. Отсюда растут ANN-индексы вроде HNSW и FAISS.
-
Число возможных разбиений. Сколько существует способов разделить выборку на train/test — $C_n^k$. Кросс-валидация выбирает из них всего несколько.
-
Ёмкость и переобучение. Число различных «разметок» $n$ точек классификатором (функция роста, размерность Вапника–Червоненкиса) считается ровно этими же суммами сочетаний.
Классические задачи: урны, кости, карты, дни рождения
Четыре сюжета, на которых выросла вся теория вероятностей. Они кажутся игрушечными — но каждый из них является моделью совершенно реальной ML-задачи. Урны — это выборка без возврата (стратификация, разбиение данных). Кости — независимые повторения (ошибки модели в пакете). Карты — выбор структурированных подмножеств. Дни рождения — коллизии хешей и парадокс «совпадения случаются чаще, чем кажется».
Урны: модель выборки без возврата
Пример 15 (средний): в урне 4 белых и 6 чёрных шаров. Вынимают 3 шара. Какова вероятность, что среди них есть хотя бы один белый?
Решение:
Шаг 1. Переходим к противоположному. «Хотя бы один белый» = НЕ «ни одного белого» = НЕ «все три чёрные».
Шаг 2. Считаем общее число исходов. Тройки шаров, порядок не важен, без возврата:
$$n = C_{10}^{3} = \frac{10 \cdot 9 \cdot 8}{6} = 120.$$Шаг 3. Считаем «все чёрные». Выбираем 3 чёрных из 6:
$$m_0 = C_{6}^{3} = \frac{6 \cdot 5 \cdot 4}{6} = 20.$$$$P(\text{все чёрные}) = \frac{20}{120} = \frac{1}{6}.$$
Шаг 4. Возвращаемся.
$$P(\text{хотя бы один белый}) = 1 - \frac{1}{6} = \frac{5}{6} \approx 0{,}833.$$Проверим другим путём: посчитаем напрямую сумму «ровно 1», «ровно 2», «ровно 3» белых:
- ровно 1: $C_4^1 C_6^2 = 4 \cdot 15 = 60$
- ровно 2: $C_4^2 C_6^1 = 6 \cdot 6 = 36$
- ровно 3: $C_4^3 C_6^0 = 4 \cdot 1 = 4$
Сумма $60 + 36 + 4 = 100$, и $100/120 = 5/6$. Сходится идеально.
Ответ: $5/6 \approx 0{,}833$.
ML-перевод. Ровно эта задача возникает при разбиении данных. Если у тебя в датасете 10 объектов редкого класса из 1000 и ты отправляешь в тест 200 случайных объектов, то «попадёт ли в тест хотя бы один редкий» считается точно так же — только числа больше. И ответ там сильно менее оптимистичный, чем хочется: мы посчитаем его в заданиях.
Кости: модель независимых повторений
Пример 16 (средний): три кубика. Вероятность, что выпадет хотя бы одна шестёрка
Решение:
Шаг 1. Пространство исходов. Упорядоченные тройки $(i,j,k)$, каждый от 1 до 6, с повторениями, порядок важен (кубики различимы):
$$n = 6^3 = 216.$$Шаг 2. Противоположное событие. «Ни одной шестёрки» — каждый кубик показывает что-то из $\{1,\dots,5\}$:
$$m_0 = 5^3 = 125.$$Шаг 3. Считаем.
$$P(\text{ни одной шестёрки}) = \frac{125}{216} \approx 0{,}5787.$$$$P(\text{хотя бы одна}) = 1 - \frac{125}{216} = \frac{91}{216} \approx 0{,}4213.$$
Шаг 4. Заодно проверим интуицию де Мере. Он рассуждал: «одна шестёрка бывает в $1/6$ случаев, значит при трёх бросках $3/6 = 1/2$». Получилось бы $0{,}5$ вместо $0{,}4213$ — ошибка почти на 8 процентных пунктов. При шести бросках его логика дала бы $6/6 = 1$ («шестёрка обязательно выпадет»), тогда как на самом деле $1 - (5/6)^6 \approx 0{,}665$. Вероятности не складываются при повторениях — именно этот урок Паскаль и объяснил игроку.
Ответ: $91/216 \approx 0{,}421$.
Карты: структурированный выбор
Пример 17 (сложный): из колоды в 36 карт вынимают 4 карты. Какова вероятность, что все четыре одной масти?
Решение:
Шаг 1. Общее число исходов. Четвёрки карт, порядок не важен, без возврата:
$$n = C_{36}^{4} = \frac{36 \cdot 35 \cdot 34 \cdot 33}{4 \cdot 3 \cdot 2 \cdot 1}.$$Считаем числитель: $36 \cdot 35 = 1260$; $1260 \cdot 34 = 42\,840$; $42\,840 \cdot 33 = 1\,413\,720$. Знаменатель $24$.
$$n = \frac{1\,413\,720}{24} = 58\,905.$$Шаг 2. Благоприятные исходы. Сначала выбираем масть — 4 способа. В масти 9 карт, из них выбираем 4:
$$C_{9}^{4} = \frac{9 \cdot 8 \cdot 7 \cdot 6}{24} = \frac{3024}{24} = 126.$$По правилу произведения:
$$m = 4 \cdot 126 = 504.$$Шаг 3. Делим и сокращаем.
$$P = \frac{504}{58\,905}.$$Сократим: и числитель, и знаменатель делятся на 9 — $504/9 = 56$, $58\,905/9 = 6545$. Далее $6545 = 5 \cdot 7 \cdot 11 \cdot 17$, а $56 = 7 \cdot 8$, делим на 7:
$$P = \frac{8}{935} \approx 0{,}00856.$$Проверим порядок величины: примерно один случай из 117. Для четырёх карт одной масти из девяти в масти — правдоподобно.
Ответ: $8/935 \approx 0{,}0086$, то есть около $0{,}86\%$.
Парадокс дней рождения: почему совпадения происходят так рано
Интуиция. Спроси у кого угодно: сколько человек нужно собрать в комнате, чтобы с вероятностью более 50% у двоих совпали дни рождения? Типичный ответ — «человек 180, половина от 365». Правильный ответ — 23. Это не подвох и не парадокс в логическом смысле, а сбой интуиции: люди мысленно считают совпадения со мной, а надо считать совпадения между любыми двумя.
Ключ — в числе пар. Среди 23 человек пар не 23, а
$$C_{23}^{2} = \frac{23 \cdot 22}{2} = 253.$$Двести пятьдесят три шанса на совпадение — при таком количестве попыток удивляться уже нечему.
Пример 18 (сложный): вывод формулы и расчёт для 23 человек
Решение:
Шаг 1. Пространство исходов. Считаем год в 365 дней, дни рождения равновозможны и независимы. У каждого из $k$ человек день рождения — один из 365, порядок важен (люди различимы), с повторениями:
$$n = 365^k.$$Шаг 2. Противоположное событие — все дни рождения разные. Первому доступны все 365 дней, второму — 364 (день первого занят), третьему — 363, и так далее. Это размещения:
$$m_0 = 365 \cdot 364 \cdot \ldots \cdot (365 - k + 1) = A_{365}^{k}.$$Шаг 3. Формула.
$$P(\text{все разные}) = \frac{A_{365}^{k}}{365^k} = \prod_{i=1}^{k-1}\left(1 - \frac{i}{365}\right),$$$$P(\text{есть совпадение}) = 1 - \prod_{i=1}^{k-1}\left(1 - \frac{i}{365}\right).$$
Шаг 4. Считаем для $k = 23$. Логарифмируем произведение и используем $\ln(1-x) \approx -x - x^2/2 - x^3/3$:
$$\sum_{i=1}^{22} \frac{i}{365} = \frac{253}{365} = 0{,}69315,$$$$\sum_{i=1}^{22} \frac{i^2}{2 \cdot 365^2} = \frac{3795}{266\,450} = 0{,}01424,$$
$$\sum_{i=1}^{22} \frac{i^3}{3 \cdot 365^3} = \frac{64\,009}{145\,881\,375} = 0{,}00044.$$
Итого $\ln P(\text{все разные}) \approx -(0{,}69315 + 0{,}01424 + 0{,}00044) = -0{,}70783$, откуда
$$P(\text{все разные}) = e^{-0{,}70783} \approx 0{,}4927,$$$$P(\text{совпадение}) \approx 1 - 0{,}4927 = 0{,}5073.$$
Шаг 5. Проверим границу. Для $k = 22$ аналогичный расчёт даёт $P \approx 0{,}4757 < 0{,}5$. Значит, 23 — действительно минимальное число людей, при котором вероятность совпадения превышает половину.
Шаг 6. Удобное приближение. Поскольку $1 - x \approx e^{-x}$:
$$P(\text{совпадение}) \approx 1 - \exp\!\left(-\frac{k(k-1)}{2 \cdot 365}\right).$$Для $k = 23$: $\exp(-253/365) = \exp(-0{,}6932) = 0{,}5000$, значит $P \approx 0{,}5000$ — приближение отличается от точного значения на треть процента и вполне годится для прикидок.
Ответ: $P(23) \approx 0{,}5073$; минимальное $k$, при котором вероятность превышает $1/2$, равно 23.
Дни рождения → коллизии хешей
А теперь замени «365 дней» на «$N$ корзин хеш-таблицы», а «людей» — на «объекты, которые ты хешируешь». Формула не меняется ни на символ:
$$P(\text{хотя бы одна коллизия}) \approx 1 - \exp\!\left(-\frac{k(k-1)}{2N}\right) \approx 1 - \exp\!\left(-\frac{k^2}{2N}\right).$$Главное следствие, которое стоит выучить наизусть: коллизии начинаются на $\sqrt{N}$ объектах, а не на $N$. Это называется «birthday bound» и это фундаментальный факт и для структур данных, и для криптографии.
Что это значит на практике:
-
32-битный хеш ($N = 2^{32} \approx 4{,}3 \cdot 10^9$): коллизии становятся вероятными уже около $\sqrt{N} \approx 65\,000$ объектов. Если ты дедуплицируешь миллион документов по 32-битному хешу — коллизии гарантированы, и ты молча выбросишь непохожие документы как «дубликаты».
-
64-битный хеш ($N \approx 1{,}8 \cdot 10^{19}$): порог около $4 \cdot 10^9$ объектов. Для большинства задач достаточно.
-
128-битный (MD5): порог $\approx 2 \cdot 10^{19}$ — по коллизиям дней рождения безопасно, но MD5 давно взломан по другим причинам, для безопасности не годится.
-
Hashing trick в ML (feature hashing): признаки хешируются в вектор фиксированной длины $N$. Если признаков $k$ и $k^2/(2N)$ не мало́ — часть признаков склеится в одну координату. Это не всегда катастрофа (модель часто переживает), но знать об этом обязательно: при $N = 2^{18} = 262\,144$ и $k = 10\,000$ признаках вероятность хотя бы одной коллизии $\approx 1 - \exp(-10^8/524\,288) \approx 1$, то есть коллизии точно есть, а ожидаемое их число $\approx 191$.
Почему это важно
Все четыре сюжета — это шаблоны, которые ты будешь узнавать в чужих задачах:
-
Урна — любая выборка без возврата: разбиение train/test, отбор подмножества признаков, семплирование из конечной базы.
-
Кости — независимые повторения: $n$ предсказаний, $n$ запросов к сервису, $n$ прогонов A/B-теста.
-
Карты — структурированный выбор с ограничениями внутри групп: стратифицированное семплирование, батчи с квотами по классам.
-
Дни рождения — квадратичный рост числа пар: коллизии хешей, ложные срабатывания при попарном сравнении, «проклятие множественных сравнений» в статистике.
Статистическое определение: когда исходы неравновозможны
Интуиция
Классическая формула требует симметрии. А если её нет? Кнопка «купить» на сайте: пользователь либо нажмёт, либо нет. Никакой симметрии, кубик не бросишь. Что делать?
Ответ, к которому пришли ещё в XVII веке (первым его систематически применил Джон Граунт, анализируя лондонские бюллетени смертности в 1662 году): измерять. Проведи эксперимент много раз и посмотри, с какой частотой событие происходит.
Определение: Пусть эксперимент повторён $N$ раз, и событие $A$ произошло $N_A$ раз. Величина
$$W(A) = \frac{N_A}{N}$$называется относительной частотой (частостью) события $A$. Статистической вероятностью события $A$ называют число, около которого стабилизируется относительная частота при неограниченном увеличении числа испытаний.
Ключевое наблюдение, обосновывающее это определение, называется статистической устойчивостью: при росте $N$ частота $N_A/N$ перестаёт скакать и оседает возле некоторого числа. Это не аксиома и не тавтология — это эмпирический факт, который потом получил строгое объяснение в законе больших чисел Бернулли (урок 242).
Знаменитые проверки: Жорж Бюффон в XVIII веке бросил монету 4040 раз и получил 2048 гербов — частота $0{,}5069$. Карл Пирсон бросил 24 000 раз и получил 12 012 гербов — частота $0{,}5005$. Английский математик Джон Керрич, сидя в датском лагере для интернированных во время Второй мировой, бросил монету 10 000 раз и получил 5067 гербов — $0{,}5067$. Все три близки к $0{,}5$, и точность растёт с числом бросков.
Пример 19 (средний): CTR баннера
Баннер показали 50 000 раз, кликнули 640 раз. Какова вероятность клика?
Решение:
Шаг 1. Классическое определение неприменимо. Исходов два («клик» / «не клик»), но они очевидно не равновозможны и никакой симметрии между ними нет.
Шаг 2. Применяем статистическое определение.
$$W = \frac{640}{50\,000} = 0{,}0128 = 1{,}28\%.$$Шаг 3. Насколько мы уверены? Оценка частоты сама случайна. Грубая оценка её разброса (стандартная ошибка доли):
$$\sigma \approx \sqrt{\frac{p(1-p)}{N}} = \sqrt{\frac{0{,}0128 \cdot 0{,}9872}{50\,000}} = \sqrt{\frac{0{,}012636}{50\,000}} = \sqrt{2{,}527 \cdot 10^{-7}} \approx 0{,}000503.$$То есть примерный интервал $1{,}28\% \pm 0{,}10\%$ (два стандартных отклонения). Подробно этим займётся урок 246.
Шаг 4. Практический вывод. Если конкурирующий баннер дал CTR $1{,}31\%$, разница лежит внутри погрешности — говорить о победе рано.
Ответ: $P \approx 0{,}0128$ с погрешностью около $\pm 0{,}001$.
Где статистическое определение тоже спотыкается
Оно не всесильно. Три проблемы:
-
Эксперимент должен быть повторяемым в неизменных условиях. «Вероятность того, что этот стартап взлетит» измерить нельзя — стартап один и запустить его 10 000 раз невозможно.
-
Оно опирается на предельный переход, который нельзя выполнить. Мы никогда не сделаем «бесконечное число испытаний»; «число, около которого стабилизируется частота» — это описание, а не математическое определение.
-
Условия обязаны быть стационарными. Если аудитория сайта поменялась, старый CTR — уже не оценка новой вероятности. В ML это ровно то, что называется data drift.
Для ML первый и третий пункты критичны: почти любая продовая модель живёт в нестационарном мире. Отсюда — мониторинг дрейфа, регулярное переобучение и обязательная валидация «по времени», а не только случайная.
Аксиоматика Колмогорова: современная замена обоим определениям
К началу XX века накопилась неловкая ситуация. Классическое определение опиралось на неопределимую «равновозможность» и не работало с бесконечными пространствами. Статистическое определение опиралось на предел, который нельзя вычислить, и на повторяемость, которой часто нет. Обе конструкции работали на практике и обе были логически дырявыми.
В 1933 году Андрей Николаевич Колмогоров предложил радикальный ход: перестать спрашивать, что такое вероятность, и вместо этого перечислить, каким правилам она подчиняется. Ровно так же, как геометрия не определяет, что такое «точка» — она задаёт аксиомы, которым точки и прямые обязаны удовлетворять.
Аксиоматика Колмогорова. Вероятностное пространство — это тройка $(\Omega, \mathcal{F}, P)$, где:
$\Omega$ — множество элементарных исходов (произвольное, не обязательно конечное);
$\mathcal{F}$ — совокупность подмножеств $\Omega$ (событий), замкнутая относительно дополнения и счётных объединений ($\sigma$-алгебра);
$P: \mathcal{F} \to \mathbb{R}$ — функция, удовлетворяющая трём аксиомам:
A1 (неотрицательность): $P(A) \ge 0$ для любого $A \in \mathcal{F}$.
A2 (нормировка): $P(\Omega) = 1$.
A3 (счётная аддитивность): если $A_1, A_2, \dots$ попарно несовместны, то $P\left(\bigcup_{i} A_i\right) = \sum_{i} P(A_i)$.
И всё. Три строчки. Из них выводится абсолютно всё: и $P(\varnothing) = 0$, и $P(\bar A) = 1 - P(A)$, и $0 \le P(A) \le 1$, и теоремы сложения и умножения, и формула Байеса, и центральная предельная теорема.
Как в эту схему укладываются оба старых определения:
-
Классическое — это частный случай, где $\Omega$ конечно и $P(\{\omega\}) = 1/n$ для каждого исхода. Аксиомы проверяются мгновенно, и формула $P(A) = m/n$ становится теоремой, а не определением.
-
Статистическое — это не определение вероятности, а способ её оценивать. Закон больших чисел (следствие аксиом) гарантирует, что частота сходится к вероятности — то есть аксиоматика объясняет, почему измерение вообще работает.
-
Геометрическая вероятность (урок 228) — тоже частный случай: $\Omega$ бесконечно, а $P$ задаётся через отношение мер (длин, площадей, объёмов).
Пример 20 (концептуальный): зачем ML-инженеру $\sigma$-алгебра?
Честный ответ: в 99% повседневной работы — незачем, хватает интуиции. Но есть места, где отсутствие аксиоматики буквально ломает код и рассуждения:
Шаг 1. Непрерывные распределения. Вероятность того, что нормально распределённая величина равна ровно $0{,}5$, равна нулю — хотя это событие возможно. В классическом определении такого не бывает ($m = 0$ означало бы невозможность). Только аксиоматика позволяет иметь «возможные события нулевой вероятности» и объясняет, почему плотность вероятности может быть больше единицы.
Шаг 2. Условные вероятности и фильтрации. Когда ты работаешь с временны́ми рядами и говоришь «модель на момент $t$ видит только прошлое», формально это условие измеримости относительно $\sigma$-алгебры $\mathcal{F}_t$. Нарушил — получил look-ahead bias, то есть самую дорогую ошибку в финансовом ML.
Шаг 3. Меры и интегралы. Матожидание $\mathbb{E}[X] = \int_\Omega X \, dP$ определено именно как интеграл по вероятностной мере. Все функции потерь, которые ты минимизируешь, — это оценки таких интегралов по выборке.
Ответ: аксиоматика не нужна для написания цикла обучения, но необходима, как только ты переходишь к непрерывным величинам, условным ожиданиям и строгим гарантиям — то есть ко всему, что отличает инженера от человека, вызывающего fit().
Почему это важно
Аксиоматический подход даёт то, чего не давали оба предыдущих: проверяемость. Ты больше не споришь о том, «равновозможны ли исходы» — ты явно указываешь вероятностную модель и дальше проверяешь, соответствуют ли ей данные. Именно так устроен современный ML: сначала предположение о распределении (модель), потом оценка параметров по данным, потом проверка адекватности. Классическое определение остаётся в этой схеме удобным вычислительным приёмом там, где симметрия действительно есть — и не более того.
Практика: 30 заданий
Базовые (задания 1-10)
Задание 1: Бросают правильный игральный кубик. Найди вероятность того, что выпало чётное число очков.
Задание 2: В урне 7 белых и 3 чёрных шара. Вынимают один шар. Какова вероятность, что он белый?
Задание 3: Из колоды в 36 карт наугад вынимают одну карту. Найди вероятность того, что это туз.
Задание 4: Монету бросают три раза. Какова вероятность, что орёл выпадет ровно два раза?
Задание 5: Наугад выбирают одно число из множества $\{1, 2, \dots, 20\}$. Найди вероятность того, что оно делится на 3.
Задание 6: В датасете по оттоку клиентов доля ушедших составляет 0,17. Какова вероятность того, что случайно выбранный клиент НЕ ушёл?
Задание 7: Бросают два игральных кубика. Найди вероятность того, что сумма выпавших очков равна 7.
Задание 8: Grid search перебирает learning_rate (4 значения), max_depth (3 значения) и n_estimators (5 значений). Сколько всего конфигураций? Сколько обучений модели произойдёт при 5-fold кросс-валидации?
Задание 9: Сколькими способами можно упорядочить 5 признаков по важности (все 5 различимы, ранги не повторяются)?
Задание 10: Из 10 признаков нужно выбрать 3 для простой модели. Сколькими способами это можно сделать?
Средние (задания 11-20)
Задание 11: В урне 5 белых и 4 чёрных шара. Наугад вынимают 3 шара. Найди вероятность того, что все три белые.
Задание 12: В той же урне (5 белых, 4 чёрных) вынимают 3 шара. Найди вероятность того, что ровно два из них белые.
Задание 13: Из колоды в 36 карт вынимают 3 карты. Какова вероятность, что среди них есть хотя бы один туз?
Задание 14: В комнате 10 человек. Какова вероятность, что хотя бы у двоих совпадают дни рождения? (Год — 365 дней, дни рождения равновозможны и независимы.)
Задание 15: Ты хешируешь 1000 объектов в хеш-таблицу с $10^6$ корзинами (хеш-функция равномерная). Какова вероятность хотя бы одной коллизии?
Задание 16: Модель ошибается на каждом объекте независимо с вероятностью 0,01. Какова вероятность, что при 100 предсказаниях будет хотя бы одна ошибка? А при 500?
Задание 17: В датасете из 1000 строк одна строка случайно продублирована (есть две идентичные строки). Данные случайно делят на train (800) и test (200). Какова вероятность, что копии окажутся в разных частях (то есть произойдёт утечка)?
Задание 18: На соревновании 8 моделей. Сколькими способами могут распределиться первые три места (золото, серебро, бронза)?
Задание 19: Бросают три игральных кубика. Какова вероятность того, что все три выпавших числа различны?
Задание 20: В датасете 1000 объектов, из них 10 принадлежат редкому классу. Ты берёшь случайную выборку из 50 объектов. Какова вероятность, что в ней не окажется ни одного объекта редкого класса?
Продвинутые (задания 21-30)
Задание 21: Докажи расчётом, что 23 — минимальное число людей, при котором вероятность совпадения дней рождения превышает 0,5. Вычисли вероятность для 22 и для 23 человек.
Задание 22: Сколько объектов можно захешировать 32-битным хешем, чтобы вероятность хотя бы одной коллизии не превышала 1%?
Задание 23: В урне 10 шаров, из них 3 красных. Вынимают 2 шара: (а) без возврата, (б) с возвратом. Найди в обоих случаях вероятность того, что оба шара красные, и объясни разницу.
Задание 24: Из стандартной колоды в 52 карты сдают 5 карт. Найди вероятность получить флеш (все пять карт одной масти).
Задание 25: Бросают три игральных кубика. Найди вероятность того, что сумма выпавших очков равна 10.
Задание 26: Пять объектов были случайно перемешаны и каждому наугад приписана метка (одна из пяти, без повторов). Какова вероятность того, что ни один объект не получил свою правильную метку?
Задание 27: Бутстрэп: из выборки размера $n = 1000$ случайно с возвратом берут 1000 объектов. Какова вероятность, что конкретный объект НЕ попадёт в бутстрэп-выборку? Какая доля объектов в среднем остаётся «за бортом» (out-of-bag)?
Задание 28: Random search выбирает 60 случайных конфигураций из большой сетки гиперпараметров. Какова вероятность, что хотя бы одна из них попадёт в лучшие 5% всех конфигураций?
Задание 29: В датасете 1000 объектов, из них 20 позитивных (2%). Данные случайно делят на train (800) и test (200) без стратификации. Какова вероятность, что в тесте не окажется ни одного позитивного объекта?
Задание 30: Ты дедуплицируешь 100 000 документов, сравнивая их 32-битные хеши. Какова вероятность хотя бы одной ложной склейки (коллизии)? Сколько коллизий ожидается в среднем?
Частые ошибки
❌ Ошибка 1: «Исходов два — значит, по 50%»
Неправильно: «Модель либо угадает, либо нет. Значит, случайное угадывание даёт 50%». Или: «Завтра либо будет дождь, либо нет — вероятность 0,5».
Правильно: количество исходов ничего не говорит об их вероятностях. Классическая формула требует равновозможности, а она следует только из симметрии эксперимента. При дисбалансе классов 1:99 «случайное угадывание» по факту даёт accuracy 0,99 (если всегда отвечать мажоритарным классом), а не 0,5.
Почему важно: это ошибка стоимостью в целый проект. Ты объявляешь модель с accuracy 0,97 «отличной», а базовый уровень — 0,98. Всегда считай долю мажоритарного класса первым делом, до того как посмотришь на метрику модели.
❌ Ошибка 2: неправильно построенное пространство элементарных исходов
Неправильно: «Сумма двух кубиков — от 2 до 12, значит 11 исходов, и вероятность семёрки равна $1/11$». Или: «Бросили две монеты, орлов может быть 0, 1 или 2 — значит, вероятность одного орла $1/3$».
Правильно: элементарные исходы должны быть равновозможными, а агрегаты (суммы, количества, категории) равновозможными почти никогда не бывают. Правильные пространства: 36 упорядоченных пар для кубиков, 4 последовательности для монет. Тогда $P(\text{сумма }7) = 6/36 = 1/6$ и $P(\text{один орёл}) = 2/4 = 1/2$.
Почему важно: это ровно та ошибка, на которой спотыкался Даламбер. Правило простое: строй пространство исходов по первичным различимым результатам эксперимента, а не по интересующей тебя величине. Пометь объекты мысленно (красный кубик и синий) — если после пометки исходы «разъехались», значит, ты их неправомерно склеил.
❌ Ошибка 3: путаница сочетаний и размещений
Неправильно: «Из 10 признаков выбираем 3 — это $10 \cdot 9 \cdot 8 = 720$ способов».
Правильно: 720 — это $A_{10}^3$, число упорядоченных троек. Набор признаков — множество, порядок в нём не важен, поэтому надо делить на $3! = 6$: $C_{10}^3 = 120$.
Почему важно: ошибка в $k!$ раз — это не мелочь: при $k = 5$ ты промахнёшься в 120 раз. Проверочный вопрос на каждый случай: «если поменять два выбранных элемента местами — это другой результат?» Другой — размещения, тот же самый — сочетания.
❌ Ошибка 4: сложение вероятностей вместо перехода к дополнению
Неправильно: «Вероятность ошибки на одном объекте 1%. На 100 объектах вероятность ошибки $100 \cdot 1\% = 100\%$». Или де-мереевское «шестёрка при четырёх бросках: $4 \cdot 1/6 = 2/3$».
Правильно: для «хотя бы одного» переходи к противоположному:
$$P(\text{хотя бы один}) = 1 - (1-p)^n.$$Для $p = 0{,}01$, $n = 100$ это $1 - 0{,}99^{100} = 0{,}634$, а не 1. Для шестёрки: $1 - (5/6)^4 = 0{,}518$, а не $0{,}667$.
Почему важно: сложение работает только для несовместных событий, а «ошибка на первом объекте» и «ошибка на втором» прекрасно совместимы. При $np \ll 1$ приближение $np$ годится, но при $np$ порядка единицы оно уже сильно завышает, а при $np > 1$ даёт бессмысленные значения больше единицы — что само по себе сигнал, что формула применена неверно.
❌ Ошибка 5: игнорирование парадокса дней рождения при выборе размера хеша
Неправильно: «У меня 32-битный хеш, это 4 миллиарда значений, а объектов всего миллион — коллизий не будет».
Правильно: коллизии начинаются на $\sqrt{N}$, а не на $N$. Для $N = 2^{32}$ это $\approx 65\,000$ объектов. При миллионе объектов ожидаемое число коллизий $\approx \dfrac{10^{12}/2}{4{,}29 \cdot 10^{9}} \approx 116$, и вероятность хотя бы одной равна практически единице.
Почему важно: ошибка тихая. Дедупликация «сработала», логи чистые, а из корпуса молча выпали сотни уникальных документов. Правило: нужный размер хеша считай как $N \gg k^2$, а не $N \gg k$.
❌ Ошибка 6: считать, что случайное разбиение автоматически даёт честную оценку
Неправильно: «Я вызвал train_test_split с random_state=42, значит train и test независимы».
Правильно: случайность разбиения не устраняет зависимости, которые уже есть в данных. Дубликаты, несколько строк на одного пользователя, временна́я структура, признаки, посчитанные по всему датасету до разбиения, — всё это протекает через любое случайное разбиение. Мы посчитали: при одной паре дубликатов вероятность утечки $\approx 0{,}32$, при пятидесяти парах — практически единица.
Почему важно: утечка даёт завышенные метрики на валидации и провал в проде — самый дорогой и самый частый способ обмануть самого себя в ML. Дедуплицируй, группируй (GroupKFold), разбивай по времени, считай признаки только по train.
Главное запомнить
-
Классическое определение: $P(A) = \dfrac{m}{n}$, где $n$ — число всех элементарных исходов, $m$ — число благоприятных. Работает только при конечном числе равновозможных исходов.
-
Равновозможность — это допущение, требующее обоснования (обычно симметрия эксперимента). «Мы не знаем, поэтому поровну» — не обоснование, а ошибка.
-
Правильное пространство исходов важнее арифметики. Строй $\Omega$ по первичным различимым результатам, а не по агрегатам (суммам, количествам, классам).
-
Свойства: $0 \le P(A) \le 1$; $P(\Omega) = 1$; $P(\varnothing) = 0$; $P(\bar A) = 1 - P(A)$; из $A \subseteq B$ следует $P(A) \le P(B)$. Сумма вероятностей полной группы несовместных событий равна 1 — используй это для проверки расчётов.
-
«Хотя бы один» всегда считай через дополнение: $P = 1 - (1-p)^n$. Складывать вероятности повторений нельзя.
-
Правило произведения: $N = n_1 n_2 \cdots n_k$. Добавление гиперпараметра умножает время перебора, а не прибавляет.
-
Четыре формулы выбора $k$ из $n$: с возвратом и с порядком — $n^k$; без возврата и с порядком — $A_n^k = \dfrac{n!}{(n-k)!}$; без возврата и без порядка — $C_n^k = \dfrac{n!}{k!(n-k)!}$; с возвратом и без порядка — $C_{n+k-1}^{k}$.
-
Критерий выбора формулы — два вопроса: важен ли порядок и возможны ли повторы. Отвечай на них письменно, прежде чем писать формулу.
-
Парадокс дней рождения: совпадения начинаются на $\sqrt{N}$, потому что число пар растёт как $k^2/2$. Отсюда — 23 человека на 365 дней и жёсткие требования к размеру хеша: нужно $N \gg k^2$.
-
Статистическое определение ($W = N_A/N$) спасает, когда симметрии нет, но требует повторяемости и стационарности условий. Аксиоматика Колмогорова (A1 неотрицательность, A2 нормировка, A3 счётная аддитивность) заменяет оба определения и делает обоих частными случаями.
Связь с другими темами курса
Что было до этого урока. В уроке 226 «Случайные события» ты разобрал сам язык: пространство элементарных исходов, события как подмножества, операции над ними — сумма, произведение, дополнение, несовместность, полная группа. Сегодняшний урок добавил к этому языку число: научился приписывать событиям вероятности и считать их. Комбинаторика, которую мы прошли, опирается на школьную технику работы с факториалами и на понятие функции.
Что будет дальше.
-
Урок 228 «Геометрическая вероятность» — что делать, когда исходов бесконечно много и посчитать их нельзя. Отношение количеств заменяется отношением длин, площадей и объёмов. Там же — задача о встрече и знаменитая игла Бюффона.
-
Урок 229 «Теоремы сложения и умножения» — как считать вероятность объединения и пересечения событий, формула включений-исключений, независимость. Мы сегодня пользовались независимостью интуитивно («предсказания независимы»), там она получит строгое определение.
-
Урок 230 «Условная вероятность» — $P(A \mid B)$, то, без чего в ML невозможно вообще ничего: любая модель классификации оценивает именно условную вероятность класса при данных признаках.
-
Уроки 231-232 «Формула полной вероятности» и «Формула Байеса» — как перевернуть условную вероятность и почему тест с точностью 99% на редкую болезнь даёт больше ложных тревог, чем настоящих находок.
-
Урок 233 «Схема Бернулли» — обобщение всех наших расчётов вида $1 - (1-p)^n$: полное распределение числа успехов в $n$ независимых испытаниях, биномиальные коэффициенты $C_n^k$ в главной роли.
-
Уроки 241-242 «ЦПТ» и «Закон больших чисел» — строгое обоснование статистического определения: почему частота действительно сходится к вероятности и с какой скоростью.
-
Урок 255 «Хеш-таблицы» — там расчёт коллизий, который мы сделали сегодня, превратится в анализ сложности операций и в выбор коэффициента заполнения.
Где применяется в ML и в жизни.
-
Оценка качества моделей. Базовый уровень (доля мажоритарного класса), выбор метрики при дисбалансе, доверительные интервалы для accuracy, статистическая значимость разницы между моделями.
-
Планирование экспериментов. Размер пространства гиперпараметров, выбор между grid search и random search, оценка бюджета GPU-времени.
-
Валидация. Стратификация, обнаружение утечек, оценка риска пустого фолда, дедупликация до разбиения.
-
Инфраструктура. Выбор разрядности хеша, feature hashing, вероятностные структуры данных (фильтр Блума, HyperLogLog, MinHash) — все они построены на этих же формулах.
-
Надёжность систем. «Вероятность хотя бы одного отказа» при $n$ независимых компонентах, планирование SLA, оценка частоты алертов при заданном пороге.
Интересные факты
💡 Теория вероятностей родилась из вопроса игрока — и её основатель считал азартные игры делом недостойным. Паскаль, разобравшийся в задачах шевалье де Мере в 1654 году, уже через несколько месяцев пережил религиозное обращение и почти полностью оставил математику. Дисциплина, которая сегодня лежит в основе страхования, медицины и машинного обучения, возникла у него как побочный продукт краткого увлечения.
💡 Ошибка де Мере составляла всего 2,7 процентных пункта — и он нащупал её вживую. Игра «хотя бы одна шестёрка за 4 броска» выигрывается с вероятностью $0{,}5177$, а «хотя бы одна пара шестёрок за 24 броска двумя кубиками» — с вероятностью $0{,}4914$. Разница между ними меньше трёх процентов, но де Мере играл столько, что заметил её эмпирически, задолго до того, как кто-либо смог объяснить причину. Это, по сути, первая в истории задокументированная оценка вероятности «по большим данным».
💡 Джон Керрич бросил монету 10 000 раз, сидя в лагере для интернированных. Английский математик оказался в Дании в момент немецкого вторжения 1940 года и провёл войну в лагере. Чтобы не терять форму, он вместе с сокамерником поставил серию экспериментов по проверке статистической устойчивости: 10 000 бросков дали 5067 гербов, частота $0{,}5067$. Его данные до сих пор перепечатывают в учебниках.
💡 Парадокс дней рождения сломал не одну систему безопасности. «Атака дней рождения» — стандартный приём криптоанализа: чтобы найти коллизию хеша длины $b$ бит, нужно не $2^b$ попыток, а всего $2^{b/2}$. Именно поэтому 64-битные хеши считаются криптографически непригодными, а требования к длине подписи всегда указывают удвоенный запас относительно желаемой стойкости.
💡 Аксиоматика Колмогорова уместилась в книжку на 62 страницы. «Grundbegriffe der Wahrscheinlichkeitsrechnung» (1933) — тонкая брошюра, которая закрыла спор длиной в двести лет и сделала теорию вероятностей полноценным разделом математики. Колмогорову было 30 лет.
💡 Random search победил grid search статьёй на 25 страниц. Работа Бергстра и Бенджио «Random Search for Hyper-Parameter Optimization» (2012) содержит ровно тот расчёт, который мы сделали в задании 28: 60 случайных точек с вероятностью 95% попадают в лучший 5% объём — независимо от размерности сетки. Этот аргумент изменил стандартную практику подбора гиперпараметров во всей индустрии.
Лайфхаки и полезные трюки
1. Перед любой задачей письменно отвечай на два вопроса
«Важен ли порядок?» и «Возможны ли повторы?». Два ответа однозначно определяют формулу по таблице $2 \times 2$. Секунд десять времени — и ты не перепутаешь $C_n^k$ с $A_n^k$ никогда. Формулировки-маркеры: «пароль, код, последовательность, пьедестал, расстановка» — порядок важен; «команда, набор, подмножество, комитет, выборка» — не важен.
2. Ищи в условии слова «хотя бы» — это команда перейти к дополнению
«Хотя бы один», «не менее одного», «встречается» — сразу пиши $P = 1 - P(\text{ни одного})$. Прямой подсчёт почти всегда потребует суммировать десятки слагаемых, а через дополнение выйдет одна строка. Этот приём закрывает, по ощущениям, треть всех практических задач на вероятность.
3. Проверяй ответ суммой по полной группе
Разбей событие на все взаимоисключающие варианты и проверь, что их количества дают ровно $n$, а вероятности — ровно 1. Мы делали это дважды в уроке, и оба раза проверка занимала три строки. Она ловит и арифметические промахи, и логические (забытый случай, дважды посчитанный исход).
4. Пользуйся симметрией сочетаний, чтобы не считать лишнего
$C_n^k = C_n^{n-k}$. Считать $C_{100}^{97}$ в лоб — самоубийство, а $C_{100}^{3} = \dfrac{100 \cdot 99 \cdot 98}{6} = 161\,700$ — дело двадцати секунд. Всегда выбирай меньшее из $k$ и $n-k$.
5. Для «хотя бы одного» при малых $p$ применяй экспоненциальное приближение
$$1 - (1-p)^n \approx 1 - e^{-np}.$$Оно точно с погрешностью меньше процента уже при $p < 0{,}05$ и позволяет считать в уме: при $np = 0{,}1$ ответ $\approx 0{,}095$; при $np = 1$ ответ $\approx 0{,}63$; при $np = 3$ ответ $\approx 0{,}95$. Три опорные точки — и ты оцениваешь любые риски без калькулятора.
6. Считай коллизии по формуле $k^2/(2N)$ — это готовое «ожидаемое число совпадений»
Не вероятность, а именно среднее число коллизий: $\mathbb{E} = C_k^2/N \approx k^2/(2N)$. Если получилось много меньше единицы — коллизий, скорее всего, нет. Если порядка единицы — они уже есть. Если сильно больше — их десятки. Этот один множитель заменяет весь расчёт при выборе размера хеша, длины MinHash-подписи или размерности feature hashing.
7. Считай базовый уровень до того, как смотришь на метрику модели
Первая строка любого ноутбука после загрузки данных — y.value_counts(normalize=True). Доля мажоритарного класса и есть accuracy тривиальной модели. Пока ты не знаешь этого числа, любая метрика бессмысленна. При дисбалансе сразу переключайся на precision/recall, PR-AUC и матрицу ошибок.
8. Оценивай стоимость перебора до запуска, а не после
Перемножь число значений всех гиперпараметров, умножь на число фолдов, умножь на время одного обучения. Если получилось больше вечера — переходи на random search: как мы посчитали, 60 случайных точек дают 95% шанс попасть в лучшие 5% конфигураций независимо от размера сетки.
9. Проверяй свои формулы на маленьких числах, где ответ можно перечислить руками
Сомневаешься, нужно ли делить на $k!$? Возьми $n = 3$, $k = 2$ и выпиши все варианты на бумаге. Шесть упорядоченных пар против трёх неупорядоченных — и всё сразу становится ясно. Этот приём работает и для проверки кода: напиши функцию, прогони на игрушечном примере, сравни с ручным перечислением.
Заключение
Формула $P(A) = m/n$ — самая простая в теории вероятностей и одновременно самая коварная. Простая, потому что это просто деление. Коварная, потому что каждый раз, когда ты её пишешь, ты незаметно для себя утверждаешь: «все эти исходы равновозможны». В мире симметричных кубиков и перемешанных колод это утверждение истинно. В мире реальных данных — почти всегда ложно, и вся разница между инженером, который понимает свои модели, и человеком, который вызывает fit(), заключается ровно в привычке этот вопрос себе задавать.
Ты забрал из урока три вещи, и все три работают каждый день. Первая — умение честно строить пространство исходов: не по агрегатам, а по первичным результатам эксперимента. Вторая — комбинаторная техника, которая переводит «сколько вариантов» в конкретное число, а число — в часы GPU и рубли. Третья — приём «хотя бы один» через дополнение, который отвечает на самые практичные вопросы: как часто упадёт пайплайн, сколько будет ложных срабатываний, случится ли коллизия, найдётся ли редкий класс в тесте.
А дальше начинается самое интересное. В уроке 228 конечные исходы сменятся бесконечными, и вместо подсчёта появится измерение длин и площадей. Потом придут теоремы сложения и умножения, условная вероятность, формула Байеса — и внезапно окажется, что вся современная классификация, вся байесовская оптимизация и вся вероятностная интерпретация нейросетей выросли ровно из тех трёх аксиом, которые Колмогоров записал на одной странице в 1933 году. Ты уже стоишь у входа. Дальше — только интереснее. 🎲
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку