Введение в гауссовские процессы =============================== Во многих случаях машинное обучение сводится к оценке параметров по данным. Эти параметры часто многочисленны и относительно плохо интерпретируемы — например, веса нейронной сети. Гауссовские процессы, напротив, предоставляют механизм для прямого рассуждения о высокоуровневых свойствах функций, которые могут описывать наши данные. Например, мы можем иметь представление о том, быстро ли изменяются эти функции, являются ли они периодическими, обладают ли условной независимостью или инвариантностью к сдвигу. Гауссовские процессы позволяют нам легко включать эти свойства в модель, непосредственно задавая гауссовское распределение над значениями функций, способными описывать наши данные. Давайте получим представление о том, как работают гауссовские процессы, начав с нескольких примеров. Предположим, мы наблюдаем следующий набор данных целевых значений регрессии (выходов) :math:`y`, проиндексированных входными данными :math:`x`. В качестве примера целевые значения могут представлять собой изменения концентрации углекислого газа, а входные данные — моменты времени, в которые эти значения были зафиксированы. Каковы некоторые особенности данных? Как быстро они, по-видимому, изменяются? Собраны ли точки данных через регулярные интервалы или есть пропущенные входные значения? Как бы вы заполнили пропущенные области или осуществляли прогноз до момента :math:`x=25`? .. figure:: ../img/gp-observed-data.svg Наблюдаемые данные. Чтобы подогнать гауссов процесс к данным, мы начинаем с задания априорного распределения над классами функций, которые мы считаем разумными. Здесь мы приводим несколько примеров функций из гауссовского процесса. Кажется ли это априорное распределение разумным? Обратите внимание, что мы ищем не функции, точно соответствующие нашему набору данных, а задаем разумные высокоуровневые свойства решений, такие как скорость их изменения в зависимости от входных данных. Обратите внимание, что код для воспроизведения всех графиков в этой тетради будет представлен в следующих разделах, посвященных априорным распределениям и выводу. .. figure:: ../img/gp-sample-prior-functions.svg Примеры функций из априорного распределения, которые мы хотим представить с помощью нашей модели. Условившись на данных, мы можем использовать это априорное распределение для вывода апостериорного распределения по функциям, которые могут соответствовать данным. Здесь мы показываем примеры апостериорных функций. .. figure:: ../img/gp-sample-posterior-functions.svg Примеры функций из апостериорного распределения после наблюдения за данными. Мы видим, что каждая из этих функций полностью согласуется с нашими данными, точно проходя через каждое наблюдение. Чтобы использовать эти примеры из апостериорного распределения для предсказаний, мы можем усреднить значения каждой возможной функции-примера из апостериорного распределения, чтобы получить кривую ниже, выделенную толстой синей линией. Обратите внимание, что нам на самом деле не нужно брать бесконечное число примеров для вычисления этого математического ожидания; как мы увидим позже, мы можем вычислить математическое ожидание в замкнутой форме. .. figure:: ../img/gp-posterior-samples.svg Апостериорные выборки вместе со средним апостериорного распределения, которое можно использовать для точечных прогнозов, выделены синим цветом. Нам также может потребоваться представление о неопределенности, чтобы понимать, насколько уверенно можно относиться к нашим предсказаниям. Интуитивно понятно, что неопределенность должна быть выше там, где наблюдается большая изменчивость примеров из апостериорного распределения функций, поскольку это указывает на то, что истинная функция может принимать гораздо больше возможных значений. Такой тип неопределенности называется *эпистемической неопределенностью*, которая представляет собой *уменьшаемую неопределенность*, связанную с недостатком информации. По мере получения новых данных этот тип неопределенности исчезает, так как количество решений, согласующихся с нашими наблюдениями, становится все меньше. Как и в случае с апостериорным средним, мы можем вычислить апостериорную дисперсию (изменчивость этих функций в апостериорном распределении) в замкнутой форме. С помощью заштрихованной области мы показываем удвоенное апостериорное стандартное отклонение по обе стороны от среднего, создавая *достоверный интервал*, который с вероятностью 95% содержит истинное значение функции для любого входа :math:`x`. .. figure:: ../img/gp-posterior-samples-95.svg Апостериорные выборки, включая 95%-ный достоверный интервал. График выглядит более аккуратным, если убрать апостериорные выборки и оставить только визуализацию данных, апостериорного среднего и 95%-го достоверного интервала. Обратите внимание, как неопределенность возрастает по мере удаления от данных — это свойство эпистемической неопределенности. .. figure:: ../img/gp-point-predictions.svg Точечные прогнозы и достоверные интервалы. Свойства гауссовского процесса, которые мы использовали для подгонки данных, сильно контролируются так называемой *ковариационной функцией*, также известной как *ядро*. Ковариационная функция, которую мы использовали, называется *RBF-ядром (радиальной базисной функцией)*, и имеет вид .. math:: k_{\textrm{RBF}}(x,x') = \textrm{Cov}(f(x),f(x')) = a^2 \exp\left(-\frac{1}{2\ell^2}||x-x'||^2\right) Гиперпараметры этого ядра имеют наглядную интерпретацию. Параметр амплитуды :math:`a` управляет вертикальным масштабом, в пределах которого изменяется функция, а параметр длины :math:`\ell` контролирует скорость изменения (извилистость) функции. Большие значения :math:`a` приводят к большим значениям функции, а большие значения :math:`\ell` — к более плавно изменяющимся функциям. Давайте посмотрим, как изменяются наши примеры априорных и апостериорных функций при варьировании :math:`a` и :math:`\ell`. Параметр *length-scale* оказывает особенно сильное влияние на предсказания и неопределённость гауссовского процесса. При :math:`||x-x'|| = \ell` ковариация между парой значений функции равна :math:`a^2\exp(-0.5)`. На расстояниях, больших, чем :math:`\ell`, значения функции становятся практически некоррелированными. Это означает, что если мы хотим сделать предсказание в точке :math:`x_*`, то значения функции с аргументами :math:`x`, такими что :math:`||x-x'||>\ell`, не окажут сильного влияния на наши предсказания. Рассмотрим, как изменение длины корреляции влияет на выборки априорных и апостериорных функций, а также на доверительные интервалы. Приведённые выше аппроксимации используют длину корреляции :math:`2`. Теперь рассмотрим :math:`\ell = 0.1, 0.5, 2, 5, 10`. Длина корреляции :math:`0.1` очень мала по сравнению с диапазоном входного пространства, которое мы рассматриваем, :math:`25`. Например, значения функции в точках :math:`x=5` и :math:`x=10` будут практически некоррелированы при такой длине корреляции. С другой стороны, при длине корреляции :math:`10` значения функции в этих точках будут сильно коррелированы. Обратите внимание, что вертикальный масштаб на следующих рисунках меняется. |priorpoint1| |postpoint1| |priorpoint5| |postpoint5| |априорное распределение| |post2| |prior5| |post5| Заметим, что при увеличении длины масштаба «извилистость» функций уменьшается, а наша неопределённость снижается. Если длина масштаба мала, неопределённость быстро возрастает по мере удаления от данных, поскольку точки данных становятся менее информативными для определения значений функции. Теперь изменим параметр амплитуды, фиксируя длину корреляции на уровне :math:`2`. Обратите внимание, что вертикальный масштаб для выборок из априорного распределения остаётся неизменным, а для выборок из апостериорного распределения меняется, что позволяет наглядно увидеть как увеличение масштаба функции, так и её соответствие данным. |priorap1| |postapoint1| |image1| |posta2| |priora8| |posta8| Мы видим, что параметр амплитуды влияет на масштаб функции, но не на скорость её изменения. На этом этапе у нас также складывается ощущение, что обобщающая способность нашего метода будет зависеть от выбора разумных значений этих гиперпараметров. Значения :math:`\ell=2` и :math:`a=1`, по-видимому, обеспечивают адекватное соответствие данным, тогда как некоторые другие значения — нет. К счастью, существует надёжный и автоматический способ задания этих гиперпараметров с помощью так называемого *маргинального правдоподобия*, к которому мы вернёмся в ноутбуке по выводу. Итак, что же такое гауссовский процесс (GP)? Как мы уже говорили, GP утверждает, что любая совокупность значений функции :math:`f(x_1),\dots,f(x_n)`, индексированная любой совокупностью входных данных :math:`x_1,\dots,x_n`, имеет совместное многомерное гауссовское распределение. Вектор средних :math:`\mu` этого распределения задаётся *средней функцией*, которая обычно принимается равной константе или нулю. Матрица ковариаций этого распределения определяется *ядром*, вычисленным для всех пар входных данных :math:`x`. .. math:: \begin{bmatrix}f(x) \\f(x_1) \\ \vdots \\ f(x_n) \end{bmatrix}\sim \mathcal{N}\left(\mu, \begin{bmatrix}k(x,x) & k(x, x_1) & \dots & k(x,x_n) \\ k(x_1,x) & k(x_1,x_1) & \dots & k(x_1,x_n) \\ \vdots & \vdots & \ddots & \vdots \\ k(x_n, x) & k(x_n, x_1) & \dots & k(x_n,x_n) \end{bmatrix}\right) :label: eq_gp_prior Уравнение :eq:`eq_gp_prior` задаёт априорное распределение GP. Мы можем вычислить условное распределение :math:`f(x)` для любых :math:`x` при условии :math:`f(x_1), \dots, f(x_n)` — значений функции, которые мы наблюдали. Это условное распределение называется *апостериорным*, и именно его мы используем для прогнозирования. В частности, .. math:: f(x) | f(x_1), \dots, f(x_n) \sim \mathcal{N}(m,s^2) где .. math:: m = k(x,x_{1:n}) k(x_{1:n},x_{1:n})^{-1} f(x_{1:n}) .. math:: s^2 = k(x,x) - k(x,x_{1:n})k(x_{1:n},x_{1:n})^{-1}k(x,x_{1:n}) where :math:`k(x,x_{1:n})` is a :math:`1 \times n` vector formed by evaluating :math:`k(x,x_{i})` for :math:`i=1,\dots,n` and :math:`k(x_{1:n},x_{1:n})` is an :math:`n \times n` matrix formed by evaluating :math:`k(x_i,x_j)` for :math:`i,j = 1,\dots,n`. :math:`m` is what we can use as a point predictor for any :math:`x`, and :math:`s^2` is what we use for uncertainty: if we want to create an interval with a 95% probability that :math:`f(x)` is in the interval, we would use :math:`m \pm 2s`. The predictive means and uncertainties for all the above figures were created using these equations. The observed data points were given by :math:`f(x_1), \dots, f(x_n)` and chose a fine grained set of :math:`x` points to make predictions. Предположим, мы наблюдаем одну точку данных :math:`f(x_1)` и хотим определить значение :math:`f(x)` в некоторой точке :math:`x`. Поскольку :math:`f(x)` описывается гауссовским процессом, мы знаем, что совместное распределение для :math:`(f(x), f(x_1))` является гауссовским: .. math:: \begin{bmatrix} f(x) \\ f(x_1) \\ \end{bmatrix} \sim \mathcal{N}\left(\mu, \begin{bmatrix} k(x,x) & k(x, x_1) \\ k(x_1,x) & k(x_1,x_1) \end{bmatrix} \right) Выражение вне главной диагонали :math:`k(x,x_1) = k(x_1,x)` показывает, насколько коррелированными будут значения функции — то, насколько сильно :math:`f(x)` будет определяться через :math:`f(x_1)`. Мы уже видели, что если использовать большое значение длины масштаба по сравнению с расстоянием между :math:`x` и :math:`x_1`, :math:`||x-x_1||`, то значения функции будут сильно коррелированы. Мы можем визуализировать процесс определения :math:`f(x)` из :math:`f(x_1)` как в пространстве функций, так и в совместном распределении по :math:`f(x_1), f(x)`. Сначала рассмотрим случай, когда :math:`x` таково, что :math:`k(x,x_1) = 0.9`, и :math:`k(x,x)=1`, что означает умеренную корреляцию между значением :math:`f(x)` и значением :math:`f(x_1)`. В совместном распределении линии постоянного уровня вероятности будут относительно узкими эллипсами. Предположим, что мы наблюдаем :math:`f(x_1) = 1.2`. Чтобы учесть это значение :math:`f(x_1)`, мы можем провести горизонтальную линию на уровне :math:`1.2` на нашем графике плотности и увидеть, что значение :math:`f(x)` в основном ограничено диапазоном :math:`[0.64,1.52]`. Мы также построили этот график в пространстве функций, показав наблюдаемую точку :math:`f(x_1)` оранжевым цветом, а одно стандартное отклонение предиктивного распределения гауссовского процесса для :math:`f(x)` — синим цветом относительно среднего значения :math:`1.08`. |Контурные линии постоянной вероятности двумерной гауссовской плотности для :math:`f(x_1)` и :math:`f(x)` с :math:`k(x,x_1) = 0.9`.| |Предиктивное распределение гауссова процесса в пространстве функций на :math:`f(x)` при :math:`k(x,x_1) = 0.9`.| Теперь предположим, что у нас более сильная корреляция, :math:`k(x,x_1) = 0.95`. Эллипсы сузились ещё сильнее, и значение :math:`f(x)` ещё более сильно определяется значением :math:`f(x_1)`. Проведя горизонтальную линию на уровне :math:`1.2`, мы видим, что контуры для :math:`f(x)` поддерживают значения, в основном находящиеся в пределах :math:`[0.83, 1.45]`. Аналогично мы также показываем график в пространстве функций, где одна стандартная отклонение от среднего предиктивного значения составляет :math:`1.14`. |Контурные линии постоянной вероятности двумерной гауссовской плотности над :math:`f(x_1)` и :math:`f(x)` с :math:`k(x,x_1) = 0.95`.| |Предиктивное распределение гауссовского процесса в пространстве функций на :math:`f(x)`, при :math:`k(x,x_1)` = 0,95.| Мы видим, что предсказание, основанное на апостериорном среднем гауссовского процесса, ближе к :math:`1.2`, поскольку корреляция стала сильнее. Мы также замечаем, что наша неопределённость (погрешности) несколько уменьшилась. Несмотря на сильную корреляцию между значениями функции, наша неопределённость всё ещё довольно велика, потому что мы наблюдали лишь одну точку данных! Эта процедура позволяет нам получить апостериорное распределение для :math:`f(x)` при любом :math:`x`, независимо от количества наблюдаемых точек. Предположим, мы наблюдаем :math:`f(x_1), f(x_2)`. Теперь мы визуализируем апостериорное распределение для :math:`f(x)` в конкретной точке :math:`x=x'` функционального пространства. Точное распределение для :math:`f(x)` задаётся приведёнными выше уравнениями. :math:`f(x)` имеет гауссово распределение со средним .. math:: m = k(x,x_{1:3}) k(x_{1:3},x_{1:3})^{-1} f(x_{1:3}) и дисперсия .. math:: s^2 = k(x,x) - k(x,x_{1:3})k(x_{1:3},x_{1:3})^{-1}k(x,x_{1:3}) В этом вводном ноутбуке мы рассматривали наблюдения *без шума*. Как мы увидим, учесть шум наблюдений довольно просто. Если предположить, что данные генерируются скрытой безшумной функцией :math:`f(x)` плюс независимыми одинаково распределенными гауссовскими шумами :math:`\epsilon(x) \sim \mathcal{N}(0,\sigma^2)` с дисперсией :math:`\sigma^2`, то наша ковариационная функция просто принимает вид :math:`k(x_i,x_j) \to k(x_i,x_j) + \delta_{ij}\sigma^2`, где :math:`\delta_{ij} = 1` при :math:`i=j` и :math:`0` в остальных случаях. Мы уже начали формировать интуицию относительно того, как с помощью гауссовского процесса можно задать априорное и апостериорное распределения над решениями, а также как функция ядра влияет на свойства этих решений. В следующих ноутбуках мы подробно покажем, как задать априорное распределение гауссовского процесса, введём и выведем различные функции ядра, а затем разберём механику автоматического обучения гиперпараметров ядра и формирования апостериорного распределения гауссовского процесса для получения прогнозов. Хотя на привыкание к таким понятиям, как «распределения над функциями», требуется время и практика, сама механика вывода предиктивных уравнений гауссовского процесса на самом деле довольно проста, что облегчает отработку навыков и формирование интуитивного понимания этих концепций. Резюме ------ В типичном машинном обучении мы задаем функцию с некоторыми свободными параметрами (например, нейронную сеть и её веса) и сосредотачиваемся на оценке этих параметров, которые могут быть неинтерпретируемыми. В гауссовском процессе мы, напротив, рассуждаем непосредственно о распределениях над функциями, что позволяет нам анализировать высокоуровневые свойства решений. Эти свойства контролируются функцией ковариации (ядром), которая часто имеет несколько хорошо интерпретируемых гиперпараметров. К таким гиперпараметрам относится *масштаб длины*, который определяет, насколько быстро (насколько сильно колеблясь) ведут себя функции. Другой гиперпараметр — амплитуда, которая контролирует вертикальный масштаб, в пределах которого изменяются наши функции. Представление множества различных функций, которые могут подходить к данным, и их объединение в предиктивное распределение является отличительной особенностью байесовских методов. Поскольку вариативность между возможными решениями возрастает по мере удаления от данных, наша неопределенность интуитивно увеличивается при движении от данных. Гауссовский процесс представляет собой распределение над функциями, задавая многомерное нормальное (гауссовское) распределение для всех возможных значений функции. Гауссовские распределения удобно преобразовывать, чтобы найти распределение одного значения функции на основе значений любого набора других значений. Иными словами, если мы наблюдаем набор точек, то можем условиться на этих точках и вывести распределение того, как может выглядеть значение функции в любом другом входном пункте. То, как мы моделируем корреляции между этими точками, определяется функцией ковариации и именно она задает обобщающую способность гауссовского процесса. Хотя для привыкания к гауссовским процессам требуется время, с ними легко работать, они находят множество применений и помогают нам понимать и разрабатывать другие классы моделей, такие как нейронные сети. Упражнения ---------- 1. В чем разница между эпистемической неопределенностью и неопределенностью наблюдений? 2. Помимо скорости изменения и амплитуды, какие ещё свойства функций мы могли бы рассмотреть и какие примеры из реальной жизни можно привести для функций с такими свойствами? 3. Рассмотренная нами ковариационная функция RBF утверждает, что ковариации (и корреляции) между наблюдениями уменьшаются с увеличением расстояния между ними в пространстве входных данных (например, в пространстве пространственных координат и т. д.). Является ли это разумным предположением? Почему да или почему нет? 4. Is a sum of two Gaussian variables Gaussian? Is a product of two Gaussian variables Gaussian? If (a,b) have a joint Gaussian distribution, is a|b (a given b) Gaussian? Is a Gaussian? 5. Повторите упражнение, в котором мы наблюдали точку данных в :math:`f(x_1) = 1.2`, но теперь предположим, что мы дополнительно наблюдаем :math:`f(x_2) = 1.4`. Пусть :math:`k(x,x_1) = 0.9` и :math:`k(x,x_2) = 0.8`. Будем ли мы более или менее уверены в значении :math:`f(x)`, чем когда наблюдали только :math:`f(x_1)`? Каковы среднее значение и 95% достоверный интервал для значения :math:`f(x)` теперь? 6. Как вы думаете, увеличение оценки шума наблюдений приведет к росту или снижению оценки длины масштаба функции истинного распределения? 7. По мере удаления от данных предположим, что неопределенность в нашем предиктивном распределении возрастает до определённого момента, а затем перестает увеличиваться. Почему это может происходить? .. |priorpoint1| image:: ../img/gp-priorpoint1.svg .. |postpoint1| image:: ../img/gp-postpoint1.svg .. |priorpoint5| image:: ../img/gp-priorpoint5.svg .. |postpoint5| image:: ../img/gp-postpoint5.svg .. |априорное распределение| image:: ../img/gp-prior2.svg .. |post2| image:: ../img/gp-post2.svg .. |prior5| image:: ../img/gp-prior5.svg .. |post5| image:: ../img/gp-post5.svg .. |priorap1| image:: ../img/gp-priorap1.svg .. |postapoint1| image:: ../img/gp-postapoint1.svg .. |image1| image:: ../img/gp-priora2.svg .. |posta2| image:: ../img/gp-posta2.svg .. |priora8| image:: ../img/gp-priora8.svg .. |posta8| image:: ../img/gp-posta8.svg .. |Контурные линии постоянной вероятности двумерной гауссовской плотности для :math:`f(x_1)` и :math:`f(x)` с :math:`k(x,x_1) = 0.9`.| image:: https://user-images.githubusercontent.com/6753639/206867364-b4707db5-0c2e-4ae4-a412-8292bca4d08d.svg .. |Предиктивное распределение гауссова процесса в пространстве функций на :math:`f(x)` при :math:`k(x,x_1) = 0.9`.| image:: https://user-images.githubusercontent.com/6753639/206867367-3815720c-93c8-4b4b-80e7-296db1d3553b.svg .. |Контурные линии постоянной вероятности двумерной гауссовской плотности над :math:`f(x_1)` и :math:`f(x)` с :math:`k(x,x_1) = 0.95`.| image:: https://user-images.githubusercontent.com/6753639/206867797-20e42783-31de-4c50-8103-e9441ba6d0a9.svg .. |Предиктивное распределение гауссовского процесса в пространстве функций на :math:`f(x)`, при :math:`k(x,x_1)` = 0,95.| image:: https://user-images.githubusercontent.com/6753639/206867800-d9fc7add-649d-492c-8848-cab07c8fb83e.svg `Обсуждения `__