Архитектура многослойного персептрона (MLP): критерии выбора количества скрытых слоев и размера скрытого слоя?

104

Если у нас есть 10 собственных векторов, то у нас может быть 10 нейронных узлов во входном слое. Если у нас есть 5 выходных классов, то у нас может быть 5 узлов в выходном слое. Но каковы критерии выбора количества скрытых слоев в MLP и сколько нейронных узлы в 1 скрытом слое?

Абхишек Кумар
источник

Ответы:

217

сколько скрытых слоев ?

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

Предполагая, что ваши данные действительно требуют разделения нелинейным методом, всегда начинайте с одного скрытого слоя . Почти наверняка это все, что вам нужно. Если ваши данные разделяются с помощью MLP, то для этого MLP, вероятно, нужен только один скрытый слой. Для этого есть теоретическое обоснование, но моя причина чисто эмпирическая: многие сложные задачи классификации / регрессии решаются с использованием MLP с одним скрытым слоем, но я не припоминаю, чтобы встречал какие-либо многослойные MLP с несколькими скрытыми слоями, используемые для успешного моделирования данных - - Будь то на досках объявлений ML, учебниках ML, академических статьях и т. д. Они, безусловно, существуют, но обстоятельства, оправдывающие их использование, эмпирически довольно редки.


Сколько узлов в скрытом слое?

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

RoT на основе улучшения сходимости:

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

Зачем? Во-первых, несколько дополнительных узлов в скрытом слое вряд ли причинят вред - ваш MLP все равно будет сходиться. С другой стороны, слишком мало узлов в скрытом слое может помешать сходимости. Подумайте об этом так: дополнительные узлы обеспечивают некоторую избыточную емкость - дополнительные веса для хранения / передачи сигнала в сеть во время итерации (обучение или построение модели). Во-вторых, если вы начнете с дополнительных узлов в скрытом слое, то позже (во время итерации) их легко удалить. Это обычное дело, и существуют диагностические методы, которые могут вам помочь (например, диаграмма Хинтона, которая представляет собой просто визуальное изображение весовых матриц, «тепловую карту» весовых значений).

RoT на основе размера входного слоя и размера выходного слоя:

Как показывает практика, размер этого [скрытого] слоя должен находиться где-то между размером входного слоя ... и размером выходного слоя ....

Для расчета количества скрытых узлов мы используем общее правило: (Количество входов + выходов) x 2/3

RoT на основе основных компонентов:

Как правило, мы указываем столько скрытых узлов, сколько измерений [основных компонентов] необходимо для захвата 70–90% дисперсии входного набора данных .

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

По его мнению (и мне всегда казалось, что он знает, о чем он говорит), выберите количество нейронов в скрытом слое в зависимости от того, включает ли ваш MLP некоторую форму регуляризации или раннюю остановку. .

Единственный действенный метод оптимизации количества нейронов в скрытом слое:

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

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


На практике я делаю так:

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

выходной слой : единственно определяется моей моделью: регрессия (один узел) по сравнению с классификацией (количество узлов, эквивалентное количеству классов, при условии softmax)

скрытый слой : для начала , один скрытый слойс количеством узлов, равным размеру входного слоя. «Идеальный» размер, скорее всего, будет меньше (т. Е. Некоторое количество узлов между числом во входном слое и числом в выходном слое), а не больше - опять же, это просто эмпирическое наблюдение, и основная масса этого наблюдения - мой собственный опыт. Если проект оправдал необходимое дополнительное время, то я начинаю с одного скрытого слоя, состоящего из небольшого количества узлов, затем (как я объяснил чуть выше) я добавляю узлы к скрытому слою по одному, вычисляя обобщение. ошибка, ошибка обучения, систематическая ошибка и дисперсия. Когда ошибка обобщения снизилась и непосредственно перед тем, как она снова начнет увеличиваться, я выбираю количество узлов в этой точке. См. Рисунок ниже.

введите описание изображения здесь

дуг
источник
1
Я хотел бы добавить некоторые связанные результаты, касающиеся RoT №1: в успешных SVM вы фактически сопоставляете свой ввод с пространством более высокого измерения (больше скрытых узлов, чем узлов во входном слое на языке NN). Задача выходного слоя - получить решение из этого сверхполного представления. Также может быть связь со случайными проекциями. В блестящей статье Адама Коутса и Эндрю Й. Нг (2011) обсуждаются связанные темы.
Владислав Довгалец
Хорошее объяснение. Есть идеи, как я могу построить фигуру, подобную приведенной выше, при использовании sklearn и MLPClassifier?
seralouk 08
1
@sera ты про стиль xkcd?
denfromufa
В принципе, можно ли автоматизировать процесс оптимизации количества нейронов в скрытом слое? Кроме того, не могли бы вы автоматически оптимизировать количество скрытых слоев?
Эддисон,
2

Очень сложно выбрать количество нейронов в скрытом слое и выбрать количество скрытых слоев в вашей нейронной сети.

Обычно для большинства приложений достаточно одного скрытого слоя. Кроме того, количество нейронов в этом скрытом слое должно быть между количеством входов (10 в вашем примере) и количеством выходов (5 в вашем примере).

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

Ове
источник
2

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

Ключевые элементы:

  1. Хромосома : вектор, который определяет количество единиц в каждом скрытом слое (например, [20,5,1,0,0] означает 20 единиц в первом скрытом слое, 5 во втором, ..., при отсутствии слоев 4 и 5). Вы можете установить ограничение на максимальное количество пробных слоев и максимальное количество единиц на каждом слое. Вы также должны установить ограничения на то, как создаются хромосомы. Например, [10, 0, 3, ...] не должны создаваться, потому что любые единицы после пропущенного слоя ('3, ...') не будут иметь значения и будут тратить циклы оценки.
  2. Функция пригодности : функция, которая возвращает значение, обратное наименьшей ошибке обучения в наборе перекрестной проверки сети, определенной данной хромосомой. Вы также можете включить общее количество единиц или время вычисления, если хотите найти «самую маленькую / самую быструю, но наиболее точную сеть».

Вы также можете рассмотреть:

  • Сокращение : начните с большой сети, затем уменьшите количество слоев и скрытых блоков, отслеживая при этом производительность набора перекрестной проверки.
  • Рост : начните с очень маленькой сети, затем добавьте блоки и слои и снова отслеживайте производительность набора CV.
Как только
источник
0

Недавно появилась теоретическая работа над этим https://arxiv.org/abs/1809.09953 . Предполагая, что вы используете RELU MLP, все скрытые слои имеют одинаковое количество узлов, а ваша функция потерь и истинная функция, которые вы аппроксимируете нейронной сетью, подчиняются некоторым техническим свойствам (в документе), вы можете выбрать глубину порядок $ \ log (n) $ и ширина скрытых слоев должны быть порядка $ n ^ {d / (2 (\ beta + d))} \ log ^ 2 (n) $. Здесь $ n $ - размер вашей выборки, $ d $ - размер вашего входного вектора, а $ \ beta $ - параметр гладкости для вашей истинной функции. Поскольку $ \ beta $ неизвестно, вы, вероятно, захотите рассматривать его как гиперпараметр.

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

младший студент
источник