Вопрос о алгоритме Backpropagation с искусственными нейронными сетями - Порядок обновления

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

Здесь представлен супер общий формат алгоритма:

  • Введите ввод
  • Получить вывод
  • Вычислить ошибку
  • Рассчитать изменение весов
  • Повторяйте шаги 3 и 4, пока мы не достигнем уровня ввода

Но вот проблема: весы должны быть обновлены в какой-то момент, очевидно. Однако, поскольку мы снова распространяем, мы должны использовать весы предыдущих слоев (которые ближе к уровню вывода, я имею в виду) при вычислении ошибки для слоев, расположенных ближе к входному слою. Но мы уже рассчитали изменения веса для слоев ближе к выходному слою! Итак, когда мы используем эти веса для вычисления ошибки для слоев ближе к входу, используем ли мы их старые значения или их "обновленные значения"?

Другими словами, если бы мы поставили шаг обновления весов в моем супер общем алгоритме, было бы:

(немедленное обновление весов)

  • Введите ввод
  • Получить вывод
  • Вычислить ошибку
  • Рассчитать изменение весов
  • Обновить эти веса
  • Повторите шаги 3,4,5, пока мы не достигнем уровня ввода

ИЛИ

(Используя "старые" значения весов)

  • Введите ввод
  • Получить вывод
  • Вычислить ошибку
  • Рассчитать изменение весов
  • Сохраните эти изменения в матрице, но не изменяйте эти веса еще
  • Повторите шаги 3,4,5, пока мы не достигнем уровня ввода
  • Обновляйте весы одновременно с помощью наших сохраненных значений

В этот документ, который я прочитал, в обоих абстрактных примерах (те, которые основаны на рисунках 3.3 и 3.4), говорят, что они используют старые значения, а не сразу обновлять значения. Однако в "обработанном примере 3.1" они используют новые значения (даже если они используют старые значения) для вычисления ошибки скрытого слоя.

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

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

Кто-нибудь знает?

Спасибо!

Ответ 1

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

Ответ 2

Обычно вы возвращаетесь к дельтам, а не к ошибкам. Эти дельта вычисляются по ошибкам, но они не означают одно и то же. Когда у вас есть дельта для слоя n (подсчет от входа к выходу), вы используете эти дельта и весовые коэффициенты из слоя n для вычисления дельт для слоя n-1 (один ближе к вводу). Дельты имеют смысл только для старого состояния сети, а не для нового состояния, поэтому вы всегда должны использовать старые веса для распространения дельта обратно на вход.

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

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

Ответ 3

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

Если мы помечаем ваши два метода как new- > online и old- > offline, то у нас есть два алгоритма.

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

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

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

Ответ 4

В в этой книге автор рассказывает о том, как весь смысл алгоритма backpropagation заключается в том, что он позволяет эффективно вычислять все веса в один раз. Другими словами, использование "старых значений" является эффективным. Использование новых значений является более вычислительно дорогостоящим, и поэтому люди используют "старые значения" для обновления весов.