Как выбрать количество скрытых слоев и узлов в нейронной сети с прямой связью?

542

Существует ли стандартный и общепринятый метод выбора количества слоев и количества узлов в каждом слое в нейронной сети с прямой связью? Я заинтересован в автоматизированных способах построения нейронных сетей.

Роб Хиндман
источник
4
Среди всех замечательных ответов я нашел этот документ полезным dstath.users.uth.gr/papers/IJRS2009_Stathakis.pdf
Печать
@DebpriyaSeal не что полезно , хотя ...
DarkCygnus

Ответы:

469

Я понимаю, что на этот вопрос дан ответ, но я не думаю, что существующий ответ действительно затрагивает вопрос, помимо указания ссылки, обычно связанной с предметом вопроса. В частности, ссылка описывает один метод для программной конфигурации сети, но это не « стандартный и принятый метод » для конфигурации сети.

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

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

Таким образом, каждый NN имеет три типа слоев: входной , скрытый и выходной .


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

Входной слой

Просто - у каждого NN есть ровно один из них - никаких исключений, о которых я знаю.

Что касается количества нейронов, составляющих этот слой, этот параметр полностью и однозначно определяется, как только вы узнаете форму ваших тренировочных данных. В частности, количество нейронов, составляющих этот слой, равно количеству объектов (столбцов) в ваших данных . Некоторые конфигурации NN добавляют один дополнительный узел для термина смещения.


Выходной слой

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

Работает ли ваш NN в машинном режиме или в режиме регрессии (соглашение ML об использовании термина, который также используется в статистике, но присвоение ему другого значения, очень сбивает с толку). Режим машины: возвращает метку класса (например, «Премиум-аккаунт» / «Базовая учетная запись»). Режим регрессии возвращает значение (например, цена).

Если NN является регрессором, то выходной слой имеет один узел.

Если NN является классификатором, то он также имеет один узел, если не используется softmax, и в этом случае выходной слой имеет один узел на метку класса в вашей модели.

Скрытые слои

Таким образом, эти несколько правил устанавливают количество слоев и размер (нейроны / слой) для входного и выходного слоев. Это оставляет скрытые слои.

Сколько скрытых слоев? Хорошо, если ваши данные линейно разделимы (что вы часто знаете, когда начинаете кодировать NN), тогда вам вообще не нужны никакие скрытые слои. Конечно, вам также не нужен NN для разрешения ваших данных, но он все равно сделает свою работу.

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

Так как насчет размера скрытого слоя (слоев) - сколько нейронов? Существуют эмпирически полученные эмпирические правила, из которых наиболее часто полагаются на то, что « оптимальный размер скрытого слоя обычно находится между размером входных данных и размером выходных слоев ». Джефф Хитон, автор книги « Введение в нейронные сети на Java», предлагает еще несколько.

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


Оптимизация конфигурации сети

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

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

Дуг
источник
31
Вы утверждаете, что для большинства задач нужен только один скрытый слой. Возможно, лучше сказать, что NN с более скрытыми слоями чрезвычайно трудно обучить (если вы хотите узнать, как это сделать, проверьте публикации группы Хинтона в Уоф-Торонто, «глубокое обучение») и, следовательно, те проблемы, которые требуют больше, чем скрытые слой считается "неразрешимым" нейронными сетями.
Bayerj
13
Вы пишете, если NN является регрессором, то выходной слой имеет один узел. , Почему только один узел? Почему я не могу иметь несколько непрерывных выходов?
gerrit
5
@gerrit Вы можете определенно иметь несколько непрерывных выходов, если ваш целевой выход имеет векторное значение. Однако определение подходящей функции потерь для выходных данных с вектором может быть немного сложнее, чем с одним выходом.
lmjohns3
5
Я думал, что это было наоборот: если NN является классификатором, то он также имеет один узел, если не используется softmax, и в этом случае выходной слой имеет один узел на метку класса в вашей модели.
Вийпс
2
@doug Спасибо за этот замечательный ответ. Это позволило мне уменьшить свой ANN с 3 скрытых слоев до 1 и достичь той же точности классификации, задав правильное количество скрытых нейронов ... Я просто использовал среднее значение входных и выходных данных, суммированных вместе. Спасибо!
Rayryeng
130

Ответ @ Дуга сработал для меня. Есть еще одно практическое правило, которое помогает при контролируемых проблемах в обучении. Обычно вы можете предотвратить перенапряжение, если будете держать количество нейронов ниже:

Nh=Ns(α(Ni+No))

Ni = количество входных нейронов. = количество выходных нейронов. = количество выборок в наборе обучающих данных. = произвольный масштабный коэффициент, обычно 2-10.
No
Ns
α

Другие рекомендуют устанавливать на значение от 5 до 10, но я считаю, что значение 2 будет часто работать без переобучения. Вы можете рассматривать альфа как эффективный фактор ветвления или число ненулевых весов для каждого нейрона. Выпадающие слои принесут «эффективный» коэффициент ветвления намного ниже фактического среднего коэффициента ветвления для вашей сети.alpha

Как объясняется в этом превосходном тексте NN Design , вы хотите ограничить количество свободных параметров в вашей модели (его степень или количество ненулевых весов) небольшой частью степеней свободы в ваших данных. Степени свободы в ваших данных - это число выборок * степеней свободы (измерений) в каждой выборке или (при условии, что они все независимы). Таким образом, - это способ указать, насколько общей должна быть ваша модель, или насколько вы хотите предотвратить переоснащение.Ns(Ni+No)α

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

варочные панели
источник
7
Эта формула очень интересная и полезная. Есть ли какая-либо ссылка на эту формулу? Это было бы более полезно.
Прашант
2
@prashanth Я объединил несколько утверждений и формул в тексте NN Design, указанном выше. Но я не думаю, что это явно вызвано в форме, которую я показываю. И моя версия - очень грубое приближение с множеством упрощающих предположений. Итак, YMMV.
варочные панели
1
Сначала я хотел написать тренировочный набор вместо тестового набора в предыдущем комментарии. Может быть, эта формула имеет смысл, если мы будем читать ее как «вам нужно как минимум столько нейронов, чтобы выучить достаточное количество функций (упомянутый вами DOF) из набора данных». Если характеристики набора данных являются репрезентативными для населения и насколько хорошо модель может обобщать, возможно, это другой вопрос (но важный).
Кон Психи
3
Вы уверены, что это хорошая оценка для сетей с несколькими скрытыми слоями? Разве это не так, чем для нескольких скрытых слоев число параметров намного больше, чем ? Nh(Ni+No)
Матеуш
2
@mateus, возможно, несколько лучшее эмпирическое правило для нескольких слоев - это решение N_h(среднее количество скрытых нейронов на слой) N_s = (N_i + N_o) * N_h ^ N_hidden_layers. Но я все еще не использовал бы эту формулу. Это только для очень простых проблем (игрушечных проблем), когда вы не планируете реализовывать какие-либо другие подходы к регуляризации.
варочные
61

От Введение в нейронные сети для Java (второе издание) по Джефф Хитон - предварительный просмотр в свободном доступе на Google Books и ранее на сайте автора :

Количество скрытых слоев

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

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

Таблица 5.1: Определение количества скрытых слоев

| Количество скрытых слоев | Результат |

 0 - Способен только представлять линейные отделимые функции или решения.

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

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

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

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

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

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

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

Существует много практических методов определения правильного количества нейронов для использования в скрытых слоях, таких как следующие:

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

Эти три правила обеспечивают отправную точку для рассмотрения. В конечном счете, выбор архитектуры для вашей нейронной сети сводится к методу проб и ошибок. Но что именно подразумевается под методом проб и ошибок? Вы не хотите начинать выбрасывать случайные числа слоев и нейронов в вашей сети. Для этого было бы очень много времени. В главе 8 «Сокращение нейронной сети» будут рассмотрены различные способы определения оптимальной структуры нейронной сети.


Мне также нравится следующий фрагмент из ответа, который я нашел на researchgate.net , который очень много говорит в нескольких словах:

Штеффен Б. Петерсен · Ольборгский университет

[...]

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

jj_
источник
Вы случайно не знаете источник цитаты Штеффена Б. Петерсена?
Себастьян Нильсен
Мне жаль, что нет. Я пытался найти его, но не смог найти ... Я думаю, что статья была удалена из Интернета. Может быть, вы можете связаться с ним напрямую?
JJ_
Не следует ли учитывать размер тренировочного набора? У меня есть табличный набор данных с ~ 300 000 уникальных образцов (цены на автомобили). Входной слой имеет 89 узлов. Обучая сеть без регуляризации и только 89 узлов в одном скрытом слое, я получаю потери обучения на плато после нескольких эпох. RMSE плато на ~ 1800 долларов (один выходной узел - цена в этой задаче регрессии).
Родриго-Силвейра
Я думаю, что источник цитаты Штеффена Б. Петерсена был здесь: researchgate.net/post/…
TripleAntigen
43

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

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

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

Если бы я строил автоматизированный построитель нейронных сетей, я бы использовал байесовский подход Рэдфорда Нила на основе гибридной методики Монте-Карло (HMC) и использовал бы большую сеть и интегрировал бы по весам, а не оптимизировал вес одной сети. Однако это вычислительно дорого и немного «черное искусство», но результаты, достигнутые профессором Нилом, говорят о том, что оно того стоит!

Дикран Сумчатый
источник
«Я сейчас работаю над эмпирическим изучением этого вопроса» - есть ли какие-нибудь обновления?
Мартин Тома
2
нет, не бери в голову, я бы по-прежнему рекомендовал большую (ish) сеть и регуляризацию, но серебряной пули нет, некоторые проблемы не требуют регуляризации, но некоторые наборы данных нуждаются в настройке скрытого размера слоя, а также регуляризации. К сожалению, рецензентам не понравилась статья :-(
Дикран Marsupial
17

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

Есть несколько подходов, более или менее современный, который, казалось, дал хорошие результаты, был NEAT (Neuro Evolution of Augmented Topologies) .

Висенте Картас
источник
6

Автоматизированные способы построения нейронных сетей с использованием глобального поиска гиперпараметров:

Входной и выходной слои имеют фиксированный размер.

Что может варьироваться:

  • количество слоев
  • количество нейронов в каждом слое
  • тип слоя

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

  • 1) Сетка / случайный поиск в пространстве параметров, чтобы начать с немного лучшей позиции
  • 2) Множество методов, которые можно использовать для поиска оптимальной архитектуры. (Да, это занимает время).
  • 3) Сделайте некоторую регуляризацию, промойте, повторите.
сюрикен х синий
источник
6

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

AdaNet: адаптивное структурное обучение искусственных нейронных сетей

Коринна Кортес, Ксавье Гонсалво, Виталий Кузнецов, Мехьяр Мохри, Скотт Ян; Труды 34-й Международной конференции по машинному обучению, PMLR 70: 874-883, 2017.

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

chainD
источник
3

Я хотел бы предложить менее распространенный, но супер эффективный метод .

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

Для ~ 100 или менее параметров (таких как выбор количества слоев, типов слоев и количества нейронов на слой) этот метод является суперэффективным. Используйте его, создавая несколько потенциальных сетевых архитектур для каждого поколения и обучая их частично до тех пор, пока не будет оценена кривая обучения (100-10 тыс. Мини-пакетов обычно зависят от многих параметров). Через несколько поколений вы, возможно, захотите рассмотреть точку, в которой поезд и валидация начинают существенно отличаться по частоте ошибок (переоснащению), в качестве вашей целевой функции при выборе детей. Это может быть хорошая идея использовать очень маленькое подмножество ваших данных (10-20%), пока вы не выберете окончательную модель, чтобы быстрее прийти к выводу. Кроме того, используйте единственное начальное число для инициализации вашей сети, чтобы правильно сравнить результаты.

10-50 поколений должны дать отличные результаты для приличной сети.

Дэн Эрез
источник
Другой очень интересный способ - байесовская оптимизация, которая также является чрезвычайно эффективным методом оптимизации черного ящика для относительно небольшого числа параметров. arxiv.org/pdf/1206.2944.pdf
Дэн Эрез
2

Количество скрытых слоев и что они могут достичь:

0 - Способен только представлять линейные отделимые функции или решения.

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

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

Более 2 - Дополнительные слои могут изучать сложные представления (своего рода автоматическое проектирование объектов) для слоев слоев.

sapy
источник
8
Источник (и), пожалуйста. - Рецензент
Джим