Содержание курса 07 / 22

07 / 22 · Случайные величины

Функции от случайных величин

Если у X известное распределение, каково распределение g(X)? Суммирование по прообразам для счётных величин, метод функции распределения, формула замены переменных f_Y = f_X / |g′|, по которой вероятность сохраняется полоса за полосой, метод обратной функции (так симуляции и языковые модели получают случайные значения) и одномерный нормализующий поток.

На этой странице 11

Температура в градусах Цельсия пересчитывается в градусы Фаренгейта, измерение стандартизуется, логарифм цены потенцируется обратно в цену, равномерное случайное число превращается в показательное (экспоненциальное) время ожидания. Каждый раз случайная величина XX с известным распределением проходит через функцию gg, и вопрос в том, каково распределение Y=g(X)Y = g(X). Для счётных величин ответ — сумма; для плотностей — формула замены переменных (change-of-variables formula), которая говорит, что вероятность сохраняется, а плотность при этом сжимается или растягивается. Та же формула, прочитанная в обратную сторону, — это способ, которым компьютеры получают случайные значения с любым распределением, и способ, которым нормализующие потоки (normalizing flows) вычисляют правдоподобие.

Обозначения. Y=g(X)Y = g(X). Для обратимой gg через x=g−1(y)x = g^{-1}(y) обозначен прообраз yy, а через g′g' — производная. fX,FXf_X, F_X и fY,FYf_Y, F_Y — плотности и функции распределения XX и YY.

Дискретный случай#

Если XX принимает не более чем счётное число значений, то и YY тоже, а Y=yY = y происходит ровно тогда, когда XX попадает в одно из значений, которые gg переводит в yy:

P(Y=y)=∑x : g(x)=yP(X=x).P(Y = y) = \sum_{x \,:\, g(x) = y} P(X = x) .

Для честной кости XX и Y=(X−3)2Y = (X - 3)^2 значение Y=1Y = 1 получается из X=2X = 2 и из X=4X = 4, поэтому P(Y=1)=2/6P(Y = 1) = 2/6. Больше ничего не нужно: вероятности значений переносятся вместе с ними и складываются там, где значения сливаются.

Метод функции распределения#

Для непрерывной XX надёжный общий метод проходит через функцию распределения, потому что {Y≤y}\{Y \le y\} — событие, связанное с XX:

FY(y)=P(g(X)≤y),F_Y(y) = P(g(X) \le y) ,

а плотность YY — производная полученной функции.

Квадрат. Пусть X∼U(−1,1)X \sim U(-1, 1) и Y=X2Y = X^2. При 0≤y≤10 \le y \le 1 условие Y≤yY \le y означает −y≤X≤y-\sqrt y \le X \le \sqrt y — интервал длины 2y2\sqrt y из общей длины 2:

FY(y)=y,fY(y)=12y.F_Y(y) = \sqrt y, \qquad f_Y(y) = \frac{1}{2 \sqrt y} .

В половине случаев X2X^2 меньше 1/41/4, хотя 1/41/4 — лишь четверть области значений; плотность YY в нуле бесконечна: там парабола плоская, и многие значения XX теснятся в немногих значениях YY.

Линейное отображение. Для Y=aX+bY = aX + b с a>0a > 0 имеем FY(y)=P(X≤(y−b)/a)=FX((y−b)/a)F_Y(y) = P(X \le (y - b)/a) = F_X((y - b)/a), поэтому

fY(y)=1∣a∣fX(y−ba),f_Y(y) = \frac{1}{\lvert a \rvert} f_X\Big(\frac{y - b}{a}\Big) ,

и то же верно при a<0a < 0. Применённая к X∼N(μ,σ2)X \sim N(\mu, \sigma^2) с a=1/σa = 1/\sigma, b=−μ/σb = -\mu/\sigma, эта формула даёт плотность N(0,1)N(0, 1): это стандартизация Z=(X−μ)/σZ = (X - \mu)/\sigma, обещанная в предыдущей заметке. Верно и обратное: величина aX+baX + b при нормальной XX нормальна, так что температура с распределением N(20,32)N(20, 3^2) °C — это температура с распределением N(68,5.42)N(68, 5.4^2) °F.

Формула замены переменных#

Для строго возрастающей дифференцируемой gg имеем FY(y)=FX(g−1(y))F_Y(y) = F_X(g^{-1}(y)), и дифференцирование сразу даёт плотность YY; для убывающей gg производная меняет знак, что и учитывает модуль:

fY(y)=fX(x)∣g′(x)∣,x=g−1(y).f_Y(y) = \frac{f_X(x)}{\lvert g'(x) \rvert}, \qquad x = g^{-1}(y) .

Формула говорит, что вероятность сохраняется полоса за полосой. Короткий интервал длины dxdx около xx несёт вероятность fX(x) dxf_X(x)\, dx, а gg переводит его в интервал длины dy=∣g′(x)∣ dxdy = \lvert g'(x) \rvert\, dx около yy, который должен нести ту же вероятность: fY(y) dy=fX(x) dxf_Y(y)\, dy = f_X(x)\, dx. Где gg сжимает (∣g′∣<1\lvert g' \rvert < 1), плотность растёт; где растягивает — падает:

Рисунок

Замена переменных: вероятность сохраняется, плотность меняется

Полосы x, их образы под eˣ и плотность YКривая y = eˣ, нормальная плотность X под осью x и логнормальная плотность Y слева от оси y; две полосы близкой вероятности (0.127 и 0.115) переходят в узкий высокий и широкий низкий участки плотности Y.-2-101135y = eˣплотность Xплотность Y0.1270.115120.1270.115f_Y(y) = f_X(x) / g′(x)3Полосы x, их образы под eˣ и плотность YКривая y = eˣ, нормальная плотность X под осью x и логнормальная плотность Y слева от оси y; две полосы близкой вероятности (0.127 и 0.115) переходят в узкий высокий и широкий низкий участки плотности Y.-2-101135y = eˣплотность Xплотность Y0.1270.115120.1270.115f_Y(y) = f_X(x) / g′(x)3
X имеет стандартное нормальное распределение (плотность внизу), Y = eˣ (кривая), плотность Y слева. Полоса x от −1.2 до −0.7 несёт вероятность 0.127, полоса от 0.8 до 1.3 — 0.115 (1). Экспонента сжимает первую в интервал y длиной 0.195 и растягивает вторую в интервал длиной 1.444 (2). Вероятность та же, поэтому плотность Y над первым интервалом высокая, а над вторым низкая: f_Y(y) = f_X(x) / g′(x) (3).

Пример — логнормальное распределение (log-normal): у Y=eXY = e^X с X∼N(0,1)X \sim N(0, 1) производная g′(x)=ex=yg'(x) = e^x = y и

fY(y)=φ(ln⁡y)y,y>0.f_Y(y) = \frac{\varphi(\ln y)}{y}, \qquad y > 0 .

Монотонные отображения переносят квантили, поэтому медиана YY равна e0=1e^0 = 1, а P(Y>e)=P(X>1)=0.159P(Y > e) = P(X > 1) = 0.159. Величины, которые получаются как произведения многих положительных множителей, — доходы, размеры файлов, времена ответа — часто близки к логнормальным: их логарифм — сумма, близкая к нормальной по причинам, которые объясняет центральная предельная теорема.

Если gg не монотонна, вклад даёт каждый прообраз: fY(y)=∑x:g(x)=yfX(x)/∣g′(x)∣f_Y(y) = \sum_{x : g(x) = y} f_X(x) / \lvert g'(x) \rvert. Для Y=X2Y = X^2 из примера выше два прообраза ±y\pm\sqrt y дают по 1/22y\frac{1/2}{2\sqrt y}, и в сумме получается та же 1/(2y)1/(2\sqrt y).

Метод обратной функции#

Прочитанный в обратную сторону, метод функции распределения превращает равномерные случайные числа в числа с любым распределением. Если U∼U(0,1)U \sim U(0, 1), а FF — непрерывная строго возрастающая функция распределения, то X=F−1(U)X = F^{-1}(U) имеет функцию распределения FF, потому что

P(F−1(U)≤x)=P(U≤F(x))=F(x).P(F^{-1}(U) \le x) = P(U \le F(x)) = F(x) .

Для любой функции распределения, с горизонтальными участками или скачками, то же верно для квантильной функции Q(u)=inf⁡{x:F(x)≥u}Q(u) = \inf\{x : F(x) \ge u\} из предыдущей заметки вместо F−1F^{-1}: Q(u)≤xQ(u) \le x ровно тогда, когда u≤F(x)u \le F(x), потому что FF не убывает и непрерывна справа. Дискретный сэмплер ниже — это и есть QQ.

Для показательного распределения F(x)=1−e−xF(x) = 1 - e^{-x} и F−1(u)=−ln⁡(1−u)F^{-1}(u) = -\ln(1 - u):

Рисунок

Метод обратной функции: от равномерного u к показательному x

Функция распределения и пять пар (u, x)Пять значений u на вертикальной оси отражаются кривой в значения x: 0.105, 0.357, 0.693, 1.204, 2.303.01234100.10.30.50.70.9ux = −ln(1 − u)Функция распределения и пять пар (u, x)Пять значений u на вертикальной оси отражаются кривой в значения x: 0.105, 0.357, 0.693, 1.204, 2.303.01234100.10.30.50.70.9ux = −ln(1 − u)
Кривая — функция распределения F(x) = 1 − e^(−x) показательного распределения. Равномерное u на вертикальной оси переводится в x = F⁻¹(u) = −ln(1 − u). Равноотстоящие u = 0.1, 0.3, 0.5, 0.7, 0.9 дают x = 0.105, 0.357, 0.693, 1.204, 2.303: где F растёт медленно (в хвосте), промежутки между x широкие, и туда попадает мало точек.

Та же идея годится и для сэмплирования из дискретного распределения. Для категориального распределения с вероятностями p1,…,pKp_1, \dots, p_K разрежем [0,1][0, 1] на идущие подряд отрезки длин p1,…,pKp_1, \dots, p_K и вернём номер отрезка, в который попало UU; это один поиск по накопленным суммам. Языковая модель сэмплирует следующий токен именно так — после того как температура или top-pp преобразовали вероятности.

Обратное утверждение — интегральное преобразование вероятности (probability integral transform): если у XX непрерывная функция распределения FF, то F(X)∼U(0,1)F(X) \sim U(0, 1). Так проверяют вероятностные прогнозы, поскольку значения F(x)F(x), которые хорошо откалиброванный прогноз даёт в наблюдённых исходах, должны выглядеть равномерно распределёнными; по этой же причине p-значение теста, статистика которого при нулевой гипотезе имеет непрерывное распределение, распределено равномерно, когда эта гипотеза верна. Для дискретной статистики p-значение лишь супер-равномерно, P(p≤α)≤αP(p \le \alpha) \le \alpha: в двустороннем тесте для 100 бросков монеты из заметки о проверке гипотез честная монета даёт p≤0.05p \le 0.05 с вероятностью 0.0350.035. Тест остаётся корректным, но консервативным.

Нормализующие потоки в одномерном случае#

Нормализующий поток моделирует сложную плотность как простую, пропущенную через цепочку обратимых отображений, Y=gK(⋯g1(Z))Y = g_K(\cdots g_1(Z)) с Z∼N(0,1)Z \sim N(0, 1). Применив формулу замены переменных по одному разу к каждому отображению, получаем точный логарифм плотности в точке данных:

log⁡fY(y)=log⁡φ(z)−∑k=1Klog⁡∣gk′(zk−1)∣,z0=z=g−1(y),  zk=gk(zk−1).\log f_Y(y) = \log \varphi(z) - \sum_{k=1}^{K} \log \lvert g_k'(z_{k-1}) \rvert, \qquad z_0 = z = g^{-1}(y), \; z_k = g_k(z_{k-1}) .

Обучение максимизирует этот логарифм правдоподобия по параметрам отображений. В размерности больше единицы производная превращается в определитель матрицы Якоби (якобиан), и как сделать этот определитель дешёвым в вычислении — задача конструирования, которой посвящена заметка о нормализующих потоках в курсе «Генеративные модели».

Что изменилось#

ДоС формулой замены переменных
Распределение g(X)g(X)симулировать и смотреть на гистограммуточно: fX(x)/∣g′(x)∣f_X(x) / \lvert g'(x) \rvert или FYF_Y через FXF_X
Стандартизация нормального распределенияпринималась на верудоказана: (X−μ)/σ∼N(0,1)(X - \mu)/\sigma \sim N(0, 1)
Сэмплирование из распределениядля каждого распределения нужен свой приёмF−1(U)F^{-1}(U) для любой функции распределения; накопленные суммы для категориального
Плотность потока—точный логарифм правдоподобия, по одному log⁡∣g′∣\log \lvert g' \rvert на отображение

Ограничения#

  • F−1F^{-1} не всегда выражается в замкнутом виде. Обратная к нормальной функции распределения не выражается через элементарные функции; сэмплеры используют другие преобразования (Бокса–Мюллера, которому нужны две величины) или численное обращение.
  • Формуле нужна дифференцируемая, локально обратимая gg. Функция с горизонтальными участками, например округление или обрезка (clipping), сосредоточивает положительную вероятность в отдельных значениях, и тогда YY не является непрерывной: округление делает её дискретной, обрезка — смесью масс в точках и плотности.
  • Для функций от нескольких величин нужно их совместное распределение. Распределение суммы или отношения двух случайных величин зависит от того, как они зависят друг от друга; это тема заметки о совместных распределениях.

Что нужно запомнить#

  • Дискретный случай: P(g(X)=y)P(g(X) = y) — сумма P(X=x)P(X = x) по прообразам yy.
  • Непрерывный случай в общем виде: вычислить FY(y)=P(g(X)≤y)F_Y(y) = P(g(X) \le y), затем продифференцировать.
  • Непрерывный случай, монотонная gg: fY(y)=fX(x)/∣g′(x)∣f_Y(y) = f_X(x) / \lvert g'(x) \rvert при x=g−1(y)x = g^{-1}(y); вероятность сохраняется, плотность сжимается или растягивается.
  • Линейные отображения сохраняют нормальность; (X−μ)/σ∼N(0,1)(X - \mu)/\sigma \sim N(0, 1); eXe^X от нормальной величины имеет логнормальное распределение.
  • F−1(U)F^{-1}(U), а в общем случае Q(U)Q(U), имеет функцию распределения FF (метод обратной функции, inverse transform sampling); F(X)F(X) распределена равномерно, если FF непрерывна (интегральное преобразование вероятности).

Код#

Две полосы с рисунка, квадрат равномерной величины и метод обратной функции, проверенные численно:

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  ]

Дальше#

Распределение — это целая функция; часто для работы достаточно двух-трёх чисел: где его центр, насколько оно широкое, насколько тяжёлые у него хвосты. Следующая заметка определяет математическое ожидание и дисперсию, показывает, что математическое ожидание g(X)g(X) можно вычислить, вовсе не находя распределения g(X)g(X), и выводит правило 1/n1/\sqrt n для средних из вводной заметки.

Литература#