Практический вводный курс по методам машинного обучения для врачей и медицинских работников.

Искусственная нейронная сеть

Резюме

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

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

Обновление комплекта ПЛАТЬЯ

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

Обзор модели

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

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

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

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

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

Сильные стороны и ограничения

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

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

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

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

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

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

Выполнение

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

Скрипт немного отличается от того, который мы использовали для создания случайной модели леса/дополнительных деревьев или машины повышения градиента. Давайте подробно рассмотрим изменения. Вместо прямого вызова функции DRESS.multilayerPerceptron мы вызываем DRESS.async, вспомогательную функцию в DRESS Kit, которая позволяет вызывать асинхронные функции. Первый параметр — это имя функции DRESS Kit, которую мы хотим запустить асинхронно. Важно отметить, что мы НЕ передаем фактическую функцию в качестве параметра, а только имя функции в виде строки. Последующие параметры передаются так же, как если бы мы вызывали DRESS.multilayerPerceptron синхронно. Функция DRESS.async возвращает обещание JavaScript, которое в конечном итоге преобразуется в объект результата после завершения функции. Возможно, стоит рассмотреть основные понятия асинхронного программирования здесь. Чтобы воздействовать на объект результата, нам нужно вызвать функцию .then, связанную с объектом Promise, и передать функцию стрелки в качестве параметра. Ожидается, что стрелочная функция получит объект результата в качестве параметра.

Из-за присущих JavaScript ограничений объект результата, разрешенный объектом Promise, не содержит никакой исполняемой функции. Прежде чем мы сможем вызвать функцию model.predict или другую функцию, связанную с моделью, мы должны перестроить модель. К счастью, это можно сделать легко и эффективно, снова синхронно передав объект результата в DRESS.multilayerPerceptron. Мы передаем весь объект Promise вместе с функцией then в DRESS.print, который автоматически отображает таймер, чтобы помочь нам отслеживать ход выполнения асинхронного вызова функции. Мы возвращаем результат прогноза из функции then, чтобы его также могла отобразить функция DRESS.print.

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

Онлайн обучение

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

Мы можем смоделировать это поведение онлайн-обучения, разделив набор обучающих данных на несколько пакетов и применяя по одному пакету за раз. Сначала мы строим многослойный персептрон, используя первую партию обучающих выборок, вызывая DRESS.multilayerPerceptron, затем тестируем производительность, используя model.performance, и применяем дополнительные обучающие выборки, используя model.train. Из распечатки видно, что производительность модели довольно сильно колеблется в течение первых нескольких партий, но она улучшается и сходится к концу процесса обучения.

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

Оптимизация

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

Прежде чем мы подробно рассмотрим каждый гиперпараметр, важно подчеркнуть, что некоторые методы оптимизации могут зависеть от реализации, то есть в зависимости от базовых кодов одна оптимизация может быть более продуктивной, чем другие, а некоторые гиперпараметры могут быть недоступны из-за особенностей реализации. конкретные ограничения. Например, реализация многослойного перцептрона в DRESS Kit поддерживает только Оптимизатор Адама, но существует несколько других оптимизаторов, таких как RMSProp и AdaGrad.

Схема сети

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

Увеличение количества слоев в многослойном персептроне также увеличивает способность сети справляться со сложными проблемами, но по-другому. Поскольку каждый нейрон из скрытого слоя полностью связан со всеми нейронами в соседних слоях, нейроны в более глубоких слоях принимают решения на основе комбинации нескольких предикторов одновременно. Таким образом, добавление слоев позволяет сети достигать более высоких уровней абстракции. Однако важно отметить, что добавление дополнительных слоев увеличивает время обучения в геометрической прогрессии. (т. е. сеть с одним скрытым слоем размером 10 и другим скрытым слоем размером 20 имеет 200 соединений, а сеть с тремя скрытыми слоями размера 10 имеет 1000 соединений). В общем случае многослойный персептрон с 2–3 скрытыми слоями достаточно для большинства приложений.

