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

50

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

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

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

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

С другой стороны, когда я пытаюсь использовать Random Forest (из scikit-learn), я легко получаю 12% ошибок в наборе проверки и 25% (!) В наборе тестов.

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

Ицхака
источник

Ответы:

34

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

Также я нашел следующие документы очень полезными:

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

ffriend
источник
14

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

Выпрямленные линейные активации

Первое, что может помочь в вашем случае, это переключить функцию активации вашей модели с логистической сигмоиды - - на выпрямленный линейный (aka relu) - .f(z)=(1+ez)1f(z)=max(0,z)

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

  • его вывод - истинный ноль (не просто небольшое значение, близкое к нулю) для иz0
  • его производная постоянна: 0 для или 1 для .z0z>0

Сеть модулей relu в основном действует как ансамбль экспоненциально многих линейных сетей, потому что модули, которые получают вход , по существу "выключены" (их выход равен 0), в то время как модули, которые получают вход сворачиваются в одну линейную модель для этого входа. Кроме того, постоянные производные важны, потому что глубокая сеть с активациями relu имеет тенденцию избегать проблемы исчезающего градиента и может быть обучена без послойной предварительной подготовки.z0z>0

См. «Глубокие разреженные выпрямительные нейронные сети» от Glorot, Bordes & Bengio ( http://jmlr.csail.mit.edu/proceedings/papers/v15/glorot11a/glorot11a.pdf ), где можно найти хорошую статью по этим темам.

Выбывать

Многие исследовательские группы в последние несколько лет выступали за использование «отсева» в сетях классификаторов, чтобы избежать перетренированности. (См., Например, «Выпадение: простой способ предотвратить переоснащение нейронных сетей» Сриваставы, Хинтона, Крижевского, Суцкевера и Салахутдинова http://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf ). в процессе обучения, некоторые постоянные пропорции единиц в данном слое случайным образом устанавливаются в 0 для каждого входа, который обрабатывает сеть. Это заставляет единицы, которые не установлены в 0, «восполнить» «пропущенные» единицы. Отсев, похоже, является чрезвычайно эффективным регуляризатором для моделей нейронных сетей в задачах классификации. Смотрите статью в блоге об этом на http: // fastml.

lmjohns3
источник
7
Но вопрос в том, чтобы не подбирать, а не подбирать.
Валентина
8

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

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

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

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

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

Мартин Тома
источник
Спасибо за ваши ответы, вы принимаете решение об исчезающей проблеме градиента, если в случае, если проверка достоверности выше, чем обучение, то что делать? Это может произойти для небольшого числа данных в наборе значений, но иногда это не зависит от набора значений. Я спрашиваю, есть ли какая-либо другая причина, по которой val acc выше, чем обучение acc ??
Судип Дас