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

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

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

75
задан Peter O. 1 October 2019 в 07:30
поделиться

2 ответа

Это действительно сложная проблема.

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

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

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

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

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

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

По этой теме ведется много исследований - так что, если вам действительно интересно, есть что почитать. Ознакомьтесь с цитатами в этом обзоре , в частности:

103
ответ дан 24 November 2019 в 11:36
поделиться

На практике это несложно (основываясь на кодировании и обучении десятков MLP).

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

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

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

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

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

enter image description here

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

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

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

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

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

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

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

Количество узлов, составляющих скрытый слой

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

44
ответ дан 24 November 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: