Как сражаться с недостаточной додивной в глубокой нейронной сети

datascience.stackexchange https://datascience.stackexchange.com/questions/731

  •  16-10-2019
  •  | 
  •  

Вопрос

Когда я начал с искусственных нейронных сетей (NN), я подумал, что мне придется бороться с переосмыслением в качестве основной проблемы. Но на практике я даже не могу заставить свой NN пройти 20% барьер частоты ошибок. Я даже не могу победить свой счет на случайном лесу!

Я ищу какой -то очень общий или не так общий совет о том, что следует сделать, чтобы сделать NN начать снимать тенденции в данных.

Для реализации NN я использую Auto Encoder TheAno с Код из учебника Это отлично работает (менее 5% частота ошибок) для классификации набора данных MNIST. Это многослойный персептрон, с слоем SoftMax сверху, каждый из которых был впоследствии, который впоследствии был предварительно обучен в качестве автоэнкодера (полностью описано в руководство, глава 8). Есть ~ 50 входных функций и ~ 10 выходных классов. NN имеет сигмоидные нейроны, и все данные нормализованы до [0,1]. Я пробовал много различных конфигураций: количество скрытых слоев и нейронов (100-> 100-> 100, 60-> 60-> 60, 60-> 30-> 15 и т. Д.), Различное обучение и предварительный тренировки ставки и т. д.

И самое лучшее, что я могу получить, - это 20% -ная частота ошибок в наборе проверки и 40% частота ошибок в тестовом наборе.

С другой стороны, когда я пытаюсь использовать случайный лес (от Scikit-Learn), я легко получаю 12% -ную частоту ошибок в наборе валидации и 25% (!) На тестовом наборе.

Как может быть, что мой глубокий NN с предварительным обучением так плохо себя ведет? Что мне попробовать?

Это было полезно?

Решение

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

Также я обнаружил, что после статей очень полезны:

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

Другие советы

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

Исправленные линейные активации

Первое, что может помочь в вашем случае, это переключить функцию активации вашей модели с логистический сигмоидальный -$ f (z) = left (1 + e^{-z} right)^{-1} $-к Исправленная линейная (он же Relu) - $ f (z) = max (0, z) $.

Активация Relu имеет два больших преимущества:

  • Его вывод - это истинное ноль (не просто небольшое значение, близкое к нулю) для $ z le 0 $ и
  • Его производная постоянна, либо 0 для $ z le 0 $, либо 1 для $ z> 0 $.

Сеть единиц Relu в основном действует как ансамбль экспоненциально многих линейных сетей, поскольку единицы, которые получают входные данные $ z le 0 $, по сути, «выключены» (их выход равен 0), в то время как единицы, которые получают вход $ z> 0 $ Couplapse в единую линейную модель для этого входа. Кроме того, постоянные производные важны, потому что глубокая сеть с активациями Rel Проблема градиента исчезает и может быть обучен без слоя предварительной подготовки.

См. «Глоро, Глоро, Бордес и Бенгио (Глоро, Бордес и Бенгиоhttp://jmlr.csail.mit.edu/proceedings/papers/v15/glorot11a/glorot11a.pdf) для хорошей бумаги по этим темам.

Выбывать

Многие исследовательские группы за последние несколько лет выступали за использование «отсечения» в сети классификатора, чтобы избежать перегрузки. (См., Например, «Отбрасывание: простой способ предотвратить переживание нейронных сетей» Шриваставы, Хинтона, Крижевского, Сатскевера и Салахутдинов http://www.cs.toronto.edu/~hinton/absps/jmlrdropout.pdf) При отсевом, во время обучения некоторая постоянная доля единиц в данном слое случайным образом устанавливается на 0 для каждого входа, который обрабатывает сеть. Это заставляет подразделения, которые не установлены на 0, «составить» для «пропавших» подразделений. Отступник, по -видимому, является чрезвычайно эффективным регулятором для моделей нейронной сети в задачах классификации. Смотрите статью в блоге об этом на http://fastml.com/regularizing-neural-networks-with-proat-and-with-propconnect/.

Возможно, вы заинтересованы в прочтении следующей статьи исследователями Microsoft Research:

Kaiming HE, Xiangyu Zhang, Shaoqing Ren, Jian Sun: Глубокое остаточное обучение для распознавания изображений на Arxiv, 2015.

У них были подобные проблемы, как и у вас:

Когда более глубокие сети способны начать сходиться, проблема деградации была выявлена: с увеличением глубины сети точность насыщается (что может быть неудивительно), а затем быстро растет. Неожиданно, что такое деградация не вызвана переосмыслением, и добавление большего количества слоев к соответствующим образом глубокому модели приводит к более высокой ошибке обучения, как сообщается в [11, 42] и тщательно подтверждено нашими экспериментами.

Чтобы решить проблему, они использовали архитектуру пропуска. При этом они тренировали очень глубокие сети (1202 слоев) и достигли наилучшего результата в вызове ILSVRC 2015.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с datascience.stackexchange
scroll top