Отладка нейронных сетей

10

Я построил искусственную нейронную сеть в Python, используя функцию оптимизации scipy.optimize.minimize (Conjugate Gradient).

Я реализовал проверку градиента, дважды проверил все и т.д., и я уверен, что он работает правильно.

Я запускал его несколько раз, и он достигает «Оптимизация успешно завершена», однако, когда я увеличиваю количество скрытых слоев, стоимость гипотезы увеличивается (все остальное остается неизменным) после ее успешного завершения.

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

Мне было бы интересно понять, что здесь происходит, или я неправильно внедрил нейронную сеть?

user3726050
источник

Ответы:

9

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

  1. Вы добавили снижение веса. Добавление большего количества слоев увеличивает вес, что увеличивает ваши затраты на регуляризацию.
  2. Проблема достаточно проста, поэтому достаточно модели с одним скрытым слоем. Добавление большего количества скрытых слоев усложняет изучение сети (более сложная проблема оптимизации).
  3. Метод оптимизации не очень хорошо работает (я предпочитаю climin, а не scipy.optimize).
  4. Вы используете функцию активации сигмоида / танха. Сигмовидная функция вызывает исчезающую проблему градиента, которая затрудняет обучение с большим количеством слоев. Попробуйте использовать функцию ReLu.

Обучение нейронным сетям требует много практики, удачи и терпения. Удачи.

user1133029
источник
1
Хороший ответ. Поймите, что 2, 3, 4 могут взаимодействовать сложным образом. Отладку можно выполнить, проверив значения активации ANN, величину весов ANN, следя за ошибками в выборке и вне выборки и сходимостью оптимизатора и т. Д.
Def_Os
3

Увеличение количества скрытых слоев для стандартной нейронной сети фактически не улучшит результаты в большинстве случаев. Изменение размера скрытого слоя будет.

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

Хорошее вступительное видео на эту тему на YouTube

Эрик Чианг
источник
2
Глубокое обучение заключается в увеличении количества скрытых слоев. В противном случае это будет называться толстым обучением :)
Эмре
@ Emre определенно имел в виду это. Прокляни мою пунктуацию!
Эрик Чианг