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

Новички в ИНС обычно задают вопрос, можно ли выбрать оптимальную архитектуру. Архитектура нейронной сети может быть просто определена как количество слоев (особенно скрытых) и количество скрытых нейронов внутри этих слоев.

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

Это руководство гарантирует, что теория работает, обучая ИНС, созданную на Python, на основе количества (теоретически) выбранных скрытых слоев / нейронов и проверяет, работают ли все так, как ожидалось, или нет.

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

Шаги, которые мы будем выполнять для каждого примера:

  1. Изучите проблему, чтобы теоретически определить наилучшее количество скрытых слоев и скрытых нейронов (как обсуждалось в предыдущем руководстве).
  2. Реализуйте классификатор ИНС в Python на основе этих выбранных чисел.
  3. Обучите ИНС, чтобы убедиться, что проблема решена оптимальным образом с использованием этих выбранных чисел (т. Е. Количества скрытых слоев и скрытых нейронов).

Очень важно отметить, что объяснение в этом руководстве работает на 100% для простых задач (например, когда данные визуализируются в 2D). Увеличивая количество переменных, представляющих каждую выборку данных, процесс не будет таким простым.

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

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

Пример 1

В первом примере двоичной классификации образцы и метки классов приведены в таблице ниже. Мы хотим построить ИНС, чтобы оптимально классифицировать образцы.

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

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

После запуска кода мы можем увидеть результаты ниже. Основываясь на таком графике, какое количество скрытых слоев и скрытых нейронов лучше всего использовать? Чтобы ответить на этот вопрос, вы можете спросить себя: «Какое минимальное количество соединенных линий для разделения классов?» Такое количество строк представляет количество скрытых нейронов во всех скрытых слоях. Помните, что для задач линейной классификации не требуется использовать скрытые слои (т.е. классы можно разделить с помощью одной строки).

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

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

Следующий вопрос: «Сколько требуется скрытых слоев?» Помните, что один скрытый слой создает линии, используя свои скрытые нейроны. Продолжающийся скрытый слой соединяет эти линии. Количество соединений определяет количество скрытых нейронов в следующем скрытом слое.

Основываясь на этом объяснении, мы должны использовать 2 скрытых слоя, где первый слой имеет 2 нейрона, а второй слой - 1 нейрон. Поскольку есть всего 2 линии, то будет только одно соединение (то есть только один скрытый нейрон во втором скрытом слое). Мы можем использовать выходной нейрон для соединения линий, созданных нейронами первого скрытого слоя. Таким образом, мы избежали создания второго скрытого слоя.

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

Вот архитектура ИНС. Сеть имеет 6 весов и 3 значения смещения, всего 9 параметров, которые необходимо оптимизировать. Обратите внимание, что есть разница между параметром и гиперпараметром. Есть методы выбора наилучших значений параметра, но не столько для гиперпараметров.

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

Реализация Python

После определения наилучшего количества скрытых слоев и нейронов следующим шагом будет реализация ИНС на Python. Для этого используется библиотека Python scikit-learn.

Ниже приведен код Python для создания ИНС с использованием sklearn.neural_network.MLPClassifier(). Эта функция имеет аргумент с именем hidden_layer_sizes, который принимает кортеж, определяющий количество нейронов на каждом слое. Он установлен на (2,), чтобы отразить, что есть только один скрытый слой с двумя скрытыми нейронами. Для всех остальных аргументов установлены значения по умолчанию, за исключением max_iter, для которого установлено значение 1000.

Этот аргумент относится к максимальному количеству итераций, которые ИНС проходит для обучения. Его значение по умолчанию - 200, согласно его документации. Для него установлено более высокое значение (1000), чтобы обеспечить поиск лучшего решения.

Сеть обучается с использованием функции fit(), которая принимает входные данные для обучения и их метки классов. После обучения сеть предсказывает метку класса обучающих данных. Вот предполагаемые метки классов:

Predicted Labels: [1 1 1 0]

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

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

Чтобы избежать этой неприятности, внимательно изучите каждый параметр / гиперпараметр, чтобы выбрать его наилучшее значение. После этого убедитесь, что неверный результат вызван другим параметром / гиперпараметром. Мы изучили количество скрытых слоев и скрытых нейронов и пришли к выводу, что 1 скрытый слой с 2 ​​скрытыми нейронами является оптимальным. Таким образом, неверные результаты, безусловно, вызваны другим параметром / гиперпараметром.

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

