Нейронная сеть обратного распространения? - PullRequest
2 голосов
/ 15 января 2010

Может кто-нибудь порекомендовать сайт или дать мне краткую информацию о том, как обратное распространение реализовано в NN? Я понимаю основную концепцию, но я не уверен, как писать код.

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

Пример:

void bpnn_output_error(delta, target, output, nj, err)
double *delta, *target, *output, *err;
int nj;
{
  int j;
  double o, t, errsum;

  errsum = 0.0;
  for (j = 1; j <= nj; j++) {
    o = output[j];
    t = target[j];
    delta[j] = o * (1.0 - o) * (t - o);
    errsum += ABS(delta[j]);
  }
  *err = errsum;

}

В этом примере кто-то может объяснить цель

delta[j] = o * (1.0 - o) * (t - o);

Спасибо.

Ответы [ 4 ]

9 голосов
/ 04 декабря 2012

Цель

дельта [j] = o * (1,0 - o) * (t - o);

- найти ошибку выходного узла в сети обратного распространения.

o представляет выходные данные узла, t - ожидаемое значение выходных данных для узла.

Термин (o * (1.0 - o), является производной от общей используемой передаточной функции, сигмоидальной функции. (Другие передаточные функции не являются редкостью и требуют переписывания кода, в котором сигмоид находится первым вместо этого производная. Несоответствие между функцией и производной, скорее всего, будет означать, что обучение не будет сходиться.) Узел имеет значение «активации», которое подается через передаточную функцию для получения выходного сигнала o, например

o = f (активация)

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

Так что более символично, мы бы написали эту строку как

delta [j] = f '(активации_j) * (t_j - o_j)

где f - ваша передаточная функция, а f '- ее первая производная.

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

дельта [j] = f '(активации_j) * сумма (дельта [k] * w_jk)

где j теперь ссылается на скрытый узел, а k - на узел в последующем слое.

2 голосов
/ 15 января 2010

(t-o) - это ошибка на выходе сети, поскольку t является целевым выходом, а o является фактическим выходом. Он сохраняется в нормализованной форме в массиве delta. Метод, используемый для нормализации, зависит от реализации, и o * ( 1.0 - o ), кажется, делает это (я могу ошибаться в этом предположении).

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

1 голос
/ 15 января 2010

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

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

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

0 голосов
/ 15 января 2010

По сути, backprop выполняет сеть на обучающих данных, наблюдает за выводом, затем корректирует значения узлов, итеративно переходя от выходных узлов к входным узлам.

...