Теорема Байеса дает возможность ИИ отвечать на вопросы с неопределенностью

Если есть одно приложение машинного обучения, которое, как известно, является особенно полезным и часто успешным, то это классификация. Классификация - это задача отнесения данной записи к одному классу (например кошка или тигр?). Обычно каждая запись, которая должна быть обработана, представлена ​​численно в виде вектора чисел, который может кодировать высокоуровневые характеристики (например длину хвоста, наличие полос или пятен и т. Д.) Или низкий -уровневые (например значение каждого пикселя в изображении). За прошедшие годы сообществом было изучено множество различных классификаторов, самыми популярными из которых являются искусственные нейронные сети, деревья решений, вспомогательные векторные машины или другие алгоритмы, такие как кластеризация k-средних. . В этой статье я сосредоточусь на нейронных сетях, но рассуждение может быть адаптировано к другим типам классификаторов.

Обычно нейронные сети состоят из одного входного слоя (который принимает входные функции), ряда скрытых слоев (чем больше это число, тем глубже сеть) и выходного слоя. Выходной слой обычно имеет один единственный узел для задач двоичной классификации (например cat vs tiger) или N узлов в случае более чем просто два класса (например кошка vs тигр vs лев). Часто студентам предлагается простая задача классификации, которая называется набором данных Ириса Фишера. Необходимо создать классификатор, который сможет разделить три вида цветка под названием (versicolor, setosa и virginica) на основе четырех простых входные характеристики (длина и ширина чашелистика, длина и ширина лепестка). Набор данных был впервые представлен статистиком Рональдом Фишером в его статье 1936 года Использование множественных измерений в таксономических задачах.

Эта проблема, как известно, решается особенно легко, при этом сохраняются многие аспекты обучения. Мы попытаемся решить эту проблему с помощью конкретной нейронной сети, которая включает байесовский вывод, чтобы дать не просто ответ, но и ответ с соответствующей неопределенностью. Код, использованный для этого сообщения, публично доступен по адресу https://github.com/rdisipio/DeepBayesIris.

Почему нас вообще беспокоят неопределенности - это почти философский вопрос. Проще говоря, любой человек (по крайней мере, разумный) почувствовал бы разницу между словами Это Iris setosa и Это похоже на Iris setosa , но с вероятностью 30% это Iris virginica . Большинство классификаторов могут дать только результат, похожий на первое предложение, в основном потому, что последнее очень сложно вычислить. Это достигается путем опоры на теорему Байеса: при получении новой информации о чем-то его убеждение (апостериорная вероятность) обновляется смесью наблюдаемого (свидетельства) и того, что было известно ранее (априорная вероятность). В частности, если исходное убеждение очень сильное, никакие доказательства не могут изменить его убеждение (подумайте, например, о предвзятости подтверждения). На практике теорема выражается математической формулой в терминах вероятностей, связанных с гипотезой (H) и данными (D):

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

Для этого конкретного приложения я настроил полностью подключенный многослойный перцептрон с прямой связью (полный рот, но на самом деле это простейший тип нейронной сети!) С четырьмя входными узлами, одним скрытым слоем с пятью узлами и tanh активация и выходной слой с тремя узлами (по одному для каждой категории) и softmax активацией. Функция softmax гарантирует, что результат можно интерпретировать как вероятность, т.е., каждый узел имеет значение от 0 до 1, а сумма всех узлов равна 1. Функция потерь - это кросс-энтропия, которая надлежащим образом измеряет производительность модели классификации, выходом которой является значение вероятности.

Прежде чем мы углубимся в детали реализации, давайте проясним, как мы собираемся использовать этот тип сети. Для начала мы найдем оптимальный набор весов и смещений H *, который оптимизирует функцию потерь - в этом контексте мы будем искать максимум функция, а не минимум, как в традиционных пакетах программного обеспечения для машинного обучения. Результатом этого «байесовского обучения» будет набор параметров и неопределенностей. Кроме того, мы хотим оценить корреляции между параметрами, которые нам понадобятся для вывода, как описано ниже. На этапе вывода мы прогнозируем класс данной записи с помощью нейронной сети с той же архитектурой, но выполняемой несколько раз, каждый раз с немного другим набором параметров. Среднее значение всех этих прогонов даст нам центральное значение и связанную с ним неопределенность.

Фактическая реализация основана на двух программных библиотеках C ++, популярных в сообществе физиков высоких энергий: ROOT (разработан CERN) и Bayesian Analysis Toolkit (BAT). За кулисами BAT исследует многомерное распределение вероятностей H с помощью статистического метода под названием Метрополис-Гастингс (см. Мой предыдущий пост о том, как этот метод используется для прогнозирования заработной платы руководителей крупных компаний). Он принадлежит к классу алгоритмов дискретизации, который называется цепь Маркова Монте-Карло (MCMC). Известно, что этот алгоритм особенно эффективен, когда количество исследуемых измерений очень велико. На практике нужно создать производный класс от BAT :: BCModel, а затем определить набор параметров и их диапазон (в этом простом примере все они находятся в диапазоне [-100,100]). Что наиболее важно, необходимо реализовать виртуальную функцию BCModel :: LogLikelihood (std :: vector ‹double›), чтобы вычислить термин свидетельство, который появляется в теореме Байеса как функцию параметров H для каждой итерации MCMC. Можно также повторно реализовать оценку предшествующих распределений, но для простоты они могут быть установлены на гауссовское распределение со средним значением 0 и стандартным отклонением, которое покрывает 1/4 допустимого диапазона (100/4 = 25 в этом примере) . Это очень грубое предположение, которое в принципе можно заменить еще менее информативным априорным константой. Однако весь смысл использования байесовских методов состоит в том, чтобы изложить наши предыдущие убеждения: в этом случае, я думаю, будет справедливо сказать, что можно ожидать, что значение параметров будет небольшим, но оставляет место для более точной оценки. Позже мы увидим, как на самом деле выглядит это обновление.

Внутри функции LogLikelihood () параметры передаются в класс FeedForward, который их меняет, а затем фактически выполняет расчет нейронной сети. Результат сравнивается с помощью потери кросс-энтропии относительно известной метки ([1,0,0] для setosa, [0,1,0] для versicolor и [0,0,1] для virginica). Механизм MCMC рисует случайные значения параметров, вычисляет потери и переходит к ближайшей точке в соответствии с алгоритмом Метрополиса-Гастингса. Для дальнейшего уточнения оптимизации «исследование» выполняется с помощью ряда параллельных цепочек (обычно 4 или 8, до одной на ядро ​​ЦП), которые в идеале должны сходиться к одной и той же оптимальной точке.

В конце процесса апостериорные распределения доступны для отдельных параметров (маргинальные одномерные распределения) или пар параметров (маргинальные двухмерные распределения). В идеале эти одномерные распределения должны быть гауссовскими вокруг наиболее вероятного значения соответствующего веса сети. На самом деле нейронные сети - это сложные системы, которые очень редко имеют глобальный максимум, который можно эффективно идентифицировать. Более вероятно, что будет большой набор локальных максимумов, которые достаточно хороши для решения рассматриваемой задачи классификации. Это отражается апостериорным распределением с несколькими пиками, каждый из которых соответствует разному максимуму. Однако нет простого способа рассматривать эти случаи, и требуется некоторое приближение. В этой реализации метода я решил использовать среднее значение распределения в качестве веса и среднеквадратичное значение в качестве неопределенности для одного и того же веса. Кроме того, из двумерных маргинализованных распределений можно оценить ковариационную матрицу, где элемент C_ij задается, например, коэффициентом корреляции Пирсона между двумерными маргинализованными распределениями i -я и j -я веса. Эта информация сохраняется в текстовый файл, который будет использоваться для вывода.

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

Теперь пришло время прояснить, почему нам нужно распространять ковариационную матрицу на шаг вывода: мы не можем просто выбрасывать случайные числа, как если бы веса были независимыми друг от друга, в то время как на самом деле они коррелированы . В принципе, мы хотели бы изучить полную N -мерную функцию распределения вероятностей для H *, но это слишком сложно. Скорее, мы можем аппроксимировать это многомерным нормальным распределением X ~ N (μ, σ), то есть N -мерным эквивалентом гауссиана (μ - вектор центральных значений весов, σ - вектор стандартных отклонений):

Однако выборка из X - непростая задача. Оказывается, в 1D проще превратить стандартную нормальную случайную величину Z ~ N (0,1) в нормальную случайную величину N X = μ + √σ * Z. Та же идея сохраняется в нескольких измерениях, но вместо скалярного значения дисперсии у нас есть ковариационная матрица. Но подождите: каков квадратный корень матрицы C? По определению он должен выглядеть как C = C ^ (1/2) * (C ^ (1/2)) ^ T. Наиболее распространенный способ найти матрицу C ^ (1/2) - это разложение Холецкого, в котором получается треугольная матрица U, такая что C = U ^ T U (U оказывается верхней треугольной матрицей, но эквивалентная формулировка с нижней треугольной матрицей также существует). Следовательно, просто получается X = μ + U ^ T * Z.

Наконец, мы классифицируем данное событие и смотрим, какова реакция нейронной сети.

В первом случае у сети нет проблем с классификацией цветка: это…

В этом другом случае результат почти очевиден ...

В частности, последний пример предполагает, что категория №1 (versicolor) более вероятна, чем категория №2 (virginica). Однако при более внимательном рассмотрении можно увидеть, что две полосы неопределенности перекрываются, что снижает статистическую значимость - на самом деле, этот случай практически не классифицируется, и единственный вывод, который можно сделать, состоит в том, что этот цветок вряд ли будет iris setosa. .

Подводя итоги, это простой и красивый пример, который показывает, насколько важно не только классифицировать вещи, но и придавать неопределенность решению. Вот как люди используют новую информацию и применяют свой разум в процессе принятия решений. Вероятно, в рассматриваемом случае это не имеет большого значения, но, как обсуждалось в книге американского математика Кэти О'Нил Оружие разрушения математики, слепое доверие к результатам классификаторов AI / ML может иметь ужасные последствия в социально-экономических ситуациях, когда входными данными являются люди, а не цветы.