После повторного обучения ИНС сеть успешно классифицировала каждую выборку правильно. Предполагаемые метки следующие:

Predicted Labels: [0 0 1 1]

Мы можем распечатать значения весов и смещения обученной ИНС, используя свойства coef_ и intercepts_, как указано ниже:

print("Weights:", my_neural_network.coefs_)

print("Bias:", my_neural_network.intercepts_)

Значения приведены ниже. В массиве весов есть 2 подмассива. Первый подмассив представляет собой веса между входным и скрытым слоями. Его форма 2x2, потому что есть 2 входных нейрона и 2 скрытых нейрона. Второй подмассив имеет всего 2 веса, потому что он соединяет скрытый слой, который имеет только 2 скрытых нейрона, с нейроном выходного слоя.

Weights:[[[-0.61517448,  1.61985297],

          [1.31241084, -2.15068833]], 

          [-1.08264469, -1.41812254]]

Bias: [[-0.59335652, -1.08860078], [1.9029974]]

Массив смещения также имеет 2 подмассива. Первый представляет значения смещения для 2 скрытых нейронов. Оставшийся подмассив имеет только одно значение смещения для выходного нейрона.

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

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

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

Чтобы инициализировать параметры выбранными значениями, мы можем редактировать свойства coefs_ и intercepts_ обученного NN.

Для получения дополнительной информации об искусственных нейронных сетях вы можете прочитать мою книгу Ахмед Фаузи Гад, Практические приложения компьютерного зрения, использующие глубокое обучение с CNN, 2018, Apress, доступную на Amazon:



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

Пример 2

Данные, использованные во втором примере, приведены в таблице ниже.

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

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

Поскольку требуется 4 линии, в первом скрытом слое есть 4 скрытых нейрона, которые их создают. Далее нам нужно снова соединить эти линии вместе.

Поскольку между линиями существует более одного соединения, мы должны использовать другие скрытые слои. Второй скрытый слой соединяет линии вместе для создания кривых (т.е. каждая кривая состоит из 2 линий), третий скрытый слой соединяет полученные кривые для создания других сложных кривых (т.е. каждая кривая состоит из 4 линий) и так далее.

В нашем примере мы можем использовать 2 других скрытых слоя. Первый создает кривые из двух линий. Этот слой создает 2 кривые для соединения. Для соединения этих кривых потребуется только одно соединение. Связь может быть создана третьим скрытым слоем, в котором будет только один скрытый нейрон.

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

В результате ИНС будет иметь 2 скрытых слоя, из которых первый слой состоит из 4 нейронов, а второй - из 2 нейронов.

Архитектура ИНС представлена ​​ниже. Всего имеется 18 весов и 7 значений смещения.

Как и раньше, мы можем начать построение ИНС с помощью scikit-learn в соответствии со следующим кодом. Обратите внимание, что точность не будет 100% с первого испытания по причинам, которые мы обсуждали ранее.

Один вариант правильных значений весов и смещения приведен ниже:

Weights: [[[-0.11971565, -0.68468314,  0.62948254,  0.06682123],
            [0.01606537,  0.88512252, -1.55299126,  0.62580047]], 
           [[ 6.88791269e-23, -1.44198952e-01],
            [-6.79527886e-01,  1.54075554e-01],
            [-1.99697458e+00,  1.32613210e+00],
            [-1.34877734e+00, -2.76520603e-01]], 
           [[2.27954167], [2.22460693]]]
 Bias: [[-0.7146014 ,  0.62833639, -0.29336681, -1.16921404], 
        [1.17869348, -0.66783576], [-1.31728651]]

Заключение

Это руководство практически отвечает на часто задаваемый вопрос об искусственных нейронных сетях: «Какую архитектуру лучше всего использовать?». Создав двумерный график данных, очень легко решить, сколько скрытых слоев использовать, а также сколько скрытых нейронов использовать для каждого слоя.

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

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

Для связи с автором

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

Независимая редакция, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее создавать лучшие модели машинного обучения.