Очень хороший вопрос, поскольку точного ответа на этот вопрос пока нет. Это активная область исследований.
В конечном счете, архитектура вашей сети связана с размерностью ваших данных. Поскольку нейронные сети являются универсальными приближениями, пока ваша сеть достаточно велика, она может соответствовать вашим данным.
Единственный способ по-настоящему узнать, какая архитектура работает лучше всего, - это попробовать их все, а затем выбрать лучший. Но, конечно, с нейронными сетями это довольно сложно, так как каждая модель занимает довольно много времени для обучения. Некоторые люди сначала специально обучают модель, которая «слишком велика», а затем сокращают ее, удаляя веса, которые не вносят большой вклад в сеть.
Что делать, если моя сеть "слишком большая"
Если ваша сеть слишком большая, она может либо перегружаться, либо бороться за сближение. Интуитивно понятно, что ваша сеть пытается объяснить ваши данные более сложным способом, чем следовало бы. Это все равно что пытаться ответить на вопрос, на который можно ответить одним предложением с эссе на 10 страниц. Это может быть трудно структурировать такой длинный ответ, и может быть добавлено много ненужных фактов. ( См. Этот вопрос )
Что делать, если моя сеть "слишком мала"
С другой стороны, если ваша сеть слишком мала, это будет соответствовать вашим данным и, следовательно,. Это все равно, что ответить одним предложением, когда вы должны были написать 10-страничное эссе. Каким бы хорошим ни был ваш ответ, вам не хватит некоторых соответствующих фактов.
Оценка размера сети
Если вы знаете размерность ваших данных, вы можете определить, достаточно ли велика ваша сеть. Чтобы оценить размерность ваших данных, вы можете попробовать вычислить их ранг. Это основная идея того, как люди пытаются оценить размер сетей.
Однако это не так просто. Действительно, если ваша сеть должна быть 64-мерной, вы создаете один скрытый слой размером 64 или два слоя размером 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/
источник
Работая с нейронными сетями с двухлетней давности, эта проблема всегда возникает у меня каждый раз, когда я не хочу моделировать новую систему. Лучший подход, который я нашел, заключается в следующем:
Общий подход - попробовать разные архитектуры, сравнить результаты и выбрать лучшую конфигурацию. Опыт дает вам больше интуиции в первом архитектурном предположении.
источник
В добавление к предыдущим ответам, существуют подходы, когда топология нейронной сети возникает эндогенно, как часть обучения. Наиболее заметно, что у вас есть Neuroevolution of Augmenting Topologies (NEAT), где вы начинаете с базовой сети без скрытых слоев, а затем используете генетический алгоритм для «усложнения» структуры сети. NEAT реализован во многих средах ML. Вот довольно доступная статья о реализации для изучения Mario: CrAIg: Использование нейронных сетей для изучения Mario
источник