Правильность нейронных сетей

Я задал другим людям этот вопрос, но мне действительно не дали ответа, который удовлетворил меня.

Для кого-либо, кто ранее запрограммировал искусственную нейронную сеть, как вы проверяете ее правильность?

Думаю, еще один способ сказать, как отлаживать код за нейронной сетью?

Ответы

Ответ 1

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

Это, конечно, дело только для нейронных сетей, достаточно больших, где прямое доказательство правильности невозможно. Можно доказать, что нейронная сеть является правильной с помощью анализа, если вы пытаетесь построить нейронную сеть, которая изучает XOR или что-то подобное, но для этого класса проблем редко требуется aNN.

Ответ 2

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

Возникает вопрос, почему вы хотели бы использовать нейронные сети, если не можете быть уверены, что вывод, который они приходят, является достоверно правильным; ответ заключается в том, что нейронные сети могут получить ответы с высоким доверием для определенных классов задач (в частности, NP-полные задачи) в линейном времени, тогда как достоверно правильные решения NP-полных задач могут быть получены только в полиномиальное время. В неспециалистских терминах нейронные сети могут "решать" проблемы, которые нормальные вычисления не могут; но вы можете быть уверены в том, что у вас есть правильный ответ. Вы можете определить эту уверенность в режиме обучения и обычно можете убедиться, что у вас будет уверенность в 99,9%.

Ответ 3

Здесь вы открываете большую червь червей, чем вы могли бы ожидать.

NN, пожалуй, лучше всего рассматривать как универсальные аппроксиматоры функций, кстати, что может помочь вам в размышлении об этом.

Во всяком случае, нет ничего особенного в NN по вашему вопросу, проблема применима к любому алгоритму обучения.

Уверенность в результатах, которые она дает, будет опираться на количество и качество (часто сложнее определить) данных обучения, которые у вас есть.

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

Реальная проблема заключается в том, что вас обычно не интересует "правильность" (cf quality) ответа на заданный вход, который вы уже видели, скорее вы заботитесь о прогнозировании качества ответа на вход вы еще не видели. Это гораздо более сложная проблема. Типичные подходы затем включают "сдерживание" некоторых ваших данных обучения (т.е. Материал, который вы знаете "правильный" ответ) и тестирование вашей обучаемой системы на это. Это становится тонким, хотя, когда вы начинаете считать, что у вас может не быть достаточного количества данных или оно может быть предвзятым и т.д. Таким образом, есть много исследователей, которые в основном тратят все свое время на размышления об этих проблемах!

Ответ 4

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

Одним из распространенных способов анализа результата любого классификатора является использование кривой ROC; введение в статистику классификаторов и кривых ROC можно найти на Интерпретация диагностических тестов

Ответ 5

Я полный любитель в этой области, но разве вы не используете заранее определенный набор данных, которые, как вы знаете, верны?

Ответ 6

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

Одним из методов, который я могу порекомендовать, является Jackknife.

Ответ 7

Мой учитель всегда говорил, что его эмпирическое правило состояло в том, чтобы обучить NN 80% ваших данных и проверить его с другими 20%. И, конечно же, убедитесь, что набор данных является настолько полным, насколько вам нужно.

Ответ 8

Если вы хотите узнать, верно ли обратное распространение сети, есть простой способ.

Поскольку вы вычисляете производное от ландшафта ошибки, вы можете проверить, правильна ли ваша реализация численно. Вычислите производную от ошибки относительно удельного веса ∂E/∂w. Вы можете показать, что

∂E/∂w = (E (w + e) ​​- E (w - e))/(2 * e) + O (e ^ 2).

(епископ, машинное обучение и распознавание образов, стр. 246)

По существу, вы оцениваете ошибку слева от веса, оцениваете ее справа от веса и chheck, если числовой градиент совпадает с вашим аналитическим градиентом.

(Здесь реализована реализация: http://github.com/bayerj/arac/raw/9f5b225d6293974f8adfc5f20dfc6439cc1bed35/src/cpp/utilities/utilities.cpp)

Ответ 9

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

Есть и другие проблемы, которые мешают вам получить лучший ответ, например:

  • Функция стоимости NN не является вогнутой, поэтому ваш градиентный спуск не гарантированно найдет глобальный оптимум.
  • Сверху/под монтаж
  • Не выбирать "правильные" функции/модель
  • и т.д.

Однако я думаю, что они выходят за рамки ошибок программирования.