Как установить количество нейронов и слоев в нейронных сетях

26

Я новичок в нейронных сетях, и мне было трудно понять две концепции:

  1. Как определить количество средних слоев в данной нейронной сети? 1 против 10 или что-то еще.
  2. Как определить количество нейронов в каждом среднем слое? Рекомендуется ли иметь одинаковое количество нейронов в каждом среднем слое или это зависит от применения?
Snaggletooth
источник

Ответы:

19

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

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

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

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

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

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

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

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

Для следующих данных:

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

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

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


Предположим, что вас попросили найти следующую обведенную границу решения.

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

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

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

СМИ
источник
11

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

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

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

Что делать, если моя сеть "слишком большая"

Если ваша сеть слишком большая, она может либо перегружаться, либо бороться за сближение. Интуитивно понятно, что ваша сеть пытается объяснить ваши данные более сложным способом, чем следовало бы. Это все равно что пытаться ответить на вопрос, на который можно ответить одним предложением с эссе на 10 страниц. Это может быть трудно структурировать такой длинный ответ, и может быть добавлено много ненужных фактов. ( См. Этот вопрос )

Что делать, если моя сеть "слишком мала"

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

Оценка размера сети

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

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

Идти глубже

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

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

Идти шире

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

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

Краткий ответ: это очень связано с размерами ваших данных и типом приложения.

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

Информационное узкое место - это палка о двух концах:

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

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

Полезные ссылки для примеров и больше находок:

[1] https: //livebook.manning.com#! / Book / deep-learning-with-python / chapter-3 / point-1130-232-232-0

[2] https://www.quantamagazine.org/new-theory-cracks-open-the-black-box-of-deep-learning-20170921/

MoH
источник
4

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

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

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

Федерико Качча
источник
1

В добавление к предыдущим ответам, существуют подходы, когда топология нейронной сети возникает эндогенно, как часть обучения. Наиболее заметно, что у вас есть Neuroevolution of Augmenting Topologies (NEAT), где вы начинаете с базовой сети без скрытых слоев, а затем используете генетический алгоритм для «усложнения» структуры сети. NEAT реализован во многих средах ML. Вот довольно доступная статья о реализации для изучения Mario: CrAIg: Использование нейронных сетей для изучения Mario

Фредерик Шнайдер
источник