Я только начал двухмесячную стажировку в Лаборатории информатики. Обычно я работаю над докторской степенью в области моделирования гауссовских процессов для глобальных климатических моделей. Но в течение следующих нескольких недель я буду в лаборатории информатики, изучая вероятностное программирование для вывода в моделях, основанных на физике.

Нас интересует моделирование физических систем, таких как атмосфера и океаны. Чтобы построить эти модели, нам сначала нужно знать параметры и начальные условия модели, которые контролируют результат. Иногда эти параметры или начальные условия узнаются непосредственно из данных, что может быть на удивление сложным и известно как вывод.

Вероятностные языки программирования (PPL) - это инструмент, разработанный специально для выполнения логических выводов. В этом посте мы рассмотрим, что это такое и как их можно использовать в самом простом случае.

Байесовский вывод

В байесовской статистике вероятность рассматривается как степень уверенности в том, что событие происходит (в отличие от частотной статистики, где вероятность - это частота возникновения события). Байесовский взгляд на вероятность важен для прогнозирования климата и погоды. Это позволяет нам количественно оценить, насколько вероятными будут события, например вероятность дождя в определенный день.

В байесовскую статистику мы можем включить априорную вероятность: нашу степень уверенности в том, что событие произошло, до того, как мы увидим какие-либо доказательства. В обычный день с некоторой вероятностью можно ожидать дождя. Мы запишем априорную вероятность дождя как P (дождь). Затем мы наблюдаем некоторые свидетельства и обновляем нашу степень уверенности в происходящем событии. Допустим, мы смотрим в окно и наблюдаем за некоторыми данными: мы видим, что на небе много темных облаков. Итак, мы можем обновить нашу степень уверенности в том, что сегодня днем ​​идет дождь. Это называется обусловливанием наблюдений.

Мы запишем эту обновленную вероятность как P (дождь | облако). Это условная вероятность или вероятность одного события (дождь) при условии, что произошло другое событие (облако). В частности, мы называем это апостериорной вероятностью дождя, потому что мы наблюдали некоторые данные и обновили нашу априорную вероятность. Мы можем использовать теорему Байеса для его вычисления:

Здесь есть два дополнительных условия. P (облако) - это свидетельство или общая вероятность увидеть облако, независимо от того, идет ли дождь или нет. P (облако | дождь) - это вероятность, вероятность наблюдения данных, если вы знаете результат, то есть вероятность увидеть облако, если дождь закончится позже.

Обычно нас интересует апостериорная вероятность P (дождь | облако), поэтому теорема Байеса полезна. Но его также можно использовать в более общем плане, когда мы хотим узнать что-либо с некоторыми данными, например мы можем захотеть узнать параметры модели. Это называется байесовским выводом.

Это действительно полезно и имеет множество применений в науке о климате и погоде. Он становится еще более мощным, когда мы думаем о распределениях вероятностей, которые описывают вероятности, связанные со всеми возможными исходами. Одним из важных применений байесовской статистики является ассимиляция данных: включение данных наблюдений со спутников о текущем состоянии атмосферы в погодную модель для прогнозирования будущего состояния атмосферы.

Что такое вероятностный язык программирования (PPL)?

Традиционный подход к построению статистических моделей может занимать много времени и требует специальных знаний. Обычно он включает в себя описание задачи статистиками на бумаге и выполнение математической процедуры для разработки специальной статистической модели. Затем это будет преобразовано в код для построения модели, готовой к использованию. Поскольку модель специально разработана для решения поставленной задачи, этот метод необходимо повторять для каждой новой задачи.

Вероятностные языки программирования призваны сделать этот процесс более простым, быстрым и менее техническим. Идея состоит в том, чтобы избавить эксперта-статистика от необходимости вручную разрабатывать статистическую модель, встроив этот шаг в сам язык программирования. Статистические задачи, такие как кодирование наблюдений (кондиционирование) и изучение скрытых переменных (вывод), автоматизированы, а некоторые сложные математические и статистические шаги скрыты от пользователя. Это делает статистическое моделирование более доступным для пользователей, а задачи, которые традиционно требуют много размышлений и ручного проектирования, могут быть автоматизированы.

Что включает в себя вероятностное программирование?

PPL - это обычные языки программирования, оснащенные инструментами, которые упрощают статистическое моделирование для пользователя, уменьшая потребность в ручном проектировании программ. Основными компонентами PPL являются:

  1. Выборка: наша модель является вероятностной - она ​​требует случайного извлечения значений из вероятностных распределений.
  2. Условие: у нас есть некоторые наблюдаемые данные, которые можно использовать для обновления вероятностей.
  3. Вывод: мы можем кое-что узнать из известных данных и модели. Это могут быть параметры системы или «скрытая переменная», некий основной фактор, который вы не можете наблюдать напрямую, но который может повлиять на данные. Обычно это самая сложная часть.

Вероятностное программирование - подходящий выбор, когда у нас есть вероятностная модель, которая полагается на выборку из распределений, чтобы делать прогнозы. PPL упрощает согласование наблюдаемых данных и изучение модели. Обратите внимание, что вероятностные языки программирования не новы. Они существуют со времен Simula в 1966 году. Однако с развитием глубокого обучения они становятся все популярнее, и появляется множество новых PPL, разработанных с учетом логических выводов для машинного обучения (например, Pyro, Edward, Infer.Net, webppl).

