.. _sec_prob: Вероятность и статистика ======================== Тем или иным образом, машинное обучение сводится к работе с неопределенностью. В обучении с учителем мы хотим предсказать нечто неизвестное (целевую переменную), опираясь на нечто известное (признаки). В зависимости от поставленной задачи мы можем стремиться предсказать наиболее вероятное значение целевой переменной. Либо мы можем предсказать значение, имеющее наименьшее ожидаемое расстояние до истинного значения. А иногда нам нужно не просто предсказать конкретное значение, но и *количественно оценить нашу неопределенность*. Например, имея признаки, описывающие пациента, мы можем захотеть узнать, *насколько вероятно*, что у него случится сердечный приступ в течение следующего года. В обучении без учителя мы также часто сталкиваемся с неопределенностью. Чтобы определить, является ли набор измерений аномальным, полезно знать, насколько вероятно наблюдение таких значений в интересующей нас популяции. Кроме того, в обучении с подкреплением мы стремимся создать агентов, которые действуют разумно в различных средах. Для этого необходимо рассуждать о том, как, как ожидается, будет изменяться среда и какие вознаграждения можно ожидать в ответ на каждое из доступных действий. **Вероятность** — это математическая область, занимающаяся рассуждениями в условиях неопределенности. Зная вероятностную модель некоторого процесса, мы можем оценивать правдоподобие различных событий. Использование вероятностей для описания частот повторяющихся событий (например, подбрасывания монеты) не вызывает особых споров. Действительно, сторонники *частотного* подхода придерживаются интерпретации вероятности, которая применяется *только* к таким повторяющимся событиям. В отличие от них, сторонники *байесовского* подхода используют язык вероятности более широко для формализации рассуждений в условиях неопределенности. Байесовская вероятность характеризуется двумя уникальными особенностями: (i) присвоением степени уверенности неповторяющимся событиям, например, какова *вероятность* того, что плотина рухнет?; и (ii) субъективностью. Хотя байесовская вероятность предоставляет чёткие правила того, как следует обновлять свои убеждения с учётом новых данных, она допускает, что разные люди могут начинать с различных *априорных* распределений. *Статистика* помогает нам рассуждать в обратном направлении: начиная со сбора и организации данных, мы делаем выводы о процессе, который их породил. Всякий раз, когда мы анализируем набор данных, выявляя закономерности, которые, как мы надеем, характеризуют более широкую совокупность, мы применяем статистическое мышление. Многим курсам, специальностям, диссертациям, карьерам, кафедрам, компаниям и институтам посвящено изучение теории вероятностей и статистики. Хотя в этом разделе мы лишь поверхностно коснемся темы, мы заложим фундамент, необходимый для начала построения моделей. .. raw:: latex \diilbookstyleinputcell .. code:: python %matplotlib inline import random import torch from torch.distributions.multinomial import Multinomial from d2l import torch as d2l Простой пример: подбрасывание монет ----------------------------------- Представим, что мы планируем подбросить монету и хотим оценить вероятность выпадения орла (по сравнению с решкой). Если монета *честная*, то оба исхода (орел и решка) равновероятны. Более того, если мы планируем подбросить монету :math:`n` раз, то доля выпавших орлов, которую мы *ожидаем* увидеть, должна в точности совпадать с *ожидаемой* долей выпавших решек. Один из интуитивных способов понять это — рассмотреть симметрию: для каждого возможного исхода с :math:`n_\textrm{h}` орлами и :math:`n_\textrm{t} = (n - n_\textrm{h})` решками существует равновероятный исход с :math:`n_\textrm{t}` орлами и :math:`n_\textrm{h}` решками. Обратите внимание, что это возможно только в том случае, если в среднем мы ожидаем, что :math:`1/2` подбрасываний выпадут орлом, а :math:`1/2` — решкой. Конечно, если вы проведете этот эксперимент много раз, по :math:`n=1000000` подбрасываний за каждый заход, вы можете никогда не увидеть случай, когда выпадает ровно :math:`n_\textrm{h} = n_\textrm{t}` орлов. Формально величина :math:`1/2` называется *вероятностью* и она отражает степень уверенности в том, что при любом броске монеты выпадет орёл. Вероятности присваивают значения в диапазоне от :math:`0` до :math:`1` интересующим нас исходам, называемым *событиями*. В данном случае интересующим нас событием является :math:`\textrm{heads}`, а соответствующую вероятность мы обозначаем как :math:`P(\textrm{heads})`. Вероятность, равная :math:`1`, указывает на абсолютную достоверность (представьте себе поддельную монету, у которой обе стороны — орлы), а вероятность, равная :math:`0`, указывает на невозможность события (например, если бы обе стороны были решками). Частоты :math:`n_\textrm{h}/n` и :math:`n_\textrm{t}/n` не являются вероятностями, а представляют собой *статистики*. Вероятности — это *теоретические* величины, лежащие в основе процесса генерации данных. Здесь вероятность :math:`1/2` является свойством самой монеты. Напротив, статистики — это *эмпирические* величины, которые вычисляются как функции от наблюдаемых данных. Наши интересы в вероятностных и статистических величинах неразрывно переплетены. Мы часто разрабатываем специальные статистики, называемые *оценчиками*, которые, получая на вход *набор данных*, выдают *оценки* параметров модели, таких как вероятности. Более того, когда эти оценчики обладают приятным свойством, называемым *состоятельностью*, наши оценки будут сходиться к соответствующей вероятности. В свою очередь, эти выведенные вероятности позволяют судить о вероятных статистических свойствах данных из той же популяции, с которыми мы можем столкнуться в будущем. Предположим, что мы нашли настоящую монету, истинное значение :math:`P(\textrm{heads})` которой нам неизвестно. Чтобы исследовать эту величину с помощью статистических методов, нам необходимо (i) собрать данные и (ii) разработать оценщик. Сбор данных в данном случае прост: мы можем подбросить монету много раз и записать все исходы. Формально получение реализаций из некоторого лежащего в основе случайного процесса называется *выборкой*. Как вы, вероятно, догадались, одним из естественных оценщиков является отношение числа наблюдаемых *орлов* к общему числу подбрасываний. Предположим теперь, что монета на самом деле честная, т. е. :math:`P(\textrm{heads}) = 0.5`. Для моделирования подбрасываний честной монеты можно воспользоваться любым генератором случайных чисел. Существуют простые способы получить выборку события с вероятностью :math:`0.5`. Например, функция ``random.random`` в Python возвращает числа в интервале :math:`[0,1]`, причём вероятность попадания в любой подынтервал :math:`[a, b] \subset [0,1]` равна :math:`b-a`. Таким образом, мы можем получить результаты ``0`` и ``1`` с вероятностью ``0.5`` каждый, проверяя, больше ли возвращаемое число с плавающей запятой, чем ``0.5``: .. raw:: latex \diilbookstyleinputcell .. code:: python num_tosses = 100 heads = sum([random.random() > 0.5 for _ in range(num_tosses)]) tails = num_tosses - heads print("heads, tails: ", [heads, tails]) Более того, мы можем симулировать многократные выборки из любой случайной величины с конечным числом возможных исходов (например, подбрасывание монеты или бросок кубика), вызывая функцию ``multinomial``, где первым аргументом указывается количество выборок, а вторым — список вероятностей, соответствующих каждому из возможных исходов. Чтобы смоделировать десять подбрасываний честной монеты, мы задаем вектор вероятностей ``[0.5, 0.5]``, интерпретируя индекс 0 как выпадение орла, а индекс 1 — как выпадение решки. Функция возвращает вектор длины, равной количеству возможных исходов (в данном случае 2), где первый компонент показывает число выпадений орла, а второй — число выпадений решки. .. raw:: latex \diilbookstyleinputcell .. code:: python fair_probs = torch.tensor([0.5, 0.5]) Multinomial(100, fair_probs).sample() Каждый раз при запуске этого процесса выборки вы получаете новое случайное значение, которое может отличаться от предыдущего результата. Деление на количество бросков даёт нам *частоту* каждого исхода в наших данных. Обратите внимание, что эти частоты, как и вероятности, которые они призваны оценивать, в сумме дают :math:`1`. .. raw:: latex \diilbookstyleinputcell .. code:: python Multinomial(100, fair_probs).sample() / 100 Здесь, даже если наша смоделированная монета честная (мы сами задали вероятности ``[0.5, 0.5]``), количество выпадений орла и решки может не совпадать. Это связано с тем, что мы выбрали относительно небольшое количество примеров. Если бы мы не реализовывали симуляцию самостоятельно, а наблюдали только результат, как бы мы узнали, является ли монета слегка нечестной или же возможное отклонение от :math:`1/2` является лишь артефактом малого размера выборки? Давайте посмотрим, что произойдет, если мы смоделируем 10 000 бросков. .. raw:: latex \diilbookstyleinputcell .. code:: python counts = Multinomial(10000, fair_probs).sample() counts / 10000 В общем случае для средних значений повторяющихся событий (например, подбрасываний монеты) по мере увеличения числа повторений наши оценки гарантированно сходятся к истинным вероятностям. Математическая формулировка этого явления называется *законом больших чисел*, а *центральная предельная теорема* утверждает, что во многих ситуациях по мере роста размера выборки :math:`n` эти ошибки должны уменьшаться со скоростью :math:`(1/\sqrt{n})`. Давайте получим больше интуиции, изучив, как меняется наша оценка при увеличении числа подбрасываний от 1 до 10 000. .. raw:: latex \diilbookstyleinputcell .. code:: python counts = Multinomial(1, fair_probs).sample((10000,)) cum_counts = counts.cumsum(dim=0) estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True) estimates = estimates.numpy() d2l.set_figsize((4.5, 3.5)) d2l.plt.plot(estimates[:, 0], label=("P(coin=heads)")) d2l.plt.plot(estimates[:, 1], label=("P(coin=tails)")) d2l.plt.axhline(y=0.5, color='black', linestyle='dashed') d2l.plt.gca().set_xlabel('Samples') d2l.plt.gca().set_ylabel('Estimated probability') d2l.plt.legend(); Каждая сплошная кривая соответствует одному из двух значений монеты и отражает нашу оценку вероятности выпадения этого значения после каждой группы экспериментов. Пунктирная черная линия показывает истинную вероятность. По мере накопления данных в результате проведения дополнительных экспериментов кривые сходятся к истинному значению. Вы, возможно, уже начинаете видеть форму некоторых более сложных вопросов, которыми занимаются статистики: как быстро происходит эта сходимость? Если бы мы уже протестировали множество монет, произведённых на одном заводе, как можно было бы учесть эту информацию? Более формальный подход ----------------------- Мы уже продвинулись довольно далеко: задали вероятностную модель, сгенерировали синтетические данные, применили статистический оценщик, эмпирически оценили сходимость и отчитались о метриках ошибки (проверив отклонение). Однако для дальнейшего продвижения нам потребуется большая точность. Рассматривая случайность, мы обозначаем множество возможных исходов :math:`\mathcal{S}` и называем его *пространством исходов* или *пространством результатов*. Здесь каждый элемент является отдельным возможным *результатом*. В случае подбрасывания одной монеты :math:`\mathcal{S} = \{\textrm{heads}, \textrm{tails}\}`. Для одного кубика :math:`\mathcal{S} = \{1, 2, 3, 4, 5, 6\}`. При подбрасывании двух монет возможные результаты имеют вид :math:`\{(\textrm{heads}, \textrm{heads}), (\textrm{heads}, \textrm{tails}), (\textrm{tails}, \textrm{heads}), (\textrm{tails}, \textrm{tails})\}`. *События* — это подмножества пространства исходов. Например, событие «первый подбрасываемый орёл выпадет орлом» соответствует множеству :math:`\{(\textrm{heads}, \textrm{heads}), (\textrm{heads}, \textrm{tails})\}`. Всякий раз, когда результат :math:`z` случайного эксперимента удовлетворяет условию :math:`z \in \mathcal{A}`, происходит событие :math:`\mathcal{A}`. Для одного броска кубика мы можем определить события «выпало :math:`5`\ » (:math:`\mathcal{A} = \{5\}`) и «выпало нечётное число» (:math:`\mathcal{B} = \{1, 3, 5\}`). В этом случае, если на кубике выпало :math:`5`, мы скажем, что произошли оба события :math:`\mathcal{A}` и :math:`\mathcal{B}`. С другой стороны, если выпало :math:`z = 3`, то событие :math:`\mathcal{A}` не произошло, но произошло событие :math:`\mathcal{B}`. Функция *вероятности* отображает события в вещественные числа :math:`{P: \mathcal{A} \subseteq \mathcal{S} \rightarrow [0,1]}`. Вероятность :math:`P(\mathcal{A})` события :math:`\mathcal{A}` в заданном пространстве примеров :math:`\mathcal{S}` обладает следующими свойствами: - Вероятность любого события :math:`\mathcal{A}` — неотрицательное действительное число, т. е. :math:`P(\mathcal{A}) \geq 0`; - Вероятность всего пространства примеров равна :math:`1`, то есть :math:`P(\mathcal{S}) = 1`; - Для любой счётной последовательности событий :math:`\mathcal{A}_1, \mathcal{A}_2, \ldots`, которые являются *взаимоисключающими* (т. е. :math:`\mathcal{A}_i \cap \mathcal{A}_j = \emptyset` для всех :math:`i \neq j`), вероятность того, что произойдёт хотя бы одно из них, равна сумме их вероятностей, т. е. :math:`P(\bigcup_{i=1}^{\infty} \mathcal{A}_i) = \sum_{i=1}^{\infty} P(\mathcal{A}_i)`. Эти аксиомы теории вероятностей, предложенные :cite:t:`Kolmogorov.1933`, позволяют быстро вывести ряд важных следствий. Например, сразу следует, что вероятность наступления любого события :math:`\mathcal{A}` *или* его дополнения :math:`\mathcal{A}'` равна 1 (поскольку :math:`\mathcal{A} \cup \mathcal{A}' = \mathcal{S}`). Мы также можем доказать, что :math:`P(\emptyset) = 0`, так как :math:`1 = P(\mathcal{S} \cup \mathcal{S}') = P(\mathcal{S} \cup \emptyset) = P(\mathcal{S}) + P(\emptyset) = 1 + P(\emptyset)`. Следовательно, вероятность одновременного наступления любого события :math:`\mathcal{A}` и его дополнения :math:`\mathcal{A}'` равна :math:`P(\mathcal{A} \cap \mathcal{A}') = 0`. Неформально это означает, что невозможные события имеют нулевую вероятность наступления. Случайные величины ------------------ Когда мы говорили о таких событиях, как выпадение нечетного числа при броске кубика или выпадение орла при первом подбрасывании монеты, мы использовали понятие *случайной величины*. Формально случайные величины — это отображения из базового пространства исходов в множество (возможно, большое) значений. Возможно, вы спросите, чем случайная величина отличается от пространства исходов, поскольку оба понятия представляют собой совокупности исходов. Важно отметить, что случайные величины могут быть гораздо более грубыми по сравнению с исходным пространством исходов. Мы можем определить бинарную случайную величину, например, «больше 0.5», даже если базовое пространство исходов бесконечно, например, точки на отрезке между :math:`0` и :math:`1`. Кроме того, несколько случайных величин могут иметь одно и то же базовое пространство исходов. Например, «сработает ли моя домашняя сигнализация» и «был ли взломан мой дом» — это обе бинарные случайные величины, имеющие общее базовое пространство исходов. Следовательно, знание значения, принятого одной случайной величиной, может дать нам представление о вероятном значении другой случайной величины. Зная, что сигнализация сработала, мы можем предположить, что дом, вероятно, был взломан. Каждому значению, принимаемому случайной величиной, соответствует подмножество базового пространства исходов. Таким образом, ситуация, при которой случайная величина :math:`X` принимает значение :math:`v`, обозначаемая как :math:`X=v`, является *событием*, а :math:`P(X=v)` обозначает его вероятность. Иногда такая запись может быть громоздкой, и мы можем использовать упрощённую нотацию, если контекст понятен. Например, мы можем использовать :math:`P(X)` для обозначения *распределения* случайной величины :math:`X`, то есть функции, которая показывает вероятность того, что :math:`X` примет любое заданное значение. В других случаях мы записываем выражения вида :math:`P(X,Y) = P(X) P(Y)` как сокращение для утверждения, которое верно для всех значений, которые могут принимать случайные величины :math:`X` и :math:`Y`, то есть для всех :math:`i,j` выполняется условие :math:`P(X=i \textrm{ and } Y=j) = P(X=i)P(Y=j)`. В иных случаях мы используем упрощённую запись :math:`P(v)`, когда случайная величина очевидна из контекста. Поскольку в теории вероятностей событие — это множество исходов из пространства элементарных исходов, мы можем указать диапазон значений, которые может принимать случайная величина. Например, :math:`P(1 \leq X \leq 3)` обозначает вероятность события :math:`\{1 \leq X \leq 3\}`. Обратите внимание на тонкое различие между *дискретными* случайными величинами, такими как подбрасывание монеты или игрального кубика, и *непрерывными*, такими как вес и рост человека, выбранного случайным образом из генеральной совокупности. В этом случае нас редко интересует точный рост конкретного человека. Более того, если бы мы провели достаточно точные измерения, то обнаружили бы, что на планете нет двух людей с абсолютно одинаковым ростом. Фактически, при достаточно высокой точности измерений ваш рост утром при пробуждении и вечером перед сном уже не будет совпадать. Нет особого смысла спрашивать о точной вероятности того, что чей-то рост составляет ровно 1,801392782910287192 метра. Вместо этого мы обычно предпочитаем иметь возможность утверждать, попадает ли рост человека в заданный интервал, например, между 1,79 и 1,81 метра. В таких случаях мы работаем с *плотностями вероятности*. Рост ровно 1,80 метра имеет нулевую вероятность, но ненулевую плотность. Чтобы вычислить вероятность, приходящуюся на интервал, необходимо взять *интеграл* плотности по этому интервалу. Несколько случайных величин --------------------------- Вы, вероятно, заметили, что мы не могли пройти предыдущий раздел, не делая утверждений, касающихся взаимодействия нескольких случайных величин (напомним, что :math:`P(X,Y) = P(X) P(Y)`). Большинство задач машинного обучения связано именно с такими зависимостями. В этом контексте пространство элементарных событий представляет собой изучаемую совокупность, например, клиентов, совершающих транзакции в компании, фотографии в интернете или белки, известные биологам. Каждая случайная величина отражает (неизвестное) значение некоторого атрибута. Каждый раз, когда мы выбираем пример из совокупности, мы наблюдаем реализацию каждой из случайных величин. Поскольку значения, принимаемые случайными величинами, соответствуют подмножествам пространства элементарных событий, которые могут пересекаться, частично пересекаться или быть непересекающимися, знание значения одной случайной величины позволяет нам обновить наши представления о том, какие значения другой случайной величины являются более вероятными. Если пациент приходит в больницу и мы наблюдаем, что у него затруднено дыхание и отсутствует обоняние, то мы считаем, что вероятность того, что у него COVID-19, выше, чем если бы у него не было затруднений с дыханием и обоняние было в норме. При работе с несколькими случайными величинами мы можем определить события, соответствующие каждой возможной комбинации значений, которые эти величины могут принимать совместно. Функция вероятности, присваивающая вероятность каждой из таких комбинаций (например, :math:`A=a` и :math:`B=b`), называется *совместной вероятностью* и просто возвращает вероятность пересечения соответствующих подмножеств пространства элементарных исходов. *Совместная вероятность* события, при котором случайные величины :math:`A` и :math:`B` принимают значения :math:`a` и :math:`b` соответственно, обозначается как :math:`P(A = a, B = b)`, где запятая означает «и». Обратите внимание, что для любых значений :math:`a` и :math:`b` следует, что .. math:: P(A=a, B=b) \leq P(A=a) \textrm{ and } P(A=a, B=b) \leq P(B = b), поскольку для того, чтобы произошли :math:`A=a` и :math:`B=b`, должно произойти :math:`A=a` *и* :math:`B=b`. Интересно, что совместная вероятность содержит всю информацию, которую можно получить об этих случайных величинах в вероятностном смысле, и позволяет вычислить многие другие полезные величины, включая восстановление индивидуальных распределений :math:`P(A)` и :math:`P(B)`. Чтобы получить :math:`P(A=a)`, достаточно просуммировать :math:`P(A=a, B=v)` по всем значениям :math:`v`, которые может принимать случайная величина :math:`B`: :math:`P(A=a) = \sum_v P(A=a, B=v)`. Отношение :math:`\frac{P(A=a, B=b)}{P(A=a)} \leq 1` оказывается чрезвычайно важным. Оно называется *условной вероятностью* и обозначается символом “:math:`\mid`”: .. math:: P(B=b \mid A=a) = P(A=a,B=b)/P(A=a). Она показывает новую вероятность, связанную с событием :math:`B=b`, при условии, что произошло событие :math:`A=a`. Мы можем рассматривать эту условную вероятность как ограничение внимания только на подмножестве пространства элементарных событий, соответствующем событию :math:`A=a`, с последующей нормировкой так, чтобы сумма всех вероятностей равнялась 1. Условные вероятности по сути являются обычными вероятностями, поэтому они удовлетворяют всем аксиомам, при условии, что мы берем условные вероятности всех величин при одном и том же событии, тем самым ограничивая внимание одним и тем же пространством элементарных событий. Например, для непересекающихся событий :math:`\mathcal{B}` и :math:`\mathcal{B}'` выполняется соотношение :math:`P(\mathcal{B} \cup \mathcal{B}' \mid A = a) = P(\mathcal{B} \mid A = a) + P(\mathcal{B}' \mid A = a)`. Используя определение условной вероятности, мы можем вывести знаменитый результат, известный как *теорема Байеса*. По построению имеем :math:`P(A, B) = P(B\mid A) P(A)` и :math:`P(A, B) = P(A\mid B) P(B)`. Объединяя оба уравнения, получаем :math:`P(B\mid A) P(A) = P(A\mid B) P(B)`, а следовательно .. math:: P(A \mid B) = \frac{P(B\mid A) P(A)}{P(B)}. Это простое уравнение имеет глубокие последствия, поскольку оно позволяет изменить порядок условностей. Если мы умеем оценивать :math:`P(B\mid A)`, :math:`P(A)` и :math:`P(B)`, то можем оценить и :math:`P(A\mid B)`. Часто нам проще оценить один из этих членов напрямую, а другой — нет, и в таких случаях на помощь приходит теорема Байеса. Например, если нам известны распространённость симптомов при определённом заболевании, а также общая распространённость самого заболевания и симптомов, мы можем определить вероятность наличия заболевания у человека на основе его симптомов. В некоторых случаях у нас может не быть прямого доступа к :math:`P(B)`, например, к распространённости симптомов. В этом случае удобно использовать упрощённую версию теоремы Байеса: .. math:: P(A \mid B) \propto P(B \mid A) P(A). Поскольку мы знаем, что :math:`P(A \mid B)` должно быть нормировано на :math:`1`, т. е. :math:`\sum_a P(A=a \mid B) = 1`, мы можем использовать его для вычисления .. math:: P(A \mid B) = \frac{P(B \mid A) P(A)}{\sum_a P(B \mid A=a) P(A = a)}. В байесовской статистике мы рассматриваем наблюдателя как субъекта, обладающего некоторыми (субъективными) априорными убеждениями о правдоподобии доступных гипотез, закодированными в *априорном распределении* :math:`P(H)`, и *функцией правдоподобия*, которая показывает, насколько вероятно наблюдение любого значения собранных данных для каждой из гипотез в классе :math:`P(E \mid H)`. Теорема Байеса тогда интерпретируется как указание того, как обновить начальное *априорное распределение* :math:`P(H)` с учётом имеющихся данных :math:`E`, чтобы получить *апостериорное распределение* убеждений :math:`P(H \mid E) = \frac{P(E \mid H) P(H)}{P(E)}`. Неформально это можно сформулировать как «апостериорное распределение равно априорному распределению, умноженному на правдоподобие и деленному на вероятность данных». Поскольку вероятность данных :math:`P(E)` одинакова для всех гипотез, нам достаточно просто нормировать значения по множеству гипотез. Заметим, что :math:`\sum_a P(A=a \mid B) = 1` также позволяет нам *маргинализовать* случайные величины. То есть мы можем исключать переменные из совместного распределения, как в :math:`P(A, B)`. В конце концов, справедливо следующее .. math:: \sum_a P(B \mid A=a) P(A=a) = \sum_a P(B, A=a) = P(B). Независимость — это ещё одно фундаментально важное понятие, которое составляет основу многих ключевых идей в статистике. Проще говоря, две случайные величины являются *независимыми*, если условие на значение :math:`A` не приводит к изменению распределения вероятностей, связанного со :math:`B`, и наоборот. Более строго, независимость, обозначаемая как :math:`A \perp B`, требует, чтобы выполнялось условие :math:`P(A \mid B) = P(A)`, и, следовательно, условие :math:`P(A,B) = P(A \mid B) P(B) = P(A) P(B)`. Независимость часто является обоснованным допущением. Например, если случайная величина :math:`A` представляет собой результат подбрасывания одной честной монеты, а случайная величина :math:`B` — результат подбрасывания другой, то знание того, что :math:`A` выпал орлом, не должно влиять на вероятность того, что :math:`B` также выпадет орлом. Независимость особенно полезна, когда она соблюдается при последовательной выборке данных из некоторого лежащего в основе распределения (что позволяет делать строгие статистические выводы), или когда она выполняется между различными переменными в наших данных, что позволяет использовать более простые модели, отражающие эту структуру независимости. С другой стороны, оценка зависимостей между случайными величинами часто является самой целью обучения. Мы стремимся оценить вероятность заболевания при наличии симптомов именно потому, что полагаем, что заболевания и симптомы *не* являются независимыми. Заметим, что поскольку условные вероятности являются корректными вероятностями, понятия независимости и зависимости применимы и к ним. Две случайные величины :math:`A` и :math:`B` *условно независимы* при условии третьей случайной величины :math:`C`, если и только если :math:`P(A, B \mid C) = P(A \mid C)P(B \mid C)`. Интересно, что две переменные могут быть независимыми в целом, но становиться зависимыми при условии третьей. Это часто происходит, когда две случайные величины :math:`A` и :math:`B` соответствуют причинам некоторой третьей переменной :math:`C`. Например, переломы костей и рак легких могут быть независимы в общей популяции, но если мы условимся рассматривать только тех, кто находится в больнице, то можем обнаружить, что переломы костей отрицательно коррелируют с раком легких. Это связано с тем, что перелом кости *объясняет* присутствие человека в больнице и тем самым снижает вероятность того, что он оказался там из-за рака легких. И наоборот, две зависимые случайные величины могут стать независимыми при условии фиксации третьей. Это часто происходит, когда два изначально не связанных события имеют общую причину. Размер обуви и уровень чтения сильно коррелируют среди учеников начальной школы, но эта корреляция исчезает, если мы учтем возраст. .. _subsec_probability_hiv_app: Пример ------ Давайте проверим наши навыки. Предположим, что врач проводит пациенту тест на ВИЧ. Этот тест достаточно точен: вероятность ложноположительного результата для здорового пациента составляет всего 1%, то есть у здоровых людей тест показывает положительный результат в 1% случаев. Кроме того, тест никогда не пропускает ВИЧ, если он действительно присутствует. Мы используем :math:`D_1 \in \{0, 1\}` для обозначения диагноза (:math:`0` — отрицательный, :math:`1` — положительный) и :math:`H \in \{0, 1\}` для обозначения статуса ВИЧ. ========================= =========== =========== Условная вероятность :math:`H=1` :math:`H=0` ========================= =========== =========== :math:`P(D_1 = 1 \mid H)` 1 0.01 :math:`P(D_1 = 0 \mid H)` 0 0.99 ========================= =========== =========== Обратите внимание, что суммы по столбцам равны 1 (в то время как суммы по строкам — нет), поскольку это условные вероятности. Вычислим вероятность того, что у пациента есть ВИЧ, если тест оказался положительным, т. е. :math:`P(H = 1 \mid D_1 = 1)`. Интуитивно понятно, что это будет зависеть от распространённости заболевания, поскольку это влияет на количество ложных тревог. Предположим, что в популяции заболевание встречается редко, например, :math:`P(H=1) = 0.0015`. Чтобы применить теорему Байеса, нам необходимо использовать маргинализацию для определения .. math:: \begin{aligned} P(D_1 = 1) =& P(D_1=1, H=0) + P(D_1=1, H=1) \\ =& P(D_1=1 \mid H=0) P(H=0) + P(D_1=1 \mid H=1) P(H=1) \\ =& 0.011485. \end{aligned} Это приводит нас к .. math:: P(H = 1 \mid D_1 = 1) = \frac{P(D_1=1 \mid H=1) P(H=1)}{P(D_1=1)} = 0.1306. Другими словами, вероятность того, что пациент действительно болен ВИЧ, составляет всего 13,06%, несмотря на то, что тест довольно точен. Как мы видим, вероятность может быть контринтуитивной. Что должен сделать пациент, получив такие пугающие новости? Скорее всего, он попросит врача провести ещё один тест, чтобы прояснить ситуацию. Второй тест имеет другие характеристики и не так хорош, как первый. ========================= =========== =========== Условная вероятность :math:`H=1` :math:`H=0` ========================= =========== =========== :math:`P(D_2 = 1 \mid H)` 0.98 0.03 :math:`P(D_2 = 0 \mid H)` 0.02 0.97 ========================= =========== =========== К сожалению, второй тест тоже дал положительный результат. Вычислим необходимые вероятности для применения теоремы Байеса, предполагая условную независимость: .. math:: \begin{aligned} P(D_1 = 1, D_2 = 1 \mid H = 0) & = P(D_1 = 1 \mid H = 0) P(D_2 = 1 \mid H = 0) =& 0.0003, \\ P(D_1 = 1, D_2 = 1 \mid H = 1) & = P(D_1 = 1 \mid H = 1) P(D_2 = 1 \mid H = 1) =& 0.98. \end{aligned} Теперь мы можем применить маргинализацию, чтобы получить вероятность того, что оба теста дадут положительный результат: .. math:: \begin{aligned} &P(D_1 = 1, D_2 = 1)\\ &= P(D_1 = 1, D_2 = 1, H = 0) + P(D_1 = 1, D_2 = 1, H = 1) \\ &= P(D_1 = 1, D_2 = 1 \mid H = 0)P(H=0) + P(D_1 = 1, D_2 = 1 \mid H = 1)P(H=1)\\ &= 0.00176955. \end{aligned} Наконец, вероятность того, что у пациента ВИЧ, при условии, что оба теста положительны, равна .. math:: P(H = 1 \mid D_1 = 1, D_2 = 1) = \frac{P(D_1 = 1, D_2 = 1 \mid H=1) P(H=1)}{P(D_1 = 1, D_2 = 1)} = 0.8307. То есть второй тест позволил нам значительно повысить уверенность в том, что всё не так хорошо. Несмотря на то что второй тест был существенно менее точным, чем первый, он всё равно значительно улучшил нашу оценку. Предположение о том, что оба теста условно независимы друг от друга, было ключевым для возможности получить более точную оценку. Рассмотрим крайний случай, когда мы проводим один и тот же тест дважды. В этой ситуации мы ожидаем одинаковый результат каждый раз, следовательно, повторное проведение того же теста не даёт дополнительной информации. Внимательный читатель мог заметить, что диагностика вела себя как классификатор, скрывающийся на виду, где наша способность определить, здоров ли пациент, возрастает по мере получения большего количества признаков (результатов тестов). Ожидаемые значения ------------------ Часто для принятия решений недостаточно просто рассматривать вероятности, присвоенные отдельным событиям; необходимо объединять их в полезные агрегаты, которые могут служить руководством к действию. Например, когда случайные величины принимают непрерывные скалярные значения, нам часто важно знать, какое значение следует ожидать *в среднем*. Эта величина формально называется *математическим ожиданием*. Если мы занимаемся инвестициями, первой интересующей нас величиной может быть доходность, которую мы можем ожидать, усредняя по всем возможным исходам (с учётом соответствующих вероятностей). Например, предположим, что с вероятностью 50% инвестиция может полностью провалиться, с вероятностью 40% она может принести доходность 2\ :math:`\times`, а с вероятностью 10% — доходность 10\ :math:`\times` 10\ :math:`\times`. Чтобы рассчитать ожидаемую доходность, просуммируем все возможные значения доходности, умножив каждое на вероятность его наступления. Это дает математическое ожидание :math:`0.5 \cdot 0 + 0.4 \cdot 2 + 0.1 \cdot 10 = 1.8`. Таким образом, ожидаемая доходность составляет 1.8\ :math:`\times`. В общем случае *математическое ожидание* (или среднее значение) случайной величины :math:`X` определяется как .. math:: E[X] = E_{x \sim P}[x] = \sum_{x} x P(X = x). Аналогично для плотностей вероятности получаем :math:`E[X] = \int x \;dp(x)`. Иногда нас интересует математическое ожидание некоторой функции от :math:`x`. Мы можем вычислить эти математические ожидания как .. math:: E_{x \sim P}[f(x)] = \sum_x f(x) P(x) \textrm{ and } E_{x \sim P}[f(x)] = \int f(x) p(x) \;dx для дискретных вероятностей и плотностей соответственно. Возвращаясь к примеру с инвестициями, приведённому выше, :math:`f` может представлять собой *полезность* (удовлетворение), связанную с доходом. Поведенческие экономисты давно отмечают, что люди испытывают большую неопределенность от потери денег, чем полезность, получаемую от заработка одного доллара относительно их базового уровня. Кроме того, ценность денег имеет сублинейный характер. Наличие 100 тысяч долларов по сравнению с нулем может означать разницу между оплатой аренды, хорошим питанием и качественным медицинским обслуживанием versus страданиями бездомности. С другой стороны, выгоды от наличия 200 тысяч по сравнению с 100 тысячами менее значительны. Подобные рассуждения мотивируют клише о том, что “полезность денег логарифмична”. Если бы полезность, связанная с полной потерей, равнялась :math:`-1`, а полезности, соответствующие доходности :math:`1`, :math:`2` и :math:`10`, составляли :math:`1`, :math:`2` и :math:`4` соответственно, то ожидаемая полезность инвестиций составила бы :math:`0.5 \cdot (-1) + 0.4 \cdot 2 + 0.1 \cdot 4 = 0.7` (ожидаемая потеря полезности на 30%). Если бы ваша функция полезности действительно выглядела так, вам, возможно, было бы выгоднее оставить деньги в банке. Для принятия финансовых решений нам также может потребоваться оценить, насколько *рискованной* является инвестиция. В этом случае нас интересует не только математическое ожидание, но и то, насколько сильно фактические значения обычно *отклоняются* от этого значения. Обратите внимание, что мы не можем просто взять математическое ожидание разности между фактическим и ожидаемым значениями. Это связано с тем, что математическое ожидание разности равно разности математических ожиданий, то есть :math:`E[X - E[X]] = E[X] - E[E[X]] = 0`. Однако мы можем рассмотреть математическое ожидание любой неотрицательной функции этой разности. *Дисперсия* случайной величины вычисляется как математическое ожидание *квадратов* разностей: .. math:: \textrm{Var}[X] = E\left[(X - E[X])^2\right] = E[X^2] - E[X]^2. Это равенство следует из раскрытия :math:`(X - E[X])^2 = X^2 - 2 X E[X] + E[X]^2` и взятия математического ожидания для каждого слагаемого. Квадратный корень из дисперсии — ещё одна полезная величина, называемая *стандартным отклонением*. Хотя дисперсия и стандартное отклонение несут одну и ту же информацию (одно можно вычислить по другому), стандартное отклонение обладает приятным свойством: оно выражено в тех же единицах, что и исходная величина, описываемая случайной величиной. Наконец, дисперсия функции случайной величины определяется аналогичным образом как .. math:: \textrm{Var}_{x \sim P}[f(x)] = E_{x \sim P}[f^2(x)] - E_{x \sim P}[f(x)]^2. Возвращаясь к примеру с инвестициями, мы теперь можем вычислить дисперсию. Она задаётся выражением :math:`0.5 \cdot 0 + 0.4 \cdot 2^2 + 0.1 \cdot 10^2 - 1.8^2 = 8.36`. По всем практическим меркам это рискованная инвестиция. Обратите внимание, что по математическому соглашению среднее значение и дисперсию часто обозначают как :math:`\mu` и :math:`\sigma^2`. Это особенно характерно, когда мы используем их для параметризации гауссовского распределения. Так же как мы ввели понятия математического ожидания и дисперсии для *скалярных* случайных величин, мы можем сделать то же самое для случайных величин, принимающих векторные значения. Математическое ожидание вычисляется просто, поскольку его можно применять покомпонентно. Например, :math:`\boldsymbol{\mu} \stackrel{\textrm{def}}{=} E_{\mathbf{x} \sim P}[\mathbf{x}]` имеет координаты :math:`\mu_i = E_{\mathbf{x} \sim P}[x_i]`. *Ковариации* устроены сложнее. Мы определяем их, находя математическое ожидание *внешнего произведения* разности между случайными величинами и их средними значениями: .. math:: \boldsymbol{\Sigma} \stackrel{\textrm{def}}{=} \textrm{Cov}_{\mathbf{x} \sim P}[\mathbf{x}] = E_{\mathbf{x} \sim P}\left[(\mathbf{x} - \boldsymbol{\mu}) (\mathbf{x} - \boldsymbol{\mu})^\top\right]. Эта матрица :math:`\boldsymbol{\Sigma}` называется ковариационной матрицей. Проще всего понять её действие, рассмотрев некоторый вектор :math:`\mathbf{v}` того же размера, что и :math:`\mathbf{x}`. Отсюда следует, что .. math:: \mathbf{v}^\top \boldsymbol{\Sigma} \mathbf{v} = E_{\mathbf{x} \sim P}\left[\mathbf{v}^\top(\mathbf{x} - \boldsymbol{\mu}) (\mathbf{x} - \boldsymbol{\mu})^\top \mathbf{v}\right] = \textrm{Var}_{x \sim P}[\mathbf{v}^\top \mathbf{x}]. Таким образом, :math:`\boldsymbol{\Sigma}` позволяет нам вычислить дисперсию любой линейной функции от :math:`\mathbf{x}` с помощью простого матричного умножения. Элементы вне главной диагонали показывают, насколько координаты коррелированы: значение 0 означает отсутствие корреляции, а большее положительное значение указывает на более сильную корреляцию. Обсуждение ---------- В машинном обучении существует множество источников неопределённости! Мы можем быть неуверенны в значении метки при заданном входе. Мы можем быть неуверенны в оценке значения параметра. Мы можем даже сомневаться в том, что данные, поступающие на этапе развертывания, имеют то же распределение, что и обучающие данные. Под *аллоторной неопределённостью* мы понимаем неопределённость, присущую самой задаче и обусловленную истинной случайностью, не учитываемой наблюдаемыми переменными. Под *эпистемической неопределённостью* мы понимаем неопределённость относительно параметров модели, вид неопределённости, который мы надеемся уменьшить, собрав больше данных. У нас может быть эпистемическая неопределённость относительно вероятности выпадения орла при подбрасывании монеты, но даже зная эту вероятность, мы всё равно остаёмся с аллоторной неопределённостью относительно исхода любого будущего броска. Как бы долго мы ни наблюдали за тем, как кто-то подбрасывает честную монету, мы никогда не сможем быть более или менее чем на 50% уверены, что следующий бросок выпадет орлом. Эти термины происходят из механического моделирования (см., например, :cite:t:`Der-Kiureghian.Ditlevsen.2009` для обзора этого аспекта `количественной оценки неопределённости `__). Однако стоит отметить, что эти термины представляют собой некоторое злоупотребление языком. Термин *эпистемический* относится ко всему, что касается *знания*, и поэтому в философском смысле любая неопределённость является эпистемической. Мы видели, что выборка данных из некоторого неизвестного распределения вероятностей может предоставить нам информацию, которую можно использовать для оценки параметров распределения, породившего эти данные. Однако скорость, с которой это возможно, может быть довольно низкой. В нашем примере с подбрасыванием монеты (и во многих других) мы не можем добиться лучшего результата, чем использование оценщиков, сходящихся со скоростью :math:`1/\sqrt{n}`, где :math:`n` — это размер выборки (например, количество подбрасываний). Это означает, что при увеличении числа наблюдений с 10 до 1000 (что обычно является вполне выполнимой задачей) неопределенность снижается в десять раз, тогда как следующие 1000 наблюдений дают лишь незначительный эффект, уменьшая неопределенность всего в 1,41 раза. Это устойчивая особенность машинного обучения: хотя часто можно легко добиться улучшений, для дальнейших улучшений требуется очень большое количество данных, а вместе с ним и огромные вычислительные ресурсы. Эмпирический обзор этого факта для крупномасштабных языковых моделей см. в :cite:t:`Revels.Lubin.Papamarkou.2016`. Мы также усовершенствовали наш язык и инструменты для статистического моделирования. В процессе этого мы изучили условные вероятности и одно из самых важных уравнений в статистике — теорему Байеса. Это эффективный инструмент для разделения информации, передаваемой данными через член правдоподобия :math:`P(B \mid A)`, который показывает, насколько хорошо наблюдения :math:`B` соответствуют выбранному набору параметров :math:`A`, и априорного распределения :math:`P(A)`, которое определяет, насколько правдоподобным был первоначальный выбор :math:`A`. В частности, мы увидели, как это правило можно применить для присвоения вероятностей диагнозам, основываясь на эффективности теста *и* на распространенности самого заболевания (т. е. нашей априорной вероятности). Наконец, мы рассмотрели первый набор нетривиальных вопросов, касающихся влияния конкретного распределения вероятностей, а именно математического ожидания и дисперсии. Хотя для распределения вероятностей существует гораздо больше моментов, чем просто линейные и квадратичные, эти два уже дают хорошее представление о возможном поведении распределения. Например, `неравенство Чебышёва `__ утверждает, что :math:`P(|X - \mu| \geq k \sigma) \leq 1/k^2`, где :math:`\mu` — математическое ожидание, :math:`\sigma^2` — дисперсия распределения, а :math:`k > 1` — параметр доверия, выбранный нами. Это означает, что выборки из распределения с вероятностью не менее 50% попадают в интервал :math:`[-\sqrt{2} \sigma, \sqrt{2} \sigma]`, центрированный относительно математического ожидания. Упражнения ---------- 1. Приведите пример, в котором наблюдение за большим объёмом данных может снизить неопределённость относительно результата до произвольно малого уровня. 2. Приведите пример, в котором увеличение объёма наблюдаемых данных снижает неопределённость лишь до определённого предела, после чего дальнейшее уменьшение неопределённости становится невозможным. Объясните, почему это происходит, и укажите, где, по вашему мнению, находится этот предел. 3. Мы эмпирически продемонстрировали сходимость к среднему при подбрасывании монеты. Вычислите дисперсию оценки вероятности выпадения орла после извлечения :math:`n` выборок. 1. Как дисперсия зависит от количества наблюдений? 2. Используйте неравенство Чебышёва для оценки отклонения от математического ожидания. 3. Как это соотносится с центральной предельной теоремой? 4. Предположим, что мы выбираем :math:`m` выборок :math:`x_i` из распределения вероятностей с нулевым средним и единичной дисперсией. Вычислите средние значения :math:`z_m \stackrel{\textrm{def}}{=} m^{-1} \sum_{i=1}^m x_i`. Можно ли применить неравенство Чебышёва к каждой выборке :math:`z_m` независимо? Почему нет? 5. Рассмотрим два события с вероятностями :math:`P(\mathcal{A})` и :math:`P(\mathcal{B})`. Вычислите верхние и нижние границы для :math:`P(\mathcal{A} \cup \mathcal{B})` и :math:`P(\mathcal{A} \cap \mathcal{B})`. Подсказка: изобразите ситуацию с помощью `диаграммы Венна `__. 6. Предположим, у нас есть последовательность случайных величин, например :math:`A`, :math:`B` и :math:`C`, где :math:`B` зависит только от :math:`A`, а :math:`C` зависит только от :math:`B`. Можете ли вы упростить совместную вероятность :math:`P(A, B, C)`? Подсказка: это `марковская цепь `__. 7. В :numref:`subsec_probability_hiv_app` предположим, что результаты двух тестов не являются независимыми. В частности, предположим, что каждый тест в отдельности имеет уровень ложноположительных срабатываний 10% и уровень ложноотрицательных срабатываний 1%. То есть предположим, что :math:`P(D =1 \mid H=0) = 0.1` и что :math:`P(D = 0 \mid H=1) = 0.01`. Кроме того, предположим, что для :math:`H = 1` (инфицированных) результаты тестов условно независимы, то есть что :math:`P(D_1, D_2 \mid H=1) = P(D_1 \mid H=1) P(D_2 \mid H=1)`, но для здоровых пациентов результаты связаны через :math:`P(D_1 = D_2 = 1 \mid H=0) = 0.02`. 1. Составьте таблицу совместных вероятностей для :math:`D_1` и :math:`D_2`, учитывая :math:`H=0`, на основе имеющейся у вас информации. 2. Выведите вероятность того, что у пациента заболевание (:math:`H=1`), после того как один тест дал положительный результат. Вы можете использовать ту же базовую вероятность :math:`P(H=1) = 0.0015`, что и ранее. 3. Выведите вероятность того, что у пациента заболевание (:math:`H=1`), после того как оба теста показали положительный результат. 8. Предположим, что вы управляющий активами инвестиционного банка и у вас есть выбор из :math:`s_i` акций для инвестирования. Сумма весов :math:`\alpha_i` всех акций в вашем портфеле должна составлять :math:`1`. Акции имеют среднюю доходность :math:`\boldsymbol{\mu} = E_{\mathbf{s} \sim P}[\mathbf{s}]` и ковариацию :math:`\boldsymbol{\Sigma} = \textrm{Cov}_{\mathbf{s} \sim P}[\mathbf{s}]`. 1. Вычислите ожидаемую доходность для заданного портфеля :math:`\boldsymbol{\alpha}`. 2. Если вы хотите максимизировать доходность портфеля, как следует выбрать инвестиции? 3. Вычислите *дисперсию* портфеля. 4. Сформулируйте задачу оптимизации, направленную на максимизацию доходности при ограничении дисперсии сверху. Это `портфель Марковица `__ — работа, отмеченная Нобелевской премией :cite:`Mangram.2013`. Для её решения потребуется решатель задач квадратичного программирования, что выходит далеко за рамки данной книги. `Обсуждения `__