По умолчанию реализация многослойного персептрона в DRESS Kit имеет два скрытых слоя, и алгоритм использует простую эвристику для определения подходящего количества нейронов на слой. Мы можем изменить структуру нашей модели, указав гиперпараметр layout. Вот результаты нескольких различных макетов, которые мы пробовали. Мы видим, что коэффициент детерминации (R2) сети, основанный на 5-кратной перекрестной проверке, существенно не меняется, несмотря на добавление значительно большего количества нейронов из [5, 3] (имеется в виду скрытый слой из 5 нейронов, следующих за скрытым слоем из 3 нейронов) до [20, 10] (скрытый слой из 20 нейронов, за которым следует скрытый слой из 10 нейронов). Между тем, время обучения почти в четыре раза. Интересно, что мы также видим, что добавление дополнительных слоев на самом деле ухудшает производительность и экспоненциально увеличивает время обучения.

[5] R2 0.94 
[7] R2 0.95 
[10] R2 0.96 
[15] R2 0.96 
[3, 3] R2 0.93 
[5, 3] R2 0.94 
[7, 5] R2 0.94 
[10, 5] R2 0.95 
[10, 10] R2 0.96 
[20, 10] R2 0.96 
[7, 5, 3] R2 0.95 
[10, 7, 5] R2 0.94 
[7, 5, 5, 3] R2 0.93

Функция активации

Следующий гиперпараметр, который следует учитывать при проектировании нейронной сети, — это используемая функция активации. Основная цель функции активации состоит в том, чтобы ввести в сеть нелинейность. Существует широкий набор функций активации, каждая из которых имеет свои отличительные рабочие характеристики. Хорошей новостью является то, что Leaky Rectified Linear Unit (Leaky ReLU), как было показано, в большинстве случаев обеспечивает превосходную производительность по сравнению с другими функциями активации. Если нет особых причин для рассмотрения другой функции активации, обычно безопасно использовать Leaky ReLU во всех скрытых слоях многослойного персептрона.

Эпоха

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

25 R2 0.92 
50 R2 0.93 
100 R2 0.94 
250 R2 0.95 
500 R2 0.96

Разбавление

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

0.10 R2 0.94 
0.25 R2 0.95 
0.50 R2 0.96 
0.75 R2 0.95 
0.90 R2 0.94

Скорость обучения

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

0.0005 R2 0.95 
0.001 R2 0.95 
0.005 R2 0.95 
0.01 R2 0.94 
0.05 R2 0.88

Импульс

Алгоритм ванильного стохастического градиентного спуска может медленно сходиться к оптимальной точке, если скорость обучения мала. В идеале алгоритм должен начинаться с более высокой скорости обучения в начале и постепенно снижать скорость по мере приближения к оптимальной точке. Этот метод используется в ряде алгоритмов оптимизатора на основе импульса для ускорения процесса обучения. Оптимизатор Адама, используемый реализацией DRESS Kit, поддерживает связанные с импульсом гиперпараметры beta1 и beta2. Значения по умолчанию для этих гиперпараметров подходят для большинства случаев использования.

Другие типы искусственных нейронных сетей

Как мы упоминали ранее, многослойный персептрон — это лишь один из многих типов искусственных нейронных сетей. Большинство многослойных персептронов могут хорошо работать только с несколькими скрытыми слоями. Хотя формального определения нет, многослойные персептроны, которые содержат множество (например, десятки) скрытых слоев, иногда называют глубокой нейронной сетью.

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

Заворачивать

Давайте повторим то, что мы узнали в Части VI. Мы обсудили базовую анатомию искусственной нейронной сети и объяснили, как сеть взаимосвязанных искусственных нейронов может выполнять обучение посредством прямого и обратного распространения. Мы продемонстрировали код для асинхронного построения многослойного персептрона с использованием DRESS.multilayerPerceptron и DRESS.async. Мы также продемонстрировали код для создания и обучения многослойного персептрона с использованием метода онлайн-обучения. Мы изучили различные гиперпараметры и обсудили проблемы полной оптимизации искусственной нейронной сети. Наконец, мы коснулись других вариантов использования искусственных нейронных сетей помимо классификации и регрессии.

Резюме модели

Многослойный персептрон

Сильные стороны

  • Поддержка произвольной границы решения
  • Поддержка высокоуровневой абстракции
  • Может моделировать несколько результатов одновременно
  • Менее склонен к переоснащению

Ограничения

  • Работает только с числовыми предикторами
  • Операция черного ящика
  • Медленно тренироваться
  • Сложно оптимизировать