Теория вероятности никогда не переставала меня удивлять, начиная ещё с того момента, как я впервые с ней столкнулся, и до сих пор. В разное время в разной степени меня настигали, назовём их «вау-эффекты», шоковые удары в мозжечок, от которых меня накрывало эффектом третьего ока, и мир навсегда переставал быть прежним.
- Первый «вау-эффект» я испытал от Центральной предельной теоремы. Берем кучу случайных величин, устремляем их количество в бесконечность и получаем нормальное распределение. И совсем неважно как распределены эти величины, неважно, будь это подбрасывания монетки или капли дождя на стекле, вспышки на Солнце или остатки кофейной гущи, результат будет всегда один — их сумма всегда стремится к нормальности. Разве что, нужно потребовать их независимость и существование дисперсии (позднее я узнал, что существует теорема и для экстремальных тяжелохвостых распределений с бесконечной дисперсией). Тогда этот парадокс долго не давал мне заснуть.
- В какой-то момент учебы в университете такие предметы как дискретная математика и функциональный анализ слились вместе и всплыли в теорвере под видом выражения «почти наверное». Стандартный пример: вы случайно выбираете число от 0 до 1. С какой вероятностью вы ткнёте в рациональное число (привет, функция Дирихле)? Спойлер: 0. Ноль, Карл! Бесконечное множество не имеет никакой силы, если оно счетно. У вас бесконечное число вариантов, но вы не выберете ни один из них. Вы не выберете 0, или 1, или 1/2, или 1/4. Вы и не выберете 3/2.
Да-да, что выбрать 1/2, что выбрать 3/2, вероятность нулевая. Вот только в 3/2 вы не ткнёте точно, таковы условия, а в 1/2 вы не попадёте ну… «почти наверное». Концепция «почти всюду»/«почти наверное» забавляет математика, а обывателя заставляет крутить пальцем у виска. Многие ломают себе мозг в попытке классифицировать нули, но результат того стоит. - Третий по счёту, но не по силе, «вау-эффект» настиг уже на переходе в advanced level
— при чтении книг по стохастическим исчислениям. Причиной тому стала лемма Ито. Со времён школьной скамьи, когда нашим девственным глазам впервые показали производную, мы нисколько не сомневались в правильности вот такой вот формулы: И она верна. Вот только, если — это не случайный процесс. Адовая смесь из свойств нормального распределения и «почти наверное» доказывает, что в обратном случае эта формула в общем случае неверна. Томик мат.анализа с решениями обыкновенных дифференциальных уравнений теперь можно выкинуть в топку. Люди в теме тихо хихикают, остальные нетерпеливо листают статьи в Вики с исчислениями Ито.
Но совсем недавно я испытал и четвёртый, так называемый, «вау-эффект». Это не какой-то отдельно взятый факт, а целая теория, которую я собираюсь поведать в серии из нескольких статей. И если предыдущие финты теории вероятности вас уже не удивляют, то прошу милости под кат (знаю, вы и так уже здесь).
Полиномы Эрмита
Начнем с обыкновенной алгебры — определим «вероятностные» (они немного отличаются от «физических») полиномы Эрмита: Значения первых полиномов:
Полиномы Эрмита обладают следующими свойствами:
Последнее соотношение поможет нам в вычислении -ых полиномов Эрмита для заданного . Программироваться мы будем на Haskell, ибо он позволяет математикам выражаться на привычном им языке — Haskell чист, строг и прекрасен как сама математика.
hermite :: (Enum a, Num a) => a -> [a]
hermite x = s
where s@(_:ts) = 1 : x : zipWith3 (\hn2 hn1 n1 -> x * hn1 - n1 * hn2) s ts [1..]
Функция hermite принимает на вход параметр , а на выходе даёт бесконечный лист из -ых полиномов для Кто не знаком с концепцией ленивых вычислений, очень советую ознакомиться. Для тех же, кто эту концепцию знает, но ещё не до конца может в функциональное программирование: что здесь происходит? Представьте, что у нас уже есть бесконечный лист со всеми значениями Эрмитовых полиномов:
s = [1, x, x^2-1, x^3-3x, x^4-6x^2+3, ... ]
Хвост этого листа (без первого элемента):
ts = [x, x^2-1, x^3-3x, x^4-6x^2+3, ... ]
Вдогонку мы возьмем ещё лист с натуральными числами:
[1, 2, 3, ... ]
Функция zipWith3 комбинирует последние три листа, используя данный ему оператор:
x * [ x, x^2-1, x^3-3x, ... ]
- [ 1*1, 2*x, 3*(x^2-1), ... ]
= [x^2-1, x^3-3x, x^4-6x^2+3, ... ]
Добавляем впереди 1 и x, и получаем полный набор Эрмитовых полиномов. Иными словами, мы достали лист со значениями полиномов, используя лист с этими значениями, то есть, лист, который мы и пытаемся достать. Поговаривают, что полное осознание красоты и мощи ФП сродни умению заглянуть себе в ухо.
Проверим: первые 6 значений для :
Prelude> take 6 (hermite 1)
[1,1,0,-2,-2,6]
Что мы и ожидали увидеть.
Гильбертово пространство
Двинемся немного в другую степь — вспомним определение пространства Гильберта. Говоря научным языком, это полное метрическое линейное пространство с заданным на нём скалярным произведением На этом пространстве каждому элементу соответствует вещественное число, именуемое нормой и равное Ничего сверхъестественного. Когда я пытаюсь представить Гильбертово пространство, я начинаю от простого и постепенно прихожу к сложному.
- Самый простой пример — это пространство вещественных чисел: . В таком случае скалярным произведением двух чисел и у нас будет
- Затем я перехожу в Эвклидово пространство . Теперь Это пространство можно расширить до пространства комплексных векторов: , для которого скалярное произведение будет (верхняя черта обозначает комплексное сопряжение).
- Ну и наконец прихожу в пространство для взрослых, пространство с бесконечной размерностью. В нашем случае это будет пространство квадратично интегрируемых функций, заданных на некотором множестве с заданной мерой . Мы будем его обозначать в виде . Скалярное произведение на нем задается следующим образом: Обычно под множеством подразумевается интервал , а под мерой — равномерная мера (мера Лебега), т.е. . И тогда скалярное произведение записывается в виде обыкновенного интеграла Лебега Если же мы думаем в терминах теории вероятностей, то — это пространство элементарных событий, и — случайные величины, а — вероятностная мера. У каждой такой меры есть своя функция плотности распределения , которая может быть отличной от константы, тогда и скалярное произведение совпадает с математическим ожиданием:
Гауссовский процесс
Настало время внести в наши размышления элемент случайности. Пусть у нас имеется гильбертово пространство . Тогда мы назовем (изонормальным) Гауссовским процессом, если
- вектор из случайных величин распределен нормально с нулевым мат.ожиданием для любых , и
- для
По своей математической сути — это отображение из одного гильбертова пространства в другое, из некоторого в — вероятностное пространство из случайных величин с конечной дисперсией, заданного триплетом (множество элементарных событий), (сигма-алгебра) и (вероятностная мера). Несложно показать, что это отображение линейно: (в смысле равенства «почти наверное», привет «вау-эффект» #2)
Пример. Пусть , где — равномерная мера (Лебега). Скалярное произведение на нём Пусть — единичная функция на интервале . Тогда и не что иное, как Броуновское движение (или Винеровский процесс). Более того, называется интегралом Ито от функции относительно .
Для того, чтобы реализовать Гауссовский процесс я воспользуюсь пакетами, которые благородные люди уже написали за нас.
import Data.Random.Distribution.Normal
import Numeric.LinearAlgebra.HMatrix as H
gaussianProcess :: Seed -> Int -> Int -> ((Int, Int) -> Double) -> Matrix Double
gaussianProcess seed nSamples dim dotProducts = gaussianSample seed nSamples mean cov_matrix
where mean = vector (replicate dim 0)
cov_matrix = H.sym $ matrix dim (map (\i -> dotProducts (i `quot` dim, i `rem` dim)) $ take (dim * dim) [0, 1..])
Функция gaussianProcess принимает параметр seed (стандартная штука для генераторов), nSamples — размер выборки, dim — размерность вектора , dotProducts — функцию, принимающую на вход , индекс матрицы ковариации и возвращающую соответствующее этому индексу скалярное произведение . На выход gaussianProcess выдает вектор .
Уже подходит время объединить все полученные нами знания вместе. Но прежде, стоит упомянуть об одном полезном свойстве эрмитовых полиномов и нормального распределения в совокупности. Пусть Тогда, используя разложение Тейлора, Возьмем — две стандартные нормально распределенные случайные величины. Через производящую функцию нормального распределения мы можем вытащить следующее соотношение: Берем -ую частную производную , приравниваем по обе стороны уравнения сверху и получаем
О чем это нам говорит? Во-первых, мы получили норму для , а, во-вторых, мы теперь знаем, что разные эрмитовы полиномы от нормальных случайных величин ортогональны друг другу. Вот сейчас мы готовы к осознанию нечто большего.
Разложим пространство в хаос
Пусть — n-й Винеровский хаос. Тогда
Воу-воу, палехче! Давайте разложим эту теорему о разложении по кусочкам и переведём с математического на человеческий. Мы не будем сильно вдаваться в детали, а лишь интуитивно поясним о чем тут речь. Значок обозначает линейную оболочку подмножества гильбертова пространства — пересечение всех подпространств , содержащих . Говоря проще, это множество всех линейных комбинаций элементов из . Черта сверху над обозначает замыкание множества. Если , то называется полным множеством (грубо говоря, " плотно в "). Следовательно, — замыкание линейной оболочки полиномов Эрмита от Гауссовского процесса на единичной гиперсфере.
С нотацией вроде разобрались. Теперь о том, что такое Винеровский хаос. Идем от простого: содержит все линейные комбинации Эрмитовых полиномов со степенью 0, то есть различные комбинации чисел , то есть всё пространство вещественных чисел. Следовательно, . Идем дальше. Несложно увидеть, что , то есть пространство, составленное из Гауссовских процессов. Получается, что все центрированные нормальные величины принадлежат . Если мы добавим еще , то к ним присоединятся и остальные нормальные случайные величины, чье математическое ожидание отлично от нуля. Дальнейшие множества уже оперируют с n-ми степенями .
Пример. Пусть и — квадрат Броуновского движения. Тогда Первое слагаемое принадлежит , второе — . Это и называется разложением в Винеровский хаос.
Мы показали ранее, что для . Теорема о разложении гласит о том, что эти множества не только ортогональны друг другу, но также формируют полную систему в . Что это означает на практике? Это значит, что любая случайная величина с конечной дисперсией может быть аппроксимирована полиномиальной функцией от нормально распределенной случайной величины.
очень схожа с определением полинома Эрмита
Если же распределение далеко от Гаусса, то можно попробовать и другие ортогональные полиномы. Например, плотность Гамма-распределения: Ничего не напоминает? Да это же полиномы Лагерра
Равномерному распределению соответствуют полиномы Лежандра, биномиальному распределению — полиномы Кравчука, и т.п. Теория, развивающая идею разложения вероятностного пространства на ортогональные полиномы именуется в англоязычной литературе как «Polynomial chaos expansion».
Пример. Давайте теперь возьмем , функцию и зададим случайную величину , такую что где . По теореме о разложении мы можем представить её в виде взвешенной суммы из полиномов Эрмита где коэффициенты задаются формулой Эти значения мы получили следующим образом: Поздравляю! Теперь, если у вас есть функция от стандартной нормально распределенной случайной величины, вы сможете её разложить по базису из Эрмитовых полиномов. Например, подбрасывание честной монетки 0-1 мы можем представить в виде Немного поколдовав с математикой (подсчет несложных интегралов мы оставим читателю), мы получаем разложение:
Заметьте, что каждый второй элемент в разложении по базису равен нулю.
second (x:y:xs) = y : second xs
second _ = []
coinTossExpansion :: Int -> Double -> Double
coinTossExpansion n xi = sum (take n $ 0.5 : zipWith (*) fn (second $ hermite xi))
where fn = 1.0 / (sqrt $ 2 * pi) : zipWith ( \fn1 k -> -fn1 * k / ((k + 1) * (k + 2)) ) fn [1, 3..]
Функция coinTossExpansion возвращает сумму, полученную разложением случайной монетки в винеровский хаос, для данного от до . На графике показана постепенная сходимость для выбранных случайным образом с возрастанием .
Судя по этому графику, где-то после мы можем обрезать сумму, округлить и вернуть в качестве .
coinTossSequence :: Seed -> Int -> [Int]
coinTossSequence seed n = map (round.coinTossExpansion 100) (toList nvec)
where nvec = (toColumns $ gaussianProcess seed n 1 (\(i,j)->1) ) !! 0
Проверим, как будет выглядеть последовательность из 20 подбрасываний.
Prelude> coinTossSequence 42 20
[0,0,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,1,0,1]
Теперь, когда вас попросят сгенерировать подбрасывания монетки, вы знаете, что им показать.
Ну а без шуток, мы что-то посчитали и что-то разложили, а какой в этом всем толк, спросите вы. Не спешите чувствовать себя обманутыми. В последующих статьях мы покажем, как это разложение позволяет брать производную от случайной величины (в некотором смысле), расширим стохастическое интегрирование (и ваше сознание), и найдем всему этому практическое применение в машинном обучении.
Комментарии (18)
stepik777
08.12.2017 16:50Стандартный пример: вы случайно выбираете число от 0 до 1. С какой вероятностью вы ткнёте в рациональное число (привет, функция Дирихле)?
Ерунда, невозможно случайно выбрать число от 0 до 1. В любом случае вы будете выбирать из какого-то счётного множества.
kmeaw
08.12.2017 23:54А если у вас есть бесконечно тонкая указка, и вы наугад втыкаете её в отрезок (0, 1)?
gks
08.12.2017 19:02Насколько я помню, заход к полиномам Эрмита. Они возникают в качестве решения уравнений Шредингера для гармонического осциллятора. Там же показывается их ортогональность. То есть в квадратичном поле. Если учесть, что энергия гармонического осциллятора E = m*v^2/2 + k*x^2/2. А вероятность состояния p ~ exp (-E/kT). Очень похожа на функцию нормального распределения свободных независимых частиц. То скорее всего в статье описана система свободно колеблющихся частиц в самосогласованном квадратичном поле. И скорее всего дальше вы придет к распределению Ферми-Дирака (сигмоидной функции) в качестве функций ядра нейронной сети, и методу градиентного спуска для обучения сети. Что в принципе и делается в любом учебнике по нейронным сетям. Но явно не обозначается.
johnnymmc
08.12.2017 21:13Берем кучу случайных величин, устремляем их количество в бесконечность и получаем нормальное распределение. И совсем неважно как распределены эти величины, неважно, будь это подбрасывания монетки или капли дождя на стекле, вспышки на Солнце или остатки кофейной гущи, результат будет всегда один — их сумма всегда стремится к нормальности.
Непонятно как сумма может стремиться к нормальности. Сумма — это число, нормальное распределение — это функция. Как их можно сравнивать? Даже на примере подбрасывания монетки — два равновероятных (если не учитывать факторов типа царапин на монетке и тому подобного) варианта, где там взяться нормальному распределению? Да, я заглянул в Википедию, там так и написано, что «сумма достаточно большого количества слабо зависимых случайных величин, имеющих примерно одинаковые масштабы (ни одно из слагаемых не доминирует, не вносит в сумму определяющего вклада), имеет распределение, близкое к нормальному», но не могу понять как это. Можно чуть более подробный пример для не-математиков?
Стандартный пример: вы случайно выбираете число от 0 до 1. С какой вероятностью вы ткнёте в рациональное число (привет, функция Дирихле)? Спойлер: 0. Ноль, Карл! Бесконечное множество не имеет никакой силы, если оно счетно. У вас бесконечное число вариантов, но вы не выберете ни один из них. Вы не выберете 0, или 1, или 1/2, или 1/4. Вы и не выберете 3/2
Тоже непонятно почему это нет? Прочитав «вы случайно выбираете число от 0 до 1» я подумал «0.72». Я что, реально не мог выбрать 0.5 и кого ни спрашивай — никто никогда не выберет? Что-то не верится.
Наверно для тех, кто всерьёз изучал эти темы вопросы идиотские, но всё же любопытно, так что позволю себе спросить.Pro-invader
08.12.2017 21:33В реальной жизни конечно вы можете выбрать и попасть в любой вариант, потому что количество разрядов счетно. Например, среди всего множества double вы можете выбрать 0.72 и попасть.Но при бесконечном множестве никогда не попадете.
lorc
08.12.2017 22:11Непонятно как сумма может стремиться к нормальности. Сумма — это число, нормальное распределение — это функция.
Случайная величина — это не число. Соответственно сумма случайных величин — тоже не число. Сумма случайных величин — это случайная величина.
Монетка может упасть либо орлом, либо решкой. Пусть орел у нас будет 0, а решка — 1. Тогда у случайной величины «бросок монетки» будет два возможных исхода: 0 и 1. А у суммы ста случайных величин «бросок монетки» — будет 100 возможных исходов: от 0 (выпали одни орлы) до 100 (выпали одни решки). Если мы построим график распределения этой случайной величины, то получим знакомый «колокол» с максимум в точке 50.
Для того чтобы построить такой график экспериментально, нам нужно провести например 1000 экспериментов. Каждый эксперимент будет состоять в следующем: мы 100 раз бросаем монетку (или бросаем 100 монеток один раз) и складываем результат бросков. Иногда будет получаться 13, иногда — 70, но чаще всего будет получаться что-то в диапазоне 45-55.
Тоже непонятно почему это нет? Прочитав «вы случайно выбираете число от 0 до 1» я подумал «0.72». Я что, реально не мог выбрать 0.5 и кого ни спрашивай — никто никогда не выберет? Что-то не верится.
Когда вы называете любое число — вы называете рациональное число. Потому что для записи иррационального вам понадобится бесконечное число знаков (если конечно не пользоваться обозначениями типа pi, e, sqrt(2) или sin(3)).
Дело в том, что количество рациональных чисел — бесконечно, но счетно. А количество иррациональных — бесконечно и несчетно. Грубо говоря их в бесконечность раз больше, чем рациональных (тут меня математики будут бить ногами).
TheShock
08.12.2017 22:46Тоже непонятно почему это нет? Прочитав «вы случайно выбираете число от 0 до 1» я подумал «0.72». Я что, реально не мог выбрать 0.5 и кого ни спрашивай — никто никогда не выберет? Что-то не верится.
Возьмите метровую линейку и тыкните на ней в случайное место. Какая вероятность, что это будет приблизительно 0.5? А какая вероятность, что это будет точно 0.50000000?
l4l
08.12.2017 23:09+1Пожалуй по интересу к рассказчикам первое место я отдам математику, с упоением рассказывающему о своем деле. Что-то в этом есть, пусть даже я и не совсем все понял (сильно залип на 3 "вау-эффекте")
Closius
10.12.2017 21:43Я перечитал множестко книг по стохастическим методам, многое даже понял. И я все пытался найти там какой-либо ответ, необычный вывод о реальной жизни. В итоге я ничего не нашел. Все что там описано ну мягко говоря ежу понятно. Например что случайный процесс даст случайное значение впереди, что разброс t+1 от t меньше чем t+1000 от t и так далее.
Где примеры то? Например у Байесовского подхода есть конкретные примеры которые помогают нам, например парадокс Монти-Холла.
В чем смысл то?
0xd34df00d
12.12.2017 02:42Возникают всякие нотационно-мотивационные вопросы.
Когда вы вводите понятие винеровского процесса, почему в качестве исходного пространства вы рассматриваете L^2, а не, ну, R, постулируя B(t) = W(t) ~ N(0; t)? (Денискин зделой латех в комментах!) Что делать с функциями, которые в L^2, но не являются единичными на отрезке [0; t] для некоторого t?
Чуть ниже вы вводите понятие интеграла Ито, и там справа у W в скобочках фигурирует 1_[0; t] и f. А как они связаны? Это не скалярное произведение — формула тогда не тайпчекается. При этом это и не композиция (1_[0; t] \dot f = 1_[0; t], что не очень интересно).
Monnoroch
Кстати говоря, вот и интересный способ доказать (ну, почти, там, все-таки, не полиномы) тот факт, что глубокие генеративные модели, вроде GAN и VAE могут приблизить произвольное распределеные данных: они же как раз и ищут функцию f(x), x ~ N(0, 1), такую, что f(x) ~ P(Data).
Очень жду продолжение с описанием, что же можно делать с разложением этой f(x)!
Спасибо большое за статью. Не все детали смог понять, уж очень сумбурно кое-где и темп очень быстрый, без проработки мелочей, но в общем очень интересно.