Если у нас есть 10 собственных векторов, то мы можем иметь 10 нейронных узлов во входном слое. Если у нас есть 5 выходных классов, то у нас может быть 5 узлов в выходном слое. Но каковы критерии выбора количества скрытого слоя в MLP и сколько нейронных узлов в 1 скрытом слое?
Многослойная архитектура персептрона (MLP): критерии выбора количества скрытых слоев и размер скрытого слоя?
Ответ 1
сколько скрытых слоев?
модель с нулевыми скрытыми слоями будет разрешать линейно разделяемые данные. Поэтому, если вы уже не знаете, что ваши данные не являются линейно разделяемыми, это не мешает проверить это - зачем использовать более сложную модель, чем требует задача? Если он линейно разделен, тогда будет работать более простой метод, но Perceptron также выполнит эту работу.
Предполагая, что ваши данные требуют разделения по нелинейной методике, тогда всегда начинается с одного скрытого слоя. Почти наверняка все, что вам нужно. Если ваши данные разделяются с помощью MLP, то MLP, вероятно, нужен только один скрытый слой. Для этого есть теоретическое обоснование, но моя причина чисто эмпирическая: многие сложные проблемы классификации/регрессии решаются с использованием MLP с одним скрытым слоем, но я не помню, чтобы сталкивались с MLP с несколькими скрытыми слоями, которые использовались для успешного моделирования данных, - на досках объявлений ML, книгах ML, научных статьях и т.д. Они существуют, конечно, но обстоятельства, которые оправдывают их использование, эмпирически довольно редки.
Сколько узлов в скрытом слое?
Из академической литературы MLP. мой собственный опыт и т.д., я собрал и часто полагаюсь на несколько эмпирических правил (RoT), и которые я также нашел надежными проводниками (т.е. руководство было точным, и даже когда оно не было, обычно было понятно, что делать дальше):
RoT, основанный на улучшении конвергенции:
Когда вы начинаете построение модели, ошибаетесь на стороне узлов большев скрытом слое.
Почему? Во-первых, несколько дополнительных узлов в скрытом слое вряд ли нанесут какой-либо вред - ваш MLP все равно сходится. С другой стороны, слишком мало узлов в скрытом слое могут предотвратить конвергенцию. Подумайте об этом таким образом, дополнительные узлы обеспечивают некоторую избыточную мощность - дополнительные веса для хранения/отпускания сигнала в сети во время итерации (обучение или построение модели). Во-вторых, если вы начинаете с дополнительных узлов в своем скрытом слое, тогда их легко обрезать позже (во время выполнения итерации). Это обычное явление, и вам помогут диагностические методы (например, диаграмма Хинтона, которая представляет собой просто визуальное изображение весовых матриц, "тепловую карту" весовых значений).
RoTs в зависимости от размера входного слоя и размера выходного слоя:
Правило большого пальца - это размер этого [скрытого] слоя, где-то между размером входного слоя... и размером выходного слоя....
Чтобы вычислить количество скрытых узлов, мы используем общее правило: (Количество входов + выходов) x 2/3
RoT на основе основных компонентов:
Как правило, мы указываем столько скрытых узлов, сколько размеров [основной компоненты], необходимые для захвата 70-90% дисперсии входных данных набор.
И тем не менее NN FAQ автор называет эти Правила "бессмыслицей" (буквально), потому что они: игнорируют количество учебных экземпляров, шум в целевые значения (значения переменных ответа) и сложность пространства функций.
По его мнению (и мне всегда казалось, что он знает, о чем он говорит), выберите количество нейронов в скрытом слое, исходя из того, включает ли ваш MLP какую-то форму регуляризации или раннюю остановку.
Единственный допустимый метод оптимизации числа нейронов в скрытом слое:
Во время вашего построения модели проверяйте навязчиво; тестирование выявит подписи "неправильной" сетевой архитектуры. Например, если вы начинаете с MLP со скрытым слоем, состоящим из небольшого количества узлов (которые вы будете постепенно увеличивать по мере необходимости, исходя из результатов теста), ваша ошибка обучения и обобщения будет высокой, вызванной смещением и недоукомплектованием.
Затем увеличьте количество узлов в скрытом слое, по одному за раз, пока ошибка обобщения не начнет увеличиваться, на этот раз из-за переопределения и высокой дисперсии.
На практике я делаю это следующим образом:
уровень ввода: размер моего данных vactor (количество функций в моей модели) + 1 для смещения node и не включая переменную ответа, конечно
уровень вывода: soley определяется моей моделью: регрессия (одна node) по сравнению с классификацией (количество узлов, эквивалентное количеству классов, при условии softmax)
скрытый слой: для запуска один скрытый слой с числом узлов, равным размеру входного слоя. "Идеальный" размер скорее всего будет меньше (т.е. Некоторое количество узлов между числом во входном слое и числом в выходном слое), а не больше - опять же, это просто эмпирическое наблюдение, а основная масса этого наблюдения - мой собственный опыт. Если проект оправдывает дополнительное время, то я начинаю с одного скрытого слоя, состоящего из небольшого числа узлов, а затем (как я объяснил чуть выше) добавляю узлы к скрытому слою, по одному за раз, вычисляя обобщение ошибки, ошибки обучения, смещения и дисперсии. Когда ошибка обобщения опустилась и как раз перед тем, как она снова начнет увеличиваться, количество узлов в этой точке является моим выбором. См. Рисунок ниже.
Ответ 2
Очень сложно выбрать количество нейронов в скрытом слое и выбрать количество скрытых слоев в вашей нейронной сети.
Обычно для большинства приложений достаточно одного скрытого слоя. Кроме того, количество нейронов в этом скрытом слое должно быть между количеством входов (10 в вашем примере) и количеством выходов (5 в вашем примере).
Но лучший способ выбрать количество нейронов и скрытых слоев - эксперимент. Обучите несколько нейронных сетей разным количеством скрытых слоев и скрытых нейронов, и измерьте производительность этих сетей, используя cross-validation. Вы можете придерживаться номера, который дает лучшую сеть.
Ответ 3
Чтобы автоматизировать выбор наилучшего количества слоев и лучшее количество нейронов для каждого из слоев, вы можете использовать генетическая оптимизация.
Ключами будут:
- Хромосома: вектор, который определяет, сколько единиц в каждом скрытом слое (например, [20,5,1,0,0] означает 20 единиц в первом скрытом слое, 5 на втором,..., с отсутствием слоев 4 и 5). Вы можете установить ограничение на максимальное число уровней для попыток и максимальное количество единиц в каждом слое. Вы также должны устанавливать ограничения на то, как генерируются хромосомы. Например. [10, 0, 3,...] не должны генерироваться, потому что любые единицы после пропущенного слоя ( "3,..." ) не имеют значения и будут отвлекать циклы оценки.
- Функция фитнеса: функция, возвращающая обратную самую низкую ошибку обучения в наборе кросс-валидации сети, определенной данной хромосомой. Вы также можете указать количество общих единиц или время вычисления, если вы хотите найти "самую маленькую/самую быструю, но наиболее точную сеть".
Вы также можете рассмотреть:
- Обрезка. Начните с большой сети, затем уменьшите уровни и скрытые блоки, сохранив при этом производительность перекрестной проверки.
- Growing. Начните с очень маленькой сети, затем добавьте единицы и слои и снова отслеживайте производительность набора CV.