Давайте рассмотрим простой пример, чтобы показать, как работает вероятностное программирование. Мы будем использовать P yro, вероятностный язык программирования, построенный на основе P yTorch в Python. Большая часть этого примера взята из учебника Введение в логический вывод в Pyro.

Простая модель движущегося облака

Допустим, у нас есть облако, движущееся через атмосферу с некоторой скоростью в одном измерении. Мы наблюдаем это через 10 секунд, но с некоторой погрешностью измерения. Мы хотим использовать вероятностный подход, чтобы найти распределение скорости ветра.

1) Статистическая модель

Скорость ветра мы не можем наблюдать напрямую - это скрытая переменная. Но у нас есть некоторые предварительные знания относительно ожидаемой скорости ветра. Мы используем это для выборки из предварительного распределения скорости облаков с первоначальным предположением для средней скорости ветра (5 м / с) и стандартного отклонения (2 м / с). Облако перемещается на расстояние (скорость × время), и его конечное положение наблюдается с некоторой ошибкой измерения.

Операторы pyro.sample - это первый компонент PPL, позволяющий нам брать образцы из дистрибутивов. Мы предоставляем Pyro уникальные имена для каждой переменной, чтобы их можно было отслеживать. Мы можем запускать эту модель много раз, чтобы найти распределение скоростей облаков и наблюдаемых положений.

2) Кондиционирование

Что, если мы наблюдаем облако в определенной точке, x = 30 м? Мы хотим использовать эту информацию в нашей модели, чтобы узнать больше о скрытой переменной скорости. Это когда мы основываемся на наших наблюдениях.

В Pyro это делается с помощью оператора pyro.condition. Этот оператор возвращает новую функцию, почти идентичную исходной, но перезаписывает pyro.sample("position",...), фиксируя ее на наблюдаемом значении.

В остальном функция осталась прежней. Мы можем проверить это, многократно измеряя скорость и позицию:

Наша новая функция conditioned_propagate всегда возвращает одно и то же значение для положения, зафиксированное на наблюдаемом значении, но распределение скорости ветра не меняется. Скорость по-прежнему выбирается из нормального распределения, которое мы предоставили в нашей исходной функции propagate_cloud.

3) Вывод

Следующий шаг - это умозаключение - сложная часть. Цель состоит в том, чтобы найти апостериорное распределение скорости с учетом нашей модели и наблюдения выше.

Возможность вычислить это аналитически редко, поэтому мы будем оценивать распределение, используя алгоритм стохастического вариационного вывода. Для этого требуется распределение, называемое направляющим (или вариационным распределением), которое является приближением к апостериорному распределению, которое мы хотим знать. Руководство полагается на дополнительные параметры, которые будут настроены, чтобы «направить» его к апостериорному распределению.

В этом примере мы выберем скорость ветра из нормального распределения со средним значением и дисперсией, заданными новыми параметрами a и b. Они сначала определяются с помощью оператора pyro.param(...) и сохраняются в «Хранилище параметров Pyro». Значения, которые мы предоставляем здесь для a и b, не слишком важны, поскольку мы оптимизируем их на следующем этапе.

Мы можем проверить распространение руководства перед оптимизацией a и b.

Я упоминал, что мы обычно не можем найти аналитическое апостериорное распределение, но в нашем простом примере мы можем! Используя свойства нормального распределения, мы можем вычислить, что апостериорное распределение скорости облака является другим нормальным распределением со средним значением 3,4 м / с и стандартным отклонением 0,89 м / с, показанным выше красным. Наше первоначальное предположение далеко от истины.

Затем мы хотим оптимизировать направляющую функцию, чтобы получить наилучшее приближение к апостериорному распределению в соответствии с некоторой функцией потерь - мы будем использовать Оператор очевидной нижней границы или ELBO. Мы используем стохастический вариационный вывод, pyro.infer.SVI:

Похоже, что наше руководство сошлось, теперь мы можем сравнить наше новое оптимизированное руководство с точным распределением:

В результате после оптимизации распределение направляющих выглядит почти идентично апостериорному. Итак, у нас есть хорошее приближение к апостериорному распределению, из которого мы можем легко брать выборки.

В этом примере использовался стохастический вариационный вывод, который дает нам способ аппроксимировать апостериорное распределение, но мы могли бы использовать Марковскую цепь Монте-Карло, чтобы точно узнать апостериорное распределение с более высокими вычислительными затратами.

Помните, что это все, что мы могли бы сделать без вероятностного языка программирования, но его использование упрощает задачу и требует меньше кода, что продемонстрировано здесь на простом примере вывода. Это мощный инструмент, поскольку мы можем использовать его для вывода более сложных физических моделей, которые могут иметь полезные приложения в науке о климате и погоде.

Дальнейшее чтение

См. Версию для записной книжки здесь: https://github.com/informatics-lab/probabilistic-programming.git

Узнать больше о байесовской статистике

  1. Https://www.probabilisticworld.com/what-is-bayes-theorem/
  2. Https://towardsdatascience.com/probability-concepts-explained-bayesian-inference-for-parameter-estimation-90e8930e5348

Узнать больше о вероятностных языках программирования

  1. Https://pyro.ai/examples/
  2. Http://adriansampson.net/doc/ppl.html
  3. Https://tenfifty.io/probabilistic-programming-proves-poland-was-robbed-in-chess/
  4. Https://www.cs.ubc.ca/~poole/papers/IndependentChoices.pdf
  5. Https://methods.co.uk/blog/the-future-of-artificial-intelligence-part-1-probabilistic-programming-languages/