Наивный Байесовский классификатор в 25 строк кода
Наивный Байесовский классификатор один из самых простых из алгоритмов классификации. Тем не менее, очень часто он работает не хуже, а то и лучше более сложных алгоритмов. Здесь я хочу поделиться кодом и описанием того, как это все работает.
Немного теории
Пусть у нас есть строка текста O. Кроме того, имеются классы С, к одному из которых мы должны отнести строку. Нам необходимо найти такой класс с, при котором его вероятность для данной строки была бы максимальна. Математически это записывается так:
Вычислить P(C|O) сложно. Но можно воспользоваться теоремой Байеса и перейти к косвенным вероятностям:
Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). Кроме того, нужно взглянуть на строку O. Обычно, нет смысла работать со всей строкой. Намного эффективней выделить из нее определенные признаки (features). Таким образом формула примет вид:
Знаменатель нас не интересует. Числитель же можно переписать так.
Но это опять сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильно упрощение, но зачастую это работает. Числитель примет вид:
Финальная формула примет вид:
(1)
Т.е. все что нужно сделать, это вычислить вероятности P( C ) и P(O|C). Вычисление этих параметров и называется тренировкой классификатора.
Ниже — код на питоне. Содержит всего две функции: одна для тренировки (подсчета параметров формулы), другая для классификации (непосредственный расчет формулы).
В функции train первые пять строк производят подсчет количества классов C, а также частоту появления фич O и С в одном семпле. Вторая часть метода просто нормирует эти частоты. Таким образом на выходе получаются вероятности P© и P(O|C).
В функции classify происходит поиск наиболее вероятного класса. Единственное отличие от формулы (1) в том, что я заменяю произведение вероятностей на сумму логарифмов, взятых с отрицательным знаком, и вычисляю не argmax, а argmin. Переход к логарифмам — распространненный прием чтобы избежать слишком маленьких чисел, которые могли бы получится при произведении вероятностей.
Число 10(^-7), которое подставляется в логарифм, это способ избежать нуля в аргументе логарифма (т.к. он будет иначе он будет неопределен).
Чтобы натренировать классификатор возьмем размеченный список мужских и женских имен и воспользуемся этим кодом:
Файл ‘names.txt’ можно скачать здесь.
В качестве фич я выбрал последнюю букву имени (см функцию get_features). Работает неплохо, но для рабочего варианта лучше использовать схему посложнее. К примеру, выбрать первую букву имени и две последних. К примеру, вот так:
Алгоритм можно использовать для произвольного числа классов. К примеру, можно попробовать построить классификатор текстов по эмоциональной окраске.
Байесовские методы машинного обучения (курс лекций) / 2021
Материал из MachineLearning.
| Изучение дисциплины нацелено на освоение т.н. байесовского подхода к теории вероятностей как одного из последовательных способов математических рассуждений в условиях неопределенности. В байесовском подходе вероятность интерпретируется как мера незнания, а не как объективная случайность. Простые правила оперирования с вероятностью, такие как формула полной вероятности и формула Байеса, позволяют проводить рассуждения в условиях неопределенности. В этом смысле байесовский подход к теории вероятностей можно рассматривать как обобщение классической булевой логики. |
Целью курса также является освоение студентами основных способов применения байесовского подхода при решении задач машинного обучения. Байесовский подход позволяет эффективно учитывать различные предпочтения пользователя при построении решающих правил прогноза. Кроме того, он позволяет решать задачи выбора структурных параметров модели. В частности, здесь удается решать без комбинаторного перебора задачи селекции признаков, выбора числа кластеров в данных, размерности редуцированного пространства при уменьшении размерности, значений коэффициентов регуляризации и проч.
Предполагается, что в результате освоения курса студенты будут способны строить комплексные вероятностные модели, учитывающие структуру прикладной задачи машинного обучения, выводить необходимые формулы для решения задач обучения и вывода в рамках построенных вероятностных моделей, а также эффективно реализовывать данные модели на компьютере.
Семинаристы: Максим Кодрян, Тимофей Южаков + орг. вопросы курирует Екатерина Лобачева
Контакты: по всем вопросам, связанным с курсом, просьба писать на bayesml@gmail.com. В название письма обязательно добавлять [ВМК БММО21]. Письма без этого тега могут просто не дойти до преподавателей!
У курса есть чат в телеграме. Все объявления по курсу будут вывешиваться именно в чате! Всем студентам будет отправлена ссылка на него на почту. Преподаватели в чате бывают, но не всегда. По всем важным вопросам стоит писать на почту.
Содержание
Новости
Отчётность по курсу и критерии оценки
В курсе предусмотрено несколько форм контроля знаний: 2 практических домашних задания, 3 теоретических домашних задания, 4 домашних лабораторных работы и устный экзамен. Итоговая оценка по курсу в 10-бальной шкале рассчитывается по формуле:
Итоговая оценка = 0.3 * Экз + 0.3 * Практ + 0.4 * ( 3/7 * Теор + 4/7 * Лаб ))
Кроме набора необходимого балла по формуле, для получения положительной оценки по курсу также нужно выполнить следующие обязательные условия:
Про оценивание экзамена:
Домашние задания
Примерные даты выдачи домашних заданий (они могут быть изменены!):
Экзамен
При подготовке ответа на экзамене разрешается пользоваться любыми материалами. При непосредственном ответе ничем пользоваться нельзя. Просьба обратить внимание на теоретический минимум по курсу — незнание ответов на вопросы теор. минимума автоматически влечёт неудовлетворительную оценку за экзамен. На экзамене дается час на подготовку ответа на билет, после чего вы отвечаете экзаменатору на вопросы из теоретического минимума, рассказываете билет, отвечаете на дополнительные вопросы по курсу и решаете задачи.
Вопросы к экзамену будут выложены ближе к концу семестра.
Расписание занятий
Занятия проходят по пятницам в ауд. 526б, начало в 14-35 (лекция) и 16-20 (семинар).
| Дата | № занятия | Занятие | Материалы |
|---|---|---|---|
| 10 сентября 2021 | 1 | Лекция «Байесовский подход к теории вероятностей. Примеры байесовских рассуждений.» | Конспект Саммари Презентация |
| Семинар «Байесовские рассуждения. Выдача практического задания №1» | Задачи Конспект | ||
| 17 сентября 2021 | 2 | Лекция «Сопряжённые распределения, аналитический байесовский вывод, экспоненциальный класс распределений» | Конспект |
| Семинар «Сопряжённые распределения» | Задачи Конспект Ноутбук | ||
| 24 сентября 2021 | 3 | Лекция «Байесовский выбор модели» | Презентация Конспект |
| Семинар «Подсчёт обоснованности моделей» | Задачи Конспект Ноутбук | ||
| 1 октября 2021 | 4 | Лекция «Метод релевантных векторов для задачи регрессии» | Презентация Конспект |
| Семинар «Матричные вычисления» | Задачи с семинара Решения с семинара Методичка Задачи доп 1 Задачи доп 2, | ||
| 8 октября 2021 | 5 | Лекция «Метод релевантных векторов для задачи классификации» | Саммари Конспект, |
| Семинар «Метод релевантных векторов» | Задачи КонспектПрезентация Доказательство тождества Вудбери Доказательство тождества об определителе | ||
| 15 октября 2021 | 6 | Лекция «EM-алгоритм. Байесовский метод главных компонент» | Саммари Конспект |
| Семинар «ЕМ-алгоритм» | Задачи Конспект | ||
| 22 октября 2021 | 7 | Лекция «Вариационный вывод» | Саммари 1 Саммари 2 Конспект |
| Семинар «Вариационный вывод» | Задачи КонспектНоутбук | ||
| 29 октября 2021 | 8 | Лекция «Методы Монте-Карло по схеме марковский цепей (MCMC)» | Саммари |
| Семинар «МСМС» | Задачи Конспект Ноутбук | ||
| 12 ноября 2021 | 9 | Лекция «Гибридный метод Монте-Карло и его масштабируемые модиификации» | Hamiltonian dynamics Langevin Dynamics |
| Лекция «Динамика Ланжевена для сэмплирования и оптимизации» | Презентация | ||
| 19 ноября 2021 | 10 | Лекция «Латентное размещение Дирихле (LDA)» | Саммари |
| Семинар «Модификации LDA» | Конспект Статья по HDP | ||
| 26 ноября 2021 | 11 | Лекция «Гауссовские процессы для регрессии и классификации» | материалы лекции изложены в разделе 6.4 Бишопа |
| Семинар «Гауссовские процессы для регрессии и классификации» | Задачи Конспект Презентация | ||
| 3 декабря 2021 | 12 | Лекция «Непараметрические байесовские методы. Процессы Дирихле» | Саммари |
| Семинар «Свойства распределения Дирихле» | Задачи Конспект |
Замечание: рукописные конспекты лекций и семинаров это в первую очередь заметки лектора и семинаристов, а не материалы по курсу. В них могут содержать неточности!
Официальный конспект лекций в процессе (пока выложены первые 5 лекций, остальные находятся на вычитке).
Введение в Байесовские методы
В качестве введения
В настоящее время Байесовские методы получили достаточно широкое распространение и активно используются в самых различных областях знаний. Однако, к сожалению, не так много людей имеют представление о том, что же это такое и зачем это нужно. Одной из причин является отсутствие большого количества литературы на русском языке. Поэтому здесь попытаюсь изложить их принципы настолько просто, насколько смогу, начав с самых азов (прошу прощения, если кому-то это покажется слишком простым).
В дальнейшем я бы хотел перейти к непосредственно Байесовскому анализу и рассказать об обработке реальных данных и о, на мой взгляд, отличной альтернативе языку R (о нем немного писалось тут) — Python с модулем pymc. Лично мне Python кажется гораздо более понятным и логичным, чем R с пакетами JAGS и BUGS, к тому же Python дает гораздо большую свободу и гибкость (хотя в Python есть и свои трудности, но они преодолимы, да и в простом анализе встречаются нечасто).
Немного истории
В качестве краткой исторической справки скажу, что формула Байеса была опубликована аж в 1763 году спустя 2 года после смерти ее автора, Томаса Байеса. Однако, методы, использующие ее, получили действительно широкое распространение только к концу ХХ века. Это объясняется тем, что расчеты требуют определенных вычислительных затрат, и они стали возможны только с развитием информационных технологий.
О вероятности и теореме Байеса
Формула Байеса и все последующее изложение требует понимания вероятности. Подробнее о вероятности можно почитать на Википедии.
На практике вероятность наступления события есть частота наступления этого события, то есть отношение количества наблюдений события к общему количеству наблюдений при большом (теоретически бесконечном) общем количестве наблюдений.
Рассмотрим следующий эксперимент: мы называем любое число из отрезка [0, 1] и смотрим за тем, что это число будет между, например, 0.1 и 0.4. Как нетрудно догадаться, вероятность этого события будет равна отношению длины отрезка [0.1, 0.4] к общей длине отрезка [0, 1] (другими словами, отношение «количества» возможных равновероятных значений к общему «количеству» значений), то есть (0.4 — 0.1) / (1 — 0) = 0.3, то есть вероятность попадания в отрезок [0.1, 0.4] равна 30%.
Теперь посмотрим на квадрат [0, 1] x [0, 1].
Допустим, мы должны называть пары чисел (x, y), каждое из которых больше нуля и меньше единицы. Вероятность того, что x (первое число) будет в пределах отрезка [0.1, 0.4] (показан на первом рисунке как синяя область, на данный момент для нас второе число y не важно), равна отношению площади синей области к площади всего квадрата, то есть (0.4 — 0.1) * (1 — 0) / (1 * 1) = 0.3, то есть 30%. Таким образом можно записать, что вероятность того, что x принадлежит отрезку [0.1, 0.4] равна p(0.1
1.9. Наивные методы Байеса ¶
Наивные методы Байеса — это набор алгоритмов контролируемого обучения, основанных на применении теоремы Байеса с «наивным» предположением об условной независимости между каждой парой характеристик при заданном значении переменной класса. Теорема Байеса утверждает следующее отношение, учитывая переменную классаy и зависимый вектор признаков x1 через xn,:
$$P(y \mid x_1, \dots, x_n) = \frac
$$
Используя наивное предположение об условной независимости,
$$P(x_i | y, x_1, \dots, x_
для всех i, это отношение упрощается до
$$P(y \mid x_1, \dots, x_n) = \frac
^ $$ С P(x1,…,xn) является константой с учетом входных данных, мы можем использовать следующее правило классификации: Несмотря на свои явно чрезмерно упрощенные предположения, наивные байесовские классификаторы довольно хорошо работают во многих реальных ситуациях, хорошо документируя классификацию и фильтрацию спама. Им требуется небольшой объем обучающих данных для оценки необходимых параметров. (По теоретическим причинам, почему наивный байесовский метод хорошо работает и с какими типами данных он работает, см. Ссылки ниже.) Наивные Байесовские ученики и классификаторы могут быть чрезвычайно быстрыми по сравнению с более сложными методами. Разделение условных распределений признаков классов означает, что каждое распределение может быть независимо оценено как одномерное распределение. Это, в свою очередь, помогает облегчить проблемы, возникающие из-за проклятия размерности. С другой стороны, хотя наивный байесовский классификатор известен как приличный классификатор, он известен как плохой оценщик, поэтому к вероятностным выходным predict_proba данным не следует относиться слишком серьезно. GaussianNB реализует гауссовский наивный байесовский алгоритм для классификации. Предполагается, что вероятность появления признаков гауссова: т. е. документ отнесен к классу, который является самым плохим дополнением. BernoulliNB реализует простые байесовские алгоритмы обучения и классификации данных, которые распределяются согласно многомерному распределению Бернулли; то есть может быть несколько функций, но предполагается, что каждая из них является двоичной (Бернулли, логическая) переменной. Следовательно, этот класс требует, чтобы образцы были представлены как векторы признаков с двоичными значениями; если переданы данные любого другого типа, BernoulliNB экземпляр может преобразовать свой ввод в двоичную форму (в зависимости от binarize параметра). Решающее правило для наивного Байеса Бернулли основано на В случае классификации текста для обучения и использования этого классификатора могут использоваться векторы появления слов (а не векторы подсчета слов). BernoulliNB может работать лучше с некоторыми наборами данных, особенно с более короткими документами. Если позволяет время, желательно оценить обе модели. В отличие от fit метода, при первом вызове partial_fit необходимо передать список всех ожидаемых меток классов. Вызов метода partial_fit наивных моделей Байеса представляет некоторую вычислительную нагрузку. Рекомендуется использовать как можно большие размеры блоков данных, то есть насколько позволяет доступная оперативная память. То, о чем я попытаюсь сейчас рассказать, выглядит как настоящая магия. Если вы что-то знали о нейронных сетях до этого — забудьте это и не вспоминайте, как страшный сон. Итак, магия: Слева — обычная и всем знакомая нейронная сеть, у которой каждая связь между парой нейронов задана каким-то числом (весом). Справа — нейронная сеть, веса которой представлены не числами, а демоническими облаками вероятности, колеблющимися всякий раз, когда дьявол играет в кости со вселенной. Именно ее мы в итоге и хотим получить. И если вы, как и я, озадаченно трясете головой и спрашиваете «а нафига все это нужно» — добро пожаловать под кат. Давайте для начала путешествия возьмем самую простую в мире нейронную сеть, состоящую аж из одного нейрона. Отпилим у него функцию активации и заставим выплевывать просто произведение входов на веса (w) плюс b, и получим то, что называется линейной регрессией. На входе дополнительно есть несколько копий оригинального X, возведенных в степень. Это иногда еще называют полиномиальной регрессией, хотя теоретически, «нейрон» по-прежнему делает линейную функцию Ну и как в классических задачках, допустим, у нас есть какие-то точки, и нам нужно подогнать под них функцию. Напишем какой-то такой не очень красивый, зато самый простой в мире код: И получим примерно такое: Окей, если мы нашли настоящие параметры, почему зеленая линия все-таки неидеально проходит через синие точки? Среднеквадратичное отклонение для этой линии все еще не нулевое (на самом деле оно примерно 0.97). Это нормально, или мы что-то сделали не так? На этот вопрос есть два ответа: 1. Наша модель недостаточно крута и недостаточно полно отражает искомую закономерность. Мы можем «обогатить» ее, добавив еще параметров — т.е., увеличить степень полинома. Для … не совсем идеально, но а почему бы и нет. Выглядит даже немного симпатичней, по-моему. Оставим как рабочую гипотезу. 2. Наша модель достаточно крута, проблема — в данных. В них есть какой-то шум, вызванный не иначе как несовершенством нашего мира (в данном случае тем, что я предательски приплюсовал к точкам немного рандома, но давайте представим себе, что это какие-то реальные данные). Даже если этот шум не по-настоящему случайный, а правда вызван факторами, которые мы не учли при постановке задачи, мы можем моделировать его как случайный — и считать, что колебания, вызванные вариациями всех этих факторов, может быть, удачненько лягут в нормальное распределение. Не знаю, как вам, а мне второй вывод кажется если даже и не сразу правильным, то как минимум первоочередным. В конце концов, мы всегда можем подозревать, что в наших данных будет какой-то шум, мешающий планам и отклоняющий точки от нужного значения. Подумаем сначала про него, а дальше, если что, можно и степень полинома подкрутить. Итак, мы делаем второй вывод, произносим слово «шум» и немедленно переносимся в теорию вероятностей. Удобнее всего (во всяком случае, мне) представить это так: наша зеленая линия пытается «прострелить» все синие точки, которые играют роль мишеней, при этом она может «промахиваться мимо», и размер промаха — как раз и есть тот самый шум. Предположим, что он Гауссовый (почему бы и нет). Тогда выстрел по мишени будет выглядеть так: Это все тот же график регрессии, только с зумом. Синяя точка — фактическое значение из датасета, красная — то, что предсказывает регрессия. Маленькие отклонения синего от красного вероятней (лежат недалеко от центра гауссианы), большие — менее вероятны. Становится понятно, что если мы предскажем «неправильный центр» (разместим красную точку где-то далеко), отклонение для синей точки станет большим и следовательно, маловероятным. В переводе на чуть более общепринятый язык эту вероятность называют правдоподобием (likelihood) и записывают в нашем гауссовском случае как Сама искомая вероятность, как мы предположили, задается нормальным распределением. Спишем из википедии формулу и перемножим вероятности для каждой точки между собой (отсюда индекс Ооокей, выглядит уже немного пугающе. Давайте, чтобы было немного полегче, зафиксируем Хээй, стало значительно веселее. Возьмем от этой штуки логарифм. Точка максимума при этом никуда не денется, зато произведение превратится в сумму, а экспонента — в свой показатель: Ну и совсем наконец, уберем минус в сумме, заменив максимум на минимум: Хм, где-то я уже видел такое выражение… … и оказывается, что максимум правдоподобия достигается там же, где и минимум среднеквадратического отклонения регрессии. Такие моменты всегда почему-то ужасно разочаровывают — я уже был уверен, что щас открою какой-нибудь новый метод регрессии, а мы вернулись туда, откуда начинали. С другой стороны, теперь мы знаем ответ на вопрос «а почему мы используем именно среднеквадратическое отклонение?» Раньше мы на это мысленно разводили руками, а теперь в курсе, что оно соответствует гауссовому шуму. Бонус-материал — если для оптимизации регрессии использовать абсолютную ошибку ( Ладно, все это было весело, и довольно общеизвестно, на самом деле — мы тут просто на досуге переизобрели метод максимального правдоподобия. Настало время шагнуть чуть глубже и на другой уровень сна. … как вы думаете, есть ли у вселенной параметры? Это серьезный вопрос. Мы еще из школьной физики знаем, что у некоторых вещей вроде как точно есть — ускорение свободного падения, скажем, равно 9.8 метра на секунду в квадрате, и если мы хотим узнать, как падают вещи, или скажем, замоделировать компьютерную игру с физикой, нам придется это число туда вкрутить (или как делают компьютерные игры, хм? может, там притяжение Земли делается по закону Ньютона? или, черт возьми, с учетом эффектов теории относительности?). Или скажем, у пространства есть три измерения (макроскопических измерения, поправляет меня Мартин Риз); не 3.1 и не 2.8, а точно 3. Если бы мы вдруг решили построить алгоритм машинного обучения, который бы решил измерить размерность пространства, мы бы тем выше оценивали его работу, чем ближе бы он казался к числу три. С другой стороны, есть ли точный, фиксированный параметр у того, сколько молока ребенок должен выпить за месяц? Сколько песен должна спеть птица, чтобы найти себе пару? В какой пропорции уменьшится опухоль после инъекции вещества X в тело пациента? Сколько воды протекает сквозь ручей за три минуты времени? Все эти вещи, несомненно, имеют под собой определенную закономерность — опухоль будет уменьшаться, ребенок — пить молоко, вода — течь, но если мы будем замерять точные значения, они постоянно будут колебаться, оставаясь при этом в каком-то интервале. Там, где в случае с физикой использование более точных инструментов дает нам все более точное значение величины («секунда есть время, равное 9 192 631 770 периодам излучения, соответствующего переходу между двумя сверхтонкими уровнями основного состояния атома цезия-133»), для измерения раковой опухоли нам скорее понадобится больше подопытных больных, чтобы очертить верхнюю и нижнюю границу и быть готовым к разным вариантам развития событий. Это вообще вопрос откуда-то скорее из философии — и где-то здесь проходит водораздел между байесовской и ортодоксальной (или частотной) статистикой. Если грубо (я чуть дальше исправлюсь), то ортодоксальный подход скажет, что на каком-то уровне настоящие параметры все-таки есть (просто мы еще до него не добрались, а когда-нибудь выяснится, что рост опухоли, скажем, зависит от комбинации нескольких четко определяемых факторов). Байесовец же скажет, что точного параметра не существует — если даже не на уровне физического дизайна вселенной, то на уровне наблюдаемых нами эффектов — и что с параметрами надо обращаться как со случайными величинами, которые могут колебаться в разные стороны. Давайте применим байесовскую философию «параметры — это случайные величины» к коэффициентам нашей регрессии. Для этого спишем теорему Байеса: Здесь … на самом деле есть даже-не-очень-сложные способы выразить posterior для регрессии аналитически — т.е., получить формулу, куда только подставить значения из датасета, и получится правильный ответ. Но мы будем делать все раздолбайским программистским способом — численно, итеративно, и совершенно неэффективно. Зато не придется читать про всякие инвертированные распределения Уишарта и прочие жуткие вещи, которые не проходят в школе (хотя потом все равно придется, так что если вы за хардкорный путь познания, то вэлкам). Логика тут такая: Выглядит это все довольно несложно: (перебрать все возможных комбинации коэффициентов нам поможет itertools.product ) В результате мы получим совместное распределение для наших коэффициентов регрессии — все их возможные значения будут суммироваться к единице. Получается, что у каждого набора коэффициентов будет какая-то вероятность, причем чем выше она, тем задаваемая ими кривая правильней и трушней. Возникает вопрос на миллион — как эту фигню нарисовать? Итого, выглядит это примерно так: А если отметить на графике данные, то так (прошу прощения за вырвиглазно-зеленый цвет): Заметьте, что более «горячие» кривые, конечно, имеют более высокую вероятность, но в Байесовской интерпретации это не означает, что эти кривые «правильные» (что мы должны взять их и выбросить все черные). Немного более интуитивный способ думать об этих кривых, по-моему — это представить, что вы смотрите как бы сверху на нормальное распределение, и видите, что в центре, конечно, есть какой-то пик вероятности, но сама по себе вероятность оказаться в точке пика все равно очень маленькая. Только собрав вместе какую-то часть распределения, можно «набрать» достаточно вероятности. Если вы все еще недоумеваете, зачем нам эта штука, то вот вам маленький бонус: байесовская регрессия неуязвима к переобучению (overfitting). Причем я не имею в виду просто «устойчива» или «надежна» как регрессия с регуляризацией — в определенной степени она к нему вообще неуязвима. Что такое переобучение, еще раз? Это когда мы «слишком подгоняем» модель к имеющимся данным (например, подбираем такую кривую, которая идеально пройдет через все точки датасета, но покажет плохие предсказания на новых данных). В переводе на философский язык прошлой секции это означает, что когда мы искали «правильный» набор параметров, мы нашли какой-то ошибочный, неправильный. Это невозможно сделать с байесовским подходом, потому что там просто нет понятия «правильного» набора параметров! Странный черно-желтый конус на картинках выше говорит нам: «да, скорее всего, следующие точки будут где-то в середине вдоль белых кривых, но могут оказаться и с краю, и выше, и ниже, никаких проблем». Степень полинома можно увеличивать сколько угодно: вместе с ней будет расти число возможных кривых, а у каждой из них по отдельности будет падать вероятность. «Выживут» все равно только те, которые будут лежать близко к данным, в нашем оранжево-«горячем» пучке. Сделаем пятую степень? Да никаких проблем, Хьюстон: Выглядит чуть более блеклым, но это просто потому, что я уменьшил общее количество кривых — иначе мой лаптоп бы не проснулся. На самом деле в таком контексте понятия переобучения вообще не существует. Невозможно неправильно найти параметр, потому что «параметр» — это не вещь, которую можно «найти», это здоровенное облако вероятности, которое становится «плотным» только там, где рядом лежат данные. Переобучения не существует, дамы и господа, расходимся. Не забудем сообщить всем этим важным ребятам из машинного обучения, что можно закрывать лавочку. Это не означает что байесовская регрессия всегда дает правильные предсказания и не может ошибаться — может, конечно. Допустим, следующая точка в датасете будет иметь x=3 и y=-20 и упадет гораздо ниже оранжевого пучка — тогда наша модель предскажет неправильное значение. Фокус в том, что обычную регрессию вам в этом месте понадобилось бы обучать с нуля и подправлять параметры, в то время как байесовскую нужно всего лишь «проапдейтить», положив новую точку в алгоритм — и пучок соответстветствующим образом изогнется. Кроме того, байесовская регрессия, как бы это, сказать, «инертная». Имея в наличии десяток точек вдоль белой кривой и один outlier, она, скорее всего, прогнется в его сторону немного, но не до конца. И это, вообще говоря, хорошо и правильно, потому что а вдруг это очередной результат шума? В машинном обучении есть такая очень простая техника — когда у вас есть несколько моделей и они все работают плохо, можно взять и усреднить (или еще как-нибудь объединить) их предсказания, и тогда они волшебным образом начинают работать хорошо. По-правильному это называется ансамбли, и их можно встретить почти где угодно, особенно на соревнованиях. И вообще говоря, это не интуитивный вопрос: почему ансамбли вообще работают? В реальной жизни вещи редко ведут себя таким образом: если у вас есть десять плохих молотков, гвоздь не станет забиваться лучше от того, что вы будете использовать их по очереди. Иллюстрация к этому вопросу частично служит неплохой интуицией (по-моему) на тему того, почему работает байесовская регрессия. Выглядит это как-то так: Зеленая линия — «сложная» модель (полином девятой степени), а синяя — «простая» (второй степени). Синией точки относятся к обучающей выборке, а красные — к тестовой. Желтая линия — простое среднее арифметическое между двумя моделями, и даже на глаз заметно, что она не такая размашистая, как зеленая, и действительно лежит ближе к красным точкам. Простота синего слегка компенсирует прыгучесть зеленого; средний вариант ближе к истине, чем оба отклонения, при условии, что отклонения направлены в разные стороны (это как раз одно из важных условий ансамблей — вам нужны разные модели для того, чтобы усреднение сработало). Настало время немного разочароваться: способ, который мы придумали для расчета posterior, плохой и работает только для каких-то очень маленьких задач. Дело в том, что количество всех возможных сочетаний параметров, которые нужно перебрать, растет экспоненциально. Мы оценивали его как число значений параметра в степени числа параметров, и уже для полинома девятой степени (десять коэффициентов/параметров) нам в текущем сеттинге придется пробежаться по циклу 10485760000000000 раз. А теперь настало время по-настоящему разочароваться: для более сложных моделей, то есть нейронных сетей (которые представляют собой просто несколько регрессионных юнитов, соединенных друг с другом), чистый байесовский метод становится еще более неприменимым. «Параметры» нейронной сети — это ее веса; а их в современных сетях может быть очень и очень много (миллионы штук с легкостью). Существуют всякие способы упростить этот процесс: например, случайным образом доставать значения posterior вместо того, чтобы рассчитывать его в каждой точки (это называется сэмплинг), но мы не зря их все проигнорировали — они недостаточно круты, чтобы помочь получить байесовскую нейронную сеть по-настоящему серьезных размеров. На самом деле для каких-то отдельных моделей все еще хуже. Наши коэффициенты регрессии, грубо говоря, «ни от чего не зависели»; если мы хотим посмотреть, как ведет себя модель с таким-то набором параметров, мы можем просто взять его и подставить в формулу Байеса. В сетях распределение весов отдельного нейрона может зависеть от того, как ведет себя предыдущий нейрон, а тот, в свою очередь, зависит от предыдущего (а настоящее веселье начинается, когда зависимости замыкаются в цикл). Собственно, это и есть главная причина, по которой лавочка не закрыта, люди продолжают бороться с переобучением Мы можем немного отступить назад и удовлетвориться частичным решением проблемы: найти максимум байесовского пучка, самую близкую к центру и самую «горячую» кривую. Это будет не так круто, как знание пучка целиком, но все лучше, чем то, с чего мы начинали. То есть мы ищем Теперь смотрите: с Подставляем вместо Коэффициент перед экспонентой опять-таки не важен для поиска максимума (он не зависит от Получается, что максимум достигается там, где сумма квадратов коэффициентов регрессии минимальна. Ничего не напоминает? Мы переизобрели регуляризацию, на минуточку, и получили отличное обоснование тому, зачем она вообще нужна (раньше это была какая-то технарско-инженерная штука, в духе «нуу, давайте просто заставим коэффициенты регрессии быть маленькими, чтобы она не прыгала туда-сюда», но с Байесом в ваш дом приходит просветление и все обретает смысл). На статистическом жаргоне это называется maximum a posteriori или MAP-learning. В отличие от «чистого» Байеса, MAP отлично применяется и к нейронным сетям, и к чему угодно — под скромным именем «регуляризация». К сожалению, это не тру-байесовское решение, потому что в конце концов мы заканчиваем игру с каким-то штучным «набором параметров» — и поэтому такой подход тоже может страдать от переобучения, хотя и более устойчив к нему, чем метод максимального правдоподобия.
$$P(y \mid x_1, \dots, x_n) \propto P(y) \prod_^
$$\hat
$$P(y \mid x_1, \dots, x_n) \propto P(y) \prod_^
$$\hat 1.9.1. Гауссовский наивный байесовский
$$P(x_i \mid y) = \frac<1><\sqrt<2\pi\sigma^2_y>> \exp\left(-\frac<(x_i — \mu_y)^2><2\sigma^2_y>\right)$$1.9.2. Мультиномиальных Наивный Байес
1.9.4. Бернулли Наивный Байес
$$P(x_i \mid y) = P(i \mid y) x_i + (1 — P(i \mid y)) (1 — x_i)$$1.9.5. Категориальный Наивный Байес
1.9.6. Подгонка нестандартной наивной байесовской модели
Байесовская нейронная сеть — потому что а почему бы и нет, черт возьми (часть 1)
Если вы не знали ничего — вам же легче, полпути уже пройдено.
Если вы на «ты» с байесовской статистикой, читали вот эту и вот эту статьи из Deepmind — не обращайте внимания на предыдущие две строчки и разрешите потом записаться к вам на консультацию по одному богословскому вопросу.Один шаг назад: линейная регрессия
Вероятностная интерпретация
точек нам достаточно взять полином степени
, чтобы он идеально прошел через все точки.
(где
и
— центр и стандартное отклонение гауссовой кривой), а в общем случае как
, где под
имеют в виду любые параметры. Смысл у нее везде одинаковый — «вероятность того, что если распределением данных управляют такие-то параметры
, результат будет именно
».
):
— тогда мы сможем выкинуть половину символов отсюда. Чтобы у нас не портилось выражение вероятности, отдельно укажем, что нас интересует максимум:
), то получится шум по Лапласу (такой заостренный в центре). От вопроса «а чем один лучше другого» стыдливо уклонимся.
Think Bayes
2560000 регрессий
означает «параметры в общем виде»; в нашем случае это уже знакомые коэффициенты полинома
. И мы уже знаем как минимум одну фигню из этой формулы —
, то самое правдоподобие, которое мы максимизировали секцией выше (еще раз вспомним, что оно считается как значение отклонений точек датасета от регрессионной кривой или как «средний размер промаха по мишени»).
называется априорной (prior) вероятностью и отражает наше изначальное предположение о том, как выглядит распределение параметров.
в отечественной литературе, по-моему, никак специально не называется (полная вероятность?), в других версия ее можно встретить под словом evidence — это общая вероятность получить такие данные, как у нас есть, при всех возможных значениях параметров
(пока не очень понятно, откуда ее брать). И наконец,
— апостериорная вероятность (posterior), которая означает буквально «что мы думаем о распределении параметров после того, как увидели данные».
Переобучения не существует, Нео
Почему ансамбли работают?
От нейрона к множеству нейронов
и искусственный интеллект так и не построили. В общем, если мы хотим добраться до цели, указанной в заголовке, нам потребуется что-нибудь еще. Поэтому в следующей части мы поговорим об аппроксимациях к апостерорной вероятности, вариационных методах в машинном обучении, и об обратном байесораспространении ошибки.Что сделать, чтобы хоть что-нибудь работало
. Берем привычный логарифм, чтобы превратить произведение в сумму:
мы уже разобразись в части про максимальное правдоподобие (под спойлером), и можем его пока проигнорировать. Что делать со вторым слагаемым (которое наш prior)? Для начала, вспомним, что
в нашем случае — это набор коэффициентов регрессии, и в качестве априорной оценки мы вполне можем сказать, что каждый коэффициент имеет какое-то свое, независимое распределение (т.е., записать выражение как
). Какое именно распределение взять? Мы раньше считали, что оно равномерное:
, но это скучно и сводится к максимальному правдоподобию (потому что тогда
будет константой — вероятность все время одинаковая, какие бы коэффициенты мы не взяли). Давайте предположим, что каждый коэффициент регрессии распределен по Гауссу с центром в точке 0 и каким-то стандартным отклонением
. Тогда:
формулу нормального распределения. Мы уже такое делали, только если помните, раньше у нас было фиксировано стандартное отклонение, а середина варьировалась. Сейчас мы фиксируем сразу все:
). Выкидываем его и применяем логарифм:



