07 / 22 · Случайные величины
Функции от случайных величин
Если у X известное распределение, каково распределение g(X)? Суммирование по прообразам для счётных величин, метод функции распределения, формула замены переменных f_Y = f_X / |g′|, по которой вероятность сохраняется полоса за полосой, метод обратной функции (так симуляции и языковые модели получают случайные значения) и одномерный нормализующий поток.
На этой странице 11
Температура в градусах Цельсия пересчитывается в градусы Фаренгейта, измерение стандартизуется, логарифм цены потенцируется обратно в цену, равномерное случайное число превращается в показательное (экспоненциальное) время ожидания. Каждый раз случайная величина с известным распределением проходит через функцию , и вопрос в том, каково распределение . Для счётных величин ответ — сумма; для плотностей — формула замены переменных (change-of-variables formula), которая говорит, что вероятность сохраняется, а плотность при этом сжимается или растягивается. Та же формула, прочитанная в обратную сторону, — это способ, которым компьютеры получают случайные значения с любым распределением, и способ, которым нормализующие потоки (normalizing flows) вычисляют правдоподобие.
Обозначения. . Для обратимой через обозначен прообраз , а через — производная. и — плотности и функции распределения и .
Дискретный случай#
Если принимает не более чем счётное число значений, то и тоже, а происходит ровно тогда, когда попадает в одно из значений, которые переводит в :
Для честной кости и значение получается из и из , поэтому . Больше ничего не нужно: вероятности значений переносятся вместе с ними и складываются там, где значения сливаются.
Метод функции распределения#
Для непрерывной надёжный общий метод проходит через функцию распределения, потому что — событие, связанное с :
а плотность — производная полученной функции.
Квадрат. Пусть и . При условие означает — интервал длины из общей длины 2:
В половине случаев меньше , хотя — лишь четверть области значений; плотность в нуле бесконечна: там парабола плоская, и многие значения теснятся в немногих значениях .
Линейное отображение. Для с имеем , поэтому
и то же верно при . Применённая к с , , эта формула даёт плотность : это стандартизация , обещанная в предыдущей заметке. Верно и обратное: величина при нормальной нормальна, так что температура с распределением °C — это температура с распределением °F.
Формула замены переменных#
Для строго возрастающей дифференцируемой имеем , и дифференцирование сразу даёт плотность ; для убывающей производная меняет знак, что и учитывает модуль:
Формула говорит, что вероятность сохраняется полоса за полосой. Короткий интервал длины около несёт вероятность , а переводит его в интервал длины около , который должен нести ту же вероятность: . Где сжимает (), плотность растёт; где растягивает — падает:
Замена переменных: вероятность сохраняется, плотность меняется
Пример — логнормальное распределение (log-normal): у с производная и
Монотонные отображения переносят квантили, поэтому медиана равна , а . Величины, которые получаются как произведения многих положительных множителей, — доходы, размеры файлов, времена ответа — часто близки к логнормальным: их логарифм — сумма, близкая к нормальной по причинам, которые объясняет центральная предельная теорема.
Если не монотонна, вклад даёт каждый прообраз: . Для из примера выше два прообраза дают по , и в сумме получается та же .
Метод обратной функции#
Прочитанный в обратную сторону, метод функции распределения превращает равномерные случайные числа в числа с любым распределением. Если , а — непрерывная строго возрастающая функция распределения, то имеет функцию распределения , потому что
Для любой функции распределения, с горизонтальными участками или скачками, то же верно для квантильной функции из предыдущей заметки вместо : ровно тогда, когда , потому что не убывает и непрерывна справа. Дискретный сэмплер ниже — это и есть .
Для показательного распределения и :
Метод обратной функции: от равномерного u к показательному x
Та же идея годится и для сэмплирования из дискретного распределения. Для категориального распределения с вероятностями разрежем на идущие подряд отрезки длин и вернём номер отрезка, в который попало ; это один поиск по накопленным суммам. Языковая модель сэмплирует следующий токен именно так — после того как температура или top- преобразовали вероятности.
Обратное утверждение — интегральное преобразование вероятности (probability integral transform): если у непрерывная функция распределения , то . Так проверяют вероятностные прогнозы, поскольку значения , которые хорошо откалиброванный прогноз даёт в наблюдённых исходах, должны выглядеть равномерно распределёнными; по этой же причине p-значение теста, статистика которого при нулевой гипотезе имеет непрерывное распределение, распределено равномерно, когда эта гипотеза верна. Для дискретной статистики p-значение лишь супер-равномерно, : в двустороннем тесте для 100 бросков монеты из заметки о проверке гипотез честная монета даёт с вероятностью . Тест остаётся корректным, но консервативным.
Нормализующие потоки в одномерном случае#
Нормализующий поток моделирует сложную плотность как простую, пропущенную через цепочку обратимых отображений, с . Применив формулу замены переменных по одному разу к каждому отображению, получаем точный логарифм плотности в точке данных:
Обучение максимизирует этот логарифм правдоподобия по параметрам отображений. В размерности больше единицы производная превращается в определитель матрицы Якоби (якобиан), и как сделать этот определитель дешёвым в вычислении — задача конструирования, которой посвящена заметка о нормализующих потоках в курсе «Генеративные модели».
Что изменилось#
| До | С формулой замены переменных | |
|---|---|---|
| Распределение | симулировать и смотреть на гистограмму | точно: или через |
| Стандартизация нормального распределения | принималась на веру | доказана: |
| Сэмплирование из распределения | для каждого распределения нужен свой приём | для любой функции распределения; накопленные суммы для категориального |
| Плотность потока | — | точный логарифм правдоподобия, по одному на отображение |
Ограничения#
- не всегда выражается в замкнутом виде. Обратная к нормальной функции распределения не выражается через элементарные функции; сэмплеры используют другие преобразования (Бокса–Мюллера, которому нужны две величины) или численное обращение.
- Формуле нужна дифференцируемая, локально обратимая . Функция с горизонтальными участками, например округление или обрезка (clipping), сосредоточивает положительную вероятность в отдельных значениях, и тогда не является непрерывной: округление делает её дискретной, обрезка — смесью масс в точках и плотности.
- Для функций от нескольких величин нужно их совместное распределение. Распределение суммы или отношения двух случайных величин зависит от того, как они зависят друг от друга; это тема заметки о совместных распределениях.
Что нужно запомнить#
- Дискретный случай: — сумма по прообразам .
- Непрерывный случай в общем виде: вычислить , затем продифференцировать.
- Непрерывный случай, монотонная : при ; вероятность сохраняется, плотность сжимается или растягивается.
- Линейные отображения сохраняют нормальность; ; от нормальной величины имеет логнормальное распределение.
- , а в общем случае , имеет функцию распределения (метод обратной функции, inverse transform sampling); распределена равномерно, если непрерывна (интегральное преобразование вероятности).
Код#
Две полосы с рисунка, квадрат равномерной величины и метод обратной функции, проверенные численно:
import numpy as np
from scipy import stats
rng = np.random.default_rng(0)
Z = stats.norm()
# Y = e^X for X ~ N(0, 1): each band keeps its probability over an interval of a different length
for a, b in [(-1.2, -0.7), (0.8, 1.3)]:
p = Z.cdf(b) - Z.cdf(a)
print(round(p, 3), round(np.exp(b) - np.exp(a), 3), round(p / (np.exp(b) - np.exp(a)), 3))
# 0.127 0.195 0.649 (squeezed: high density)
# 0.115 1.444 0.08 (stretched: low density)
print(round(Z.sf(1), 4), stats.lognorm(1).median()) # 0.1587 1.0
# Y = X^2 for X ~ U(-1, 1): P(Y <= 1/4) = sqrt(1/4)
y = rng.uniform(-1, 1, 1_000_000) ** 2
print(round((y <= 0.25).mean(), 3)) # 0.5
# inverse transform: -ln(1 - U) is Exp(1)
u = np.array([0.1, 0.3, 0.5, 0.7, 0.9])
print((-np.log(1 - u)).round(3)) # [0.105 0.357 0.693 1.204 2.303]
x = -np.log(1 - rng.random(1_000_000))
print(round(x.mean(), 3), round((x > 2).mean(), 4)) # 1.0 0.1354; exactly 1 and e^-2 = 0.1353
# a categorical distribution sampled through cumulative sums, as for a next token
p = np.array([0.5, 0.3, 0.2])
k = np.searchsorted(np.cumsum(p), rng.random(1_000_000), side='right')
print((np.bincount(k) / 1_000_000).round(3)) # [0.499 0.301 0.199]
# the probability integral transform: F(X) is uniform
print(np.quantile(Z.cdf(rng.normal(size=1_000_000)), [0.1, 0.5, 0.9]).round(3)) # [0.1 0.499 0.9 ]
Дальше#
Распределение — это целая функция; часто для работы достаточно двух-трёх чисел: где его центр, насколько оно широкое, насколько тяжёлые у него хвосты. Следующая заметка определяет математическое ожидание и дисперсию, показывает, что математическое ожидание можно вычислить, вовсе не находя распределения , и выводит правило для средних из вводной заметки.
Литература#
- J. K. Blitzstein, J. Hwang. Introduction to Probability, 2nd ed. CRC Press, 2019. Глава 5 (универсальность равномерного распределения), глава 8 (преобразования, замена переменных).
- L. Devroye. Non-Uniform Random Variate Generation. Springer, 1986. Глава II (метод обратной функции).
- D. Rezende, S. Mohamed. Variational Inference with Normalizing Flows. ICML, 2015.