Оценка количества нейронов и количества слоев искусственной нейронной сети

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

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

Ответ 1

Это очень трудная проблема.

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

Люди традиционно подходили к этой проблеме несколькими способами:

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

  • Используйте эмпирическое правило. Многие люди придумали много догадок о том, что лучше всего работает. Что касается количества нейронов в скрытом слое, люди предположили, что (например) он должен (а) находиться между размером входного и выходного уровней, (b) установить что-то рядом (входы + выходы) * 2/3 или (c) никогда не больше, чем вдвое больше размера входного слоя.

    Проблема с эмпирическими правилами заключается в том, что они не всегда учитывают важные фрагменты информации, как "трудный" проблема в том, каков размер комплектов обучения и тестирования и т.д. Следовательно, эти правила часто используются в качестве грубых отправных точек для "let's-try-a-bunch-of-things-and-see- что-работает-лучший".

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

Там много исследований по этой теме, поэтому, если вас действительно интересует, есть что прочитать. Ознакомьтесь с цитатами в этом резюме, в частности:

Ответ 2

На практике это не сложно (на основе кодированных и подготовленных десятков МЛП).

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

На практике, чтобы соответствовать или превышать точность прогнозирования из нейронной сети, требуемой вашей спецификацией, вам почти не нужно тратить много времени на сетевую архитектуру - три причины, почему это так:

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

  • несколько оставшихся параметров архитектуры, которые фактически настраиваются, почти всегда (100% времени в моем опыте), сильно ограниченные этими фиксированными архитектурами параметры - т.е. значения этих параметров плотно ограничены значением max и min; и

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

enter image description here

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

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

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

Число скрытых слоев

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

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

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

Число узлов, содержащих скрытый слой

но как насчет количества узлов, содержащих скрытый слой? Полученное значение более или менее не ограничено - то есть оно может быть меньше или больше размера входного слоя. Помимо этого, как вы, наверное, знаете, есть гора комментариев по вопросу о конфигурации скрытого слоя в NN (см. Знаменитый FAQ NN для отличное резюме этого комментария). Существует много эмпирически выработанных правил большого пальца, но из них наиболее часто полагается размер скрытого слоя между входными и выходными уровнями. Джефф Хитон, автор книги Введение в нейронные сети в Java "предлагает еще несколько, которые перечислены на странице, с которой я только что связан. Аналогично, сканирование прикладной литературы по нейронной сети почти наверняка покажет, что размер скрытого слоя обычно находится между размерами входного и выходного уровней. Но между ними не означает посередине; на самом деле, как правило, лучше установить размер скрытого слоя ближе к размеру входного вектора. Причина в том, что если скрытый слой слишком мал, сеть может с трудом сходиться. Для начальной конфигурации err в более крупном размере - более крупный скрытый слой дает сети больше емкости, которая помогает сходиться по сравнению с меньшим скрытым слоем. Действительно, это оправдание часто используется для того, чтобы рекомендовать скрытый размер слоя, превышающий (больше узлов) входной уровень, то есть начать с начальной архитектуры, которая будет способствовать быстрой конвергенции, после чего вы можете обрезать" лишние" узлы (идентифицировать узлы в скрытом слое с очень низкими значениями веса и исключить их из вашей сети с рефакторингом).

Ответ 3

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