22.8. Распределения¶
Теперь, когда мы научились работать с вероятностью как в дискретном, так и в непрерывном случае, давайте познакомимся с некоторыми из распространённых распределений. В зависимости от области машинного обучения, нам может потребоваться знать значительно больше таких распределений, а в некоторых областях глубокого обучения они могут вообще не понадобиться. Тем не менее, этот список является хорошим базовым набором для ознакомления. Сначала импортируем некоторые общие библиотеки.
%matplotlib inline
from math import erf, factorial
import torch
from IPython import display
from d2l import torch as d2l
torch.pi = torch.acos(torch.zeros(1)) * 2 # Define pi in torch
22.8.1. Бернулли¶
Это самая простая случайная величина, с которой обычно приходится сталкиваться. Эта случайная величина кодирует подбрасывание монеты, которое выпадает \(1\) с вероятностью \(p\) и \(0\) с вероятностью \(1-p\). Если у нас есть случайная величина \(X\) с таким распределением, мы запишем
Функция распределения равна
Функция вероятностной массы представлена на графике ниже.
p = 0.3
d2l.set_figsize()
d2l.plt.stem([0, 1], [1 - p, p], use_line_collection=True)
d2l.plt.xlabel('x')
d2l.plt.ylabel('p.m.f.')
d2l.plt.show()
Теперь построим график кумулятивной функции распределения (22.8.2).
x = torch.arange(-1, 2, 0.01)
def F(x):
return 0 if x < 0 else 1 if x > 1 else 1 - p
d2l.plot(x, torch.tensor([F(y) for y in x]), 'x', 'c.d.f.')
Если \(X \sim \textrm{Bernoulli}(p)\), то:
\(\mu_X = p\),
\(\sigma_X^2 = p(1-p)\).
Мы можем получить пример массива произвольной формы из бернуллиевской случайной величины следующим образом.
1*(torch.rand(10, 10) < p)
22.8.2. Дискретное равномерное распределение¶
Следующей часто встречающейся случайной величиной является дискретное равномерное распределение. В нашем обсуждении мы будем считать, что оно определено на целых числах \(\{1, 2, \ldots, n\}\), однако можно свободно выбрать любой другой набор значений. Слово равномерное в данном контексте означает, что каждое возможное значение равновероятно. Вероятность каждого значения \(i \in \{1, 2, 3, \ldots, n\}\) равна \(p_i = \frac{1}{n}\). Будем обозначать случайную величину \(X\) с таким распределением как
Функция распределения равна
Сначала построим график функции массы вероятности.
n = 5
d2l.plt.stem([i+1 for i in range(n)], n*[1 / n], use_line_collection=True)
d2l.plt.xlabel('x')
d2l.plt.ylabel('p.m.f.')
d2l.plt.show()
Теперь построим график кумулятивной функции распределения (22.8.4).
x = torch.arange(-1, 6, 0.01)
def F(x):
return 0 if x < 1 else 1 if x > n else torch.floor(x) / n
d2l.plot(x, torch.tensor([F(y) for y in x]), 'x', 'c.d.f.')
Если \(X \sim U(n)\), то:
\(\mu_X = \frac{1+n}{2}\),
\(\sigma_X^2 = \frac{n^2-1}{12}\).
Мы можем получить пример массива произвольной формы из дискретной равномерной случайной величины следующим образом.
torch.randint(1, n, size=(10, 10))
22.8.3. Непрерывное равномерное распределение¶
Далее рассмотрим непрерывное равномерное распределение. Суть этой случайной величины заключается в том, что если мы увеличим \(n\) в дискретном равномерном распределении, а затем масштабировали его так, чтобы оно укладывалось в интервал \([a, b]\), то мы получим непрерывную случайную величину, которая выбирает произвольное значение в \([a, b]\) с одинаковой вероятностью. Будем обозначать это распределение как
Функция плотности вероятности равна
Функция распределения равна
Сначала построим график функции плотности вероятности (22.8.6).
a, b = 1, 3
x = torch.arange(0, 4, 0.01)
p = (x > a).type(torch.float32)*(x < b).type(torch.float32)/(b-a)
d2l.plot(x, p, 'x', 'p.d.f.')
Теперь построим график функции распределения (22.8.7).
def F(x):
return 0 if x < a else 1 if x > b else (x - a) / (b - a)
d2l.plot(x, torch.tensor([F(y) for y in x]), 'x', 'c.d.f.')
Если \(X \sim U(a, b)\), то:
\(\mu_X = \frac{a+b}{2}\),
\(\sigma_X^2 = \frac{(b-a)^2}{12}\).
Мы можем получить примеры массива произвольной формы из равномерной случайной величины следующим образом. Обратите внимание, что по умолчанию она генерирует значения из распределения \(U(0,1)\), поэтому, если нам нужен другой диапазон, необходимо масштабировать результат.
(b - a) * torch.rand(10, 10) + a
22.8.4. Биномиальное¶
Давайте усложним задачу и рассмотрим биномиальную случайную величину. Эта случайная величина возникает при проведении последовательности \(n\) независимых экспериментов, каждый из которых имеет вероятность \(p\) успеха, и позволяет определить, сколько успехов мы ожидаем наблюдать.
Выразим это математически. Каждое испытание — это независимая случайная величина \(X_i\), где мы будем использовать \(1\) для кодирования успеха, а \(0\) — для кодирования неудачи. Поскольку каждое испытание представляет собой независимое подбрасывание монеты, успешное с вероятностью \(p\), мы можем записать, что \(X_i \sim \textrm{Bernoulli}(p)\). Тогда биномиальная случайная величина равна
В этом случае мы будем записывать
Чтобы получить функцию кумулятивного распределения, нужно заметить, что получение ровно \(k\) успехов возможно \(\binom{n}{k} = \frac{n!}{k!(n-k)!}\) способами, каждый из которых имеет вероятность \(p^k(1-p)^{n-k}\). Таким образом, функция кумулятивного распределения равна
Сначала построим график функции массы вероятности.
n, p = 10, 0.2
# Compute binomial coefficient
def binom(n, k):
comb = 1
for i in range(min(k, n - k)):
comb = comb * (n - i) // (i + 1)
return comb
pmf = torch.tensor([p**i * (1-p)**(n - i) * binom(n, i) for i in range(n + 1)])
d2l.plt.stem([i for i in range(n + 1)], pmf, use_line_collection=True)
d2l.plt.xlabel('x')
d2l.plt.ylabel('p.m.f.')
d2l.plt.show()
Теперь построим график функции распределения (22.8.10).
x = torch.arange(-1, 11, 0.01)
cmf = torch.cumsum(pmf, dim=0)
def F(x):
return 0 if x < 0 else 1 if x > n else cmf[int(x)]
d2l.plot(x, torch.tensor([F(y) for y in x.tolist()]), 'x', 'c.d.f.')
Если \(X \sim \textrm{Binomial}(n, p)\), то:
\(\mu_X = np\),
\(\sigma_X^2 = np(1-p)\).
Это следует из линейности математического ожидания суммы \(n\) бернуллиевских случайных величин и того факта, что дисперсия суммы независимых случайных величин равна сумме их дисперсий. Это можно сэмплировать следующим образом.
m = torch.distributions.binomial.Binomial(n, p)
m.sample(sample_shape=(10, 10))
22.8.5. Пуассона¶
Теперь проведем мысленный эксперимент. Мы стоим на автобусной остановке и хотим узнать, сколько автобусов прибудет за следующую минуту. Начнем с рассмотрения \(X^{(1)} \sim \textrm{Bernoulli}(p)\), которое представляет собой вероятность прибытия автобуса в течение одной минуты. Для остановок, расположенных далеко от городского центра, это может быть довольно хорошим приближением. Мы можем ни разу не увидеть более одного автобуса за минуту.
Однако, если мы находимся в оживлённом районе, возможно и даже вероятно, что прибудут два автобуса. Мы можем смоделировать это, разделив нашу случайную величину на две части: для первых 30 секунд и для вторых 30 секунд. В этом случае мы можем записать
где \(X^{(2)}\) — это общая сумма, а \(X^{(2)}_i \sim \textrm{Bernoulli}(p/2)\). Тогда общее распределение имеет вид \(X^{(2)} \sim \textrm{Binomial}(2, p/2)\).
Зачем на этом останавливаться? Давайте продолжим и разобьём эту минуту на \(n\) частей. Тем же рассуждением, что и выше, мы видим, что
Рассмотрим эти случайные величины. Согласно предыдущему разделу, мы знаем, что (22.8.12) имеет математическое ожидание \(\mu_{X^{(n)}} = n(p/n) = p\) и дисперсию \(\sigma_{X^{(n)}}^2 = n(p/n)(1-(p/n)) = p(1-p/n)\). Если мы рассмотрим \(n \rightarrow \infty\), то увидим, что эти числа стремятся к \(\mu_{X^{(\infty)}} = p\), а дисперсия — к \(\sigma_{X^{(\infty)}}^2 = p\). Это указывает на то, что возможно существует случайная величина, которую можно определить в пределе бесконечного разбиения.
Это не должно вызывать особого удивления, поскольку в реальном мире мы можем просто подсчитать количество прибытий автобусов, однако приятно видеть, что наша математическая модель корректно определена. Этот рассуждения можно формализовать в виде закона редких событий.
Тщательно проведя это рассуждение, мы можем прийти к следующей модели. Будем говорить, что \(X \sim \textrm{Poisson}(\lambda)\) — это случайная величина, которая принимает значения \(\{0,1,2, \ldots\}\) с вероятностью
Значение \(\lambda > 0\) называется скоростью (или параметром формы) и обозначает среднее число прибытий, которое мы ожидаем за одну единицу времени.
Мы можем просуммировать эту функцию вероятностной массы, чтобы получить функцию распределения.
Сначала построим график функции распределения вероятностей (22.8.13).
lam = 5.0
xs = [i for i in range(20)]
pmf = torch.tensor([torch.exp(torch.tensor(-lam)) * lam**k
/ factorial(k) for k in xs])
d2l.plt.stem(xs, pmf, use_line_collection=True)
d2l.plt.xlabel('x')
d2l.plt.ylabel('p.m.f.')
d2l.plt.show()
Теперь построим график функции распределения (22.8.14).
x = torch.arange(-1, 21, 0.01)
cmf = torch.cumsum(pmf, dim=0)
def F(x):
return 0 if x < 0 else 1 if x > n else cmf[int(x)]
d2l.plot(x, torch.tensor([F(y) for y in x.tolist()]), 'x', 'c.d.f.')
Как мы видели выше, математические ожидания и дисперсии имеют особенно простой вид. Если \(X \sim \textrm{Poisson}(\lambda)\), то:
\(\mu_X = \lambda\),
\(\sigma_X^2 = \lambda\).
Это можно сэмплировать следующим образом.
m = torch.distributions.poisson.Poisson(lam)
m.sample((10, 10))
22.8.6. Гауссово¶
Теперь рассмотрим другой, но связанный эксперимент. Предположим, мы снова выполняем \(n\) независимых \(\textrm{Bernoulli}(p)\) измерений \(X_i\). Распределение суммы этих величин задаётся \(X^{(n)} \sim \textrm{Binomial}(n, p)\). Вместо того чтобы брать предел при увеличении \(n\) и уменьшении \(p\), зафиксируем \(p\) и будем стремиться \(n \rightarrow \infty\). В этом случае \(\mu_{X^{(n)}} = np \rightarrow \infty\) и \(\sigma_{X^{(n)}}^2 = np(1-p) \rightarrow \infty\), поэтому нет оснований полагать, что этот предел должен быть корректно определён.
Однако не всё потеряно! Давайте просто сделаем так, чтобы среднее значение и дисперсия вели себя корректно, определив
Легко видеть, что математическое ожидание равно нулю, а дисперсия — единице, поэтому вполне обосновано предположить, что оно сходится к некоторому предельному распределению. Если мы построим графики, показывающие вид этих распределений, мы ещё больше убедимся в том, что этот подход будет работать.
p = 0.2
ns = [1, 10, 100, 1000]
d2l.plt.figure(figsize=(10, 3))
for i in range(4):
n = ns[i]
pmf = torch.tensor([p**i * (1-p)**(n-i) * binom(n, i)
for i in range(n + 1)])
d2l.plt.subplot(1, 4, i + 1)
d2l.plt.stem([(i - n*p)/torch.sqrt(torch.tensor(n*p*(1 - p)))
for i in range(n + 1)], pmf,
use_line_collection=True)
d2l.plt.xlim([-4, 4])
d2l.plt.xlabel('x')
d2l.plt.ylabel('p.m.f.')
d2l.plt.title("n = {}".format(n))
d2l.plt.show()
Обратите внимание: в отличие от случая распределения Пуассона, мы теперь делим на стандартное отклонение, что означает сжатие возможных исходов в всё более узкие области. Это указывает на то, что предельное распределение будет не дискретным, а непрерывным.
Вывод того, что происходит, выходит за рамки данного документа, но центральная предельная теорема утверждает, что при \(n \rightarrow \infty\) это приводит к гауссовскому распределению (или, иногда, нормальному распределению). Более явно, для любого \(a, b\):
где мы говорим, что случайная величина имеет нормальное распределение со средним \(\mu\) и дисперсией \(\sigma^2\), что обозначается \(X \sim \mathcal{N}(\mu, \sigma^2)\), если \(X\) имеет плотность
Сначала построим график функции плотности вероятности (22.8.17).
mu, sigma = 0, 1
x = torch.arange(-3, 3, 0.01)
p = 1 / torch.sqrt(2 * torch.pi * sigma**2) * torch.exp(
-(x - mu)**2 / (2 * sigma**2))
d2l.plot(x, p, 'x', 'p.d.f.')
Теперь построим график функции распределения. Выходя за рамки этого
приложения, отметим, что функция распределения Гаусса не имеет замкнутой
формы выражения через более элементарные функции. Мы воспользуемся
erf, которая предоставляет способ численного вычисления этого
интеграла.
def phi(x):
return (1.0 + erf((x - mu) / (sigma * torch.sqrt(torch.tensor(2.))))) / 2.0
d2l.plot(x, torch.tensor([phi(y) for y in x.tolist()]), 'x', 'c.d.f.')
Зоркие читатели узнают некоторые из этих терминов. Действительно, мы встречали этот интеграл в Section 22.5. Именно этот вычислительный приём нам нужен, чтобы убедиться, что \(p_X(x)\) имеет полную площадь, равную единице, и, следовательно, является корректной плотностью вероятности.
Наш выбор в пользу работы с подбрасыванием монеты позволил сократить вычисления, однако ничего фундаментального в этом выборе не было. Действительно, если мы возьмём любую совокупность независимых одинаково распределённых случайных величин \(X_i\) и составим
Тогда
будет приблизительно гауссовским. Для этого требуются дополнительные условия, наиболее распространённым из которых является \(E[X^4] < \infty\), но общая идея ясна.
Теорема о центральном предельном распределении объясняет, почему гауссово распределение имеет фундаментальное значение для вероятности, статистики и машинного обучения. Всякий раз, когда мы можем сказать, что измеряемая величина представляет собой сумму многих малых независимых вкладов, мы можем считать, что она будет близка к гауссовскому распределению.
У гауссовских распределений есть и множество других увлекательных свойств, и мы хотим обсудить здесь ещё одно. Гауссовское распределение является так называемым распределением с максимальной энтропией. Мы подробнее рассмотрим энтропию в Section 22.11, однако на данном этапе нам достаточно знать, что это мера случайности. В строгом математическом смысле гауссовское распределение можно рассматривать как наиболее случайный выбор случайной величины при фиксированных среднем и дисперсии. Таким образом, если мы знаем, что наша случайная величина имеет определённое среднее и дисперсию, то гауссовское распределение представляет собой в некотором смысле наиболее консервативный выбор распределения.
Чтобы завершить раздел, напомним, что если \(X \sim \mathcal{N}(\mu, \sigma^2)\), то:
\(\mu_X = \mu\),
\(\sigma_X^2 = \sigma^2\).
Мы можем получать примеры из гауссовского (или стандартного нормального) распределения, как показано ниже.
torch.normal(mu, sigma, size=(10, 10))
22.8.7. Семейство экспоненциальных распределений¶
Общим свойством всех перечисленных выше распределений является то, что они принадлежат так называемому экспоненциальному семейству. Экспоненциальное семейство — это множество распределений, плотность которых может быть записана в следующем виде:
Поскольку это определение может быть неочевидным, рассмотрим его подробнее.
Во-первых, \(h(\mathbf{x})\) называется базовой мерой или мерой исходного пространства. Её можно рассматривать как исходную меру, которую мы модифицируем с помощью экспоненциального веса.
Во-вторых, существует вектор \(\boldsymbol{\eta} = (\eta_1, \eta_2, ..., \eta_l) \in \mathbb{R}^l\), называемый естественными параметрами или каноническими параметрами. Они определяют, каким образом базовая мера будет изменена. Естественные параметры входят в новую меру через скалярное произведение этих параметров на некоторую функцию \(T(\cdot)\) от \(\mathbf{x}= (x_1, x_2, ..., x_n) \in \mathbb{R}^n\), после чего результат возводится в экспоненту. Вектор \(T(\mathbf{x})= (T_1(\mathbf{x}), T_2(\mathbf{x}), ..., T_l(\mathbf{x}))\) называется достаточными статистиками для \(\boldsymbol{\eta}\). Это название используется, поскольку информация, представленная \(T(\mathbf{x})\), достаточна для вычисления плотности вероятности, и никакая другая информация из примеров \(\mathbf{x}\) не требуется.
Третьим элементом является \(A(\boldsymbol{\eta})\), называемая кумулятивной функцией, которая обеспечивает нормировку приведённого выше распределения (22.8.20) в единицу, то есть
Для определённости рассмотрим гауссово распределение. Предполагая, что \(\mathbf{x}\) — одномерная случайная величина, мы видели, что её плотность имеет вид
Это соответствует определению экспоненциального семейства с:
основная мера: \(h(x) = \frac{1}{\sqrt{2 \pi}}\),
естественные параметры: \(\boldsymbol{\eta} = \begin{bmatrix} \eta_1 \\ \eta_2 \end{bmatrix} = \begin{bmatrix} \frac{\mu}{\sigma^2} \\ \frac{1}{2 \sigma^2} \end{bmatrix}\),
достаточные статистики: \(T(x) = \begin{bmatrix}x\\-x^2\end{bmatrix}\), и
функция кумулянтов: \(A({\boldsymbol\eta}) = \frac{1}{2 \sigma^2} \mu^2 + \log(\sigma) = \frac{\eta_1^2}{4 \eta_2} - \frac{1}{2}\log(2 \eta_2)\).
Стоит отметить, что точный выбор каждого из вышеуказанных членов является несколько произвольным. Действительно, важно то, что распределение может быть выражено в этой форме, а не сама точная форма.
Как мы упоминали в Section 4.1.2.2, широко используемым подходом является предположение о том, что конечный выход \(\mathbf{y}\) подчиняется распределению из экспоненциального семейства. Экспоненциальное семейство — это распространённое и мощное семейство распределений, часто встречающееся в машинном обучении.
22.8.8. Резюме¶
Бернуллиевские случайные величины могут использоваться для моделирования событий с исходом «да/нет».
Дискретное равномерное распределение моделирует выбор из конечного множества вариантов.
Непрерывные равномерные распределения выбирают значения из интервала.
Биномиальное распределение моделирует последовательность независимых испытаний Бернулли и подсчитывает количество успехов.
Случайные величины, подчиняющиеся распределению Пуассона, моделируют наступление редких событий.
Гауссовские случайные величины моделируют результат сложения большого числа независимых случайных величин.
Все вышеперечисленные распределения принадлежат экспоненциальному семейству.
22.8.9. Упражнения¶
Чему равно стандартное отклонение случайной величины, являющейся разностью \(X-Y\) двух независимых биномиальных случайных величин \(X, Y \sim \textrm{Binomial}(16, 1/2)\)?
Если взять пуассоновскую случайную величину \(X \sim \textrm{Poisson}(\lambda)\) и рассмотреть \((X - \lambda)/\sqrt{\lambda}\) как \(\lambda \rightarrow \infty\), то можно показать, что она становится приблизительно гауссовской. Почему это имеет смысл?
Какова функция распределения вероятностей для суммы двух дискретных равномерных случайных величин на \(n\) элементах?