2009-05-07 4 views
14

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

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

Я предполагаю, что это еще один способ, как отлаживать код за нейронной сетью?

ответ

8

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

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

+1

Правда; вопрос о доказательстве «правильности» очень быстро усложняется при работе с нетривиальными нейронными сетями до такой степени, что он не может быть использован для любых сетей со значительным размером. –

1

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

+0

Да, для обучения ... хотя «правильный» для входных данных на самом деле не является правильным. Более конкретно, вы используете набор входных данных, для которых вы ожидаете получить определенный результат, и вы тренируете сеть для обеспечения этого результата. –

+0

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

12

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

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

+0

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

+0

Я не предполагал, что вы спрашиваете теорию; просто пытался ответить на ваш вопрос по заданию. –

2

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

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

+0

Очень хорошая точка; вы всегда хотите иметь набор известных, новых данных для представления «проверки» сети. На самом деле это не «проверяет» его так сильно, как «подтверждает» его. –

3

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

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

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

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

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

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

1

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

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

0

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

0

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

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

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

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

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

(Вот реализация: http://github.com/bayerj/arac/raw/9f5b225d6293974f8adfc5f20dfc6439cc1bed35/src/cpp/utilities/utilities.cpp)

0

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

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

  • Функция стоимости NN не вогнута, чтобы ваш градиентный спуск не гарантируется найти глобальный оптимум.
  • Над/под фитинг
  • Не выбирать «правильные» функции/модель
  • и т.д.

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

Смежные вопросы