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

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

Например, если вы обучите классификатор на кошках и собаках, он сможет выводить только кошку или собаку. Но если вы скармливаете ему изображение грузовика, модель все равно будет делать прогноз, и иногда с большой вероятностью, например, с вероятностью кота, близкого к 1, и собаки, близкого к 0, в то время как ваша модель должна просто сказать: «Хорошо, это что-то Я не узнаю ». Это особенно важно, когда мы смотрим на медицинские приложения, в которых необходимо учитывать неопределенность.

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

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

I. Краткий обзор байесовских нейронных сетей

Байесовские нейронные сети (BNN) - это способ добавить в наши модели обработку неопределенности. Идея проста: вместо того, чтобы иметь детерминированные веса, которые мы изучаем, мы вместо этого изучаем параметры случайной величины, которые мы будем использовать для выборки наших весов во время прямого распространения. Затем, чтобы узнать параметры, мы будем использовать обратное распространение, иногда с небольшим трюком, чтобы сделать наши параметры дифференцируемыми.

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

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

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

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

  • Начните со случайных параметров для распределения вашего BNN, то есть инициализируйте свою популяцию с некоторыми параметрами, например, если вы хотите иметь гауссовские веса, начните с 0 среднего и единичной дисперсии.
  • Для каждого пакета во время цикла обучения:
    - Выберите свои веса в соответствии с распределениями, связанными с каждым слоем.
    - Выполните прямой проход с этими весами, как в обычной сети
    - Обратное распространение потери на параметры распределения, сгенерировавшего веса

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

Итак, в конце концов, зачем нам изучать распределения вероятностей по нашим весам вместо того, чтобы изучать веса напрямую? Есть две основные причины :

  • Во-первых, это предотвращает переоснащение
  • Во-вторых, это позволяет получить оценки неопределенности

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

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

Благодаря дисперсии прогнозов для одного и того же входа байесовские нейронные сети могут выводить неопределенность своих прогнозов. Давайте посмотрим на простую задачу регрессии ниже:

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

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

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

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

II. Отказ от учебы как способ сделать вашу НС байесовской

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

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

Дропаут обычно используется следующим образом:

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

Итак, как Dropout соотносится с байесовскими нейронными сетями? Что ж, использование Dropout можно рассматривать как использование случайных переменных Бернулли для выборки ваших весов, и поэтому, просто добавляя Dropout, вы делаете свою нейронную сеть байесовской!

Математика изучается в статье Исключение как байесовское приближение: представление неопределенности модели в глубоком обучении. Я настоятельно рекомендую вам прочитать его, хотя на первый взгляд это непросто, но в нем объясняется большая часть теории, лежащей в основе Dropout как байесовской нейронной сети, особенно они охватывают то, что будет предшествующим, апостериорным и связанным с ним KL. срок, но мы обсудим это в другой статье.

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

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

Итак, прежде чем мы приступим к изучению этих результатов на конкретных примерах, позвольте мне подвести итог всему, что мы видели до сих пор:

  • Байесовские нейронные сети используют вероятностные распределения весов вместо детерминированных весов. Каждый прямой проход будет отбирать разные веса и, следовательно, иметь разные выходные данные. Можно увидеть, что байесовские нейронные сети имеют не одну модель, а ансамбль моделей, который дает нам разные предикторы для каждой выборки.
  • Учитывая, что один и тот же входной сигнал может иметь разные выходы после прямого прохода, мы можем увидеть, насколько уверена наша модель, посмотрев на дисперсию разных прогнозов, потому что, если модель неуверена, мы ожидаем, что дисперсия будет высокой.
  • Dropout - это способ сделать вашу нейронную сеть байесовской почти бесплатно, и чтобы использовать его во время вывода, вам просто нужно сохранить Dropout и выбрать несколько моделей, это называется MC Dropout.

III. Изучение примеров Fastai с MC Dropout

Теперь, когда мы увидели, как работают BNN и как мы можем легко их реализовать с помощью Dropout, мы рассмотрим несколько примеров с использованием Fastai.

Код можно найти в этом репозитории Github: https://github.com/DanyWind/fastai_bayesian, и если вы хотите запустить его прямо в Colab, вот ссылка: https://colab.research.google .com / drive / 1bIFAWl_o__ZKFSVvE9994WJ2cfD9976i

Независимо от задачи процесс будет одинаковым:

  • Сначала обучите свою модель с помощью API Fastai, который мы все знаем: lr_find, fit_one_cycle и т. Д.
  • Наконец, чтобы сохранить Dropout во время вывода MC Dropout, просто добавьте эти строки кода:

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

Метрики также определены в Colab, но мы не будем их рассматривать, так как это довольно стандартно. В частности, мы будем использовать одну метрику неопределенности, которая работает только для классификации: Энтропия.

Если есть классы C, которые нужно предсказать, и мы выбираем T раз нашу модель для вывода, то энтропия определяется как:

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

А. Классификатор кошек и собак

Здесь мы сосредоточимся на наборе данных Cats and Dogs. Как видно на картинке, мы постараемся классифицировать по картинке породу собаки или кошки.

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

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

Как вы можете видеть здесь, изображения, известные для этой модели, имеют низкую энтропию, в то время как полностью нераспространяемые изображения будут иметь высокую энтропию. Интересно отметить, что вероятности softmax не дают информации о неопределенности, поскольку в записной книжке Colab мы можем видеть, что самая высокая вероятность, присвоенная классу для Night King, составляет 90%, даже больше, чем кошка, которая было 78%!

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

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

Интересно посмотреть, как энтропия ведет себя по-разному, независимо от того, верна наша модель или нет, и высокая энтропия, похоже, сильно коррелирует с ошибочной классификацией! Если мы вернемся к нашему примеру с Королем ночи, мы увидим, что энтропия 2,2 действительно высока и обычно встречается в неправильно классифицированных выборках, в то время как у обычного кота довольно низкая энтропия 0,7, что обычно.

Б. Анализ настроений с отзывами IMDB

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

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

(Text xxbos xxmaj just got my copy of this xxup dvd two disc set and while not perfect , i found the overall experience to be a fun way to waste some time . i have to say right up front that i am a huge fan of xxmaj zombie movies , and i truly think that the fine people who made these films must be too . i also have a soft spot for people who are trying , sometimes against all odds , to live a dream . xxmaj and again , these people are doing it . xxmaj is this some award - winning collection of amazing film ? xxmaj no . xxmaj not even close . xxmaj but for what they do on their xxunk xxunk , these films should be recommended . xxmaj for me , the bottom line is always , was i entertained ? xxmaj did i have a good time with this movie ? xxmaj and here the answer to both was " xxmaj yes ... Category positive)

С. Классификация табличных данных с доходом взрослых

Наконец, мы рассмотрим набор данных о доходах взрослых здесь, где мы попытаемся предсказать, зарабатывает ли кто-то более 50 тысяч в год, на основе социально-экономических переменных. Мы также рассмотрим наиболее достоверные и неопределенные прогнозы.

Я думаю, что этот пример интересен, поскольку он может вызвать некоторые этические вопросы для моделей, которые не принимают во внимание неопределенность.

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

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

Заключение

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

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

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

Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне в Linkedin, вы также можете найти меня в Twitter!