Сколько скрытых слоев и скрытых узлов необходимо в нейронной сети?
В данной статье приводятся рекомендации по настройке скрытой части многослойного перцептрона.
До сих пор в этой серии статей, посвященной нейронным сетям, мы обсуждали нейросети перцептрон, многослойные нейросети и способы разработки таких нейросетей с использованием языка Python. Прежде чем мы перейдем к обсуждению того, сколько скрытых слоев и узлов вы можете выбрать для использования, ознакомьтесь с содержанием серии выше, в меню.
Резюмируем информацию скрытых слоях
Во-первых, давайте повторим некоторые важные моменты о скрытых узлах в нейронных сетях.
- Перцептроны, состоящие только из входных узлов и выходных узлов (называемые однослойными перцептронами), не очень полезны, потому что они не могут аппроксимировать сложные связи вход-выход, которые характеризуют многие типы реальных явлений. Более конкретно, однослойные перцептроны ограничены линейно разделимыми задачами. Как мы видели в седьмой статье («Продвинутое машинное обучение с многослойным перцептроном»), даже такая базовая функция, как логическая функция «исключающее ИЛИ» (XOR), не является линейно разделимой.
- Добавление скрытого слоя между входным и выходным слоями превращает перцептрон в универсальный аппроксиматор, что, по сути, означает, что он способен захватывать и воспроизводить чрезвычайно сложные связи вход-выход.
- Наличие скрытого слоя делает обучение немного более сложным, потому что весовые коэффициенты между входным и скрытым слоями косвенным образом влияют на конечную ошибку (этот термин я использую для обозначения разницы между выходным значением нейросети и целевым значением, заданным обучающими данными).
- Методика, которую мы используем для обучения многослойного перцептрона, называется обратным распространением: мы распространяем конечную ошибку обратно в сторону входа нейросети таким образом, который позволяет нам эффективно изменять веса, которые не подключены непосредственно к выходному узлу. Процедура обратного распространения является расширяемой, т.е. та же самая процедура позволяет нам обучать веса, связанные с произвольным числом скрытых слоев.
Следующая диаграмма обобщает базовую структуру многослойного перцептрона.
Сколько скрытых слоев?
Как и следовало ожидать, на этот вопрос нет простого ответа. Однако самое важное, что нужно понять, это то, что перцептрон с одним скрытым слоем – это крайне мощная вычислительная система. Если вы не получаете адекватных результатов с одним скрытым слоем, попробуйте сначала другие усовершенствования – может быть, вам нужно оптимизировать скорость обучения, увеличить количество эпох обучения или расширить набор обучающих данных. Добавление второго скрытого слоя увеличивает сложность кода и время обработки.
Следует также помнить, что перегруженная нейронная сеть – это не просто напрасная трата ресурсов процессора и усилий на написание кода – она может на самом деле принести «положительный вред», делая сеть более восприимчивой к переобучению (перетренированности).
Мы говорили о переобучении еще в четвертой статье («Понятие обучения простой нейронной сети»), в которой приводилась следующая диаграмма как способ визуализации работы нейронной сети, решение которой недостаточно обобщено.
Супермощный перцептрон может обрабатывать обучающие данные таким образом, который в некоторой степени аналогичен тому, как люди иногда могут «перемудрить» над чем-либо.
Когда мы уделяем слишком много внимания деталям и прикладываем чрезмерные интеллектуальные усилия к проблеме, которая на самом деле довольно проста, мы упускаем «общую картину» и в итоге получаем решение, которое окажется неоптимальным. Аналогичным образом, перцептрон с избыточной вычислительной мощностью и недостаточными обучающими данными может использовать слишком специфическое решение вместо поиска обобщенного решения (пример показан на следующем рисунке), которое будет более эффективно классифицировать новые входные выборки.
Итак, когда нам действительно нужно несколько скрытых слоев? Я не могу дать вам никаких рекомендаций из личного опыта. Лучшее, что я могу сделать, это передать опыт доктора Джеффа Хитона (смотрите страницу 158 текста по ссылке), который утверждает, что один скрытый слой позволяет нейронной сети аппроксимировать любую функцию, включающую «непрерывное преобразование из одного конечного пространства в другое».
С двумя скрытыми уровнями нейросеть может «представить произвольную границу решения с произвольной точностью».
Сколько скрытых узлов?
Поиск оптимальной размерности для скрытого слоя потребует проб и ошибок. Как обсуждалось выше, слишком большое количество узлов нежелательно, но их должно быть достаточно, чтобы нейросеть могла уловить сложности связей вход-выход.
Метод проб и ошибок – это хорошо, но вам понадобится обоснованная отправная точка. В той же книге, ссылка на которую приведена выше (на странице 159), доктор Хитон упоминает три практических правила для выбора размерности скрытого слоя. Я буду опираться на них, предлагая рекомендации, основанные на моей смутной интуиции в обработке сигналов.
- Если в нейросети только один выходной узел, и вы считаете, что требуемая связь вход-выход довольно проста, начните с размерности скрытого слоя, равной двум третям входной размерности.
- Если у вас есть несколько выходных узлов или вы считаете, что требуемая связь вход-выход является сложной, сделайте размерность скрытого слоя равной сумме входная размерность плюс выходная размерность (но при этом она должна оставаться меньше удвоенной входной размерности).
- Если вы считаете, что требуемая связь вход-выход является крайне сложной, установите размерность скрытого слоя равной на единицу меньше удвоенной входной размерности.
Заключение
Надеюсь, что эта статья помогла вам понять процесс конфигурирования и подстройки скрытого слоя многослойного перцептрона.
В следующей статье мы рассмотрим влияние размерности скрытого слоя, используя мою реализацию на Python и несколько примеров задач.