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

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

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

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

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

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

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

 [RoT](https://en.wikibooks.org/wiki/Artificial_Neural_Networks/Neural_Network_Basics) на основе улучшения конвергенции:

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

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

 [@ Гнилые клубн](ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hu) на основе размера входного слоя и размера выходного слоя:

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

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

 [RoT](ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hu) на основе основных компонентов:

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

 И все же[NN FAQ](ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hu) author называет эти Правила «бессмыслицей» (буквально), потому что они: игнорируют количество обучающих экземпляров, шум в целях (значения переменных ответа) и сложность пространства признаков.

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

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

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

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

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

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

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

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

![]()



 крытых слоев в нейронной сети.

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

 Но лучший способ выбрать количество нейронов и скрытых слоев - это эксперименты. Обучите несколько нейронных сетей с различным количеством скрытых слоев и скрытых нейронов и измерьте производительность этих сетей, используя[перекрестная проверк](https://en.wikipedia.org/wiki/Cross-validation_%28statistics%29). Вы можете придерживаться числа, которое дает наиболее эффективную сеть.



 количества нейронов для каждого из слоев, вы можете использовать **[генетическая оптимизация](https://en.wikipedia.org/wiki/Genetic_algorithm)**.

 Ключевые части будут:

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

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