В рекуррентной нейронной сети вы, как правило, продвигаетесь вперед через несколько временных шагов, «разворачиваете» сеть, а затем распространяетесь обратно через последовательность входов.
Почему бы вам не просто обновить веса после каждого отдельного шага в последовательности? (эквивалент использования длины усечения 1, поэтому развернуть нечего) Это полностью устраняет проблему исчезающего градиента, значительно упрощает алгоритм, вероятно, уменьшит шансы застрять в локальных минимумах и, что наиболее важно, работает нормально , Я тренировал модель таким образом, чтобы генерировать текст, и результаты казались сопоставимыми с результатами, которые я видел из обученных моделей BPTT. Я только запутался в этом, потому что в каждом учебнике по RNN, который я видел, говорится, что нужно использовать BPTT, почти как если бы он был необходим для правильного обучения, а это не так.
Обновление: я добавил ответ
Ответы:
Изменить: я сделал большую ошибку при сравнении двух методов и должен изменить свой ответ. Оказывается, способ, которым я это делал, просто обратно распространяясь на текущем временном шаге, фактически начинает учиться быстрее. Быстрые обновления очень быстро изучают самые основные шаблоны. Но при большем наборе данных и с более длительным временем обучения BPTT действительно побеждает. Я тестировал небольшой образец всего за несколько эпох и предположил, что тот, кто начнет выигрывать гонку, будет победителем. Но это привело меня к интересной находке. Если вы начинаете тренировку обратно, распространяясь всего за один шаг, затем переходите к BPTT и постепенно увеличиваете, насколько далеко вы продвигаетесь, вы получаете более быструю конвергенцию.
источник
RNN - это глубокая нейронная сеть (DNN), где каждый уровень может принимать новые входные данные, но иметь те же параметры. BPT - это модное слово для обратного распространения в такой сети, которое само по себе является модным словом для градиентного спуска.
Скажем , что РНН выходов у т в каждом шаге и е р г ö г т = ( у т - у т ) 2y^t
Чтобы узнать вес, нам нужны градиенты, чтобы функция отвечала на вопрос "насколько изменение параметра влияет на функцию потерь?" и переместите параметры в направлении, заданном:
Т.е. у нас есть DNN, где мы получаем отзывы о том, насколько хорош прогноз на каждом уровне. Поскольку изменение параметра будет изменять каждый уровень в DNN (временной шаг), и каждый уровень вносит свой вклад в предстоящие результаты, это необходимо учитывать.
Возьмем простую одноуровневую сеть, чтобы увидеть это полуявным образом:
С скорость обучения шаг один учебный тогда: [ ~ ~ б ~ с ] ← [ б с ] + δ ( у т - у т ) ∇ у тδ
Может быть, каждый шаг будет давать приблизительное направление, которого достаточно для агрегирования? Это может объяснить ваши результаты, но мне было бы интересно услышать больше о вашем методе / функции потери! Также будет интересно сравнение с оконным ANN с двумя временными шагами.
edit4: После прочтения комментариев кажется, что ваша архитектура не RNN.
Ваша модель: без состояния - скрытое состояние перестраивается на каждом шаге.Edit2: добавлено больше ссылок на DNN. Edit3: исправлен шаг градации и некоторые нотации edit5: исправлена интерпретация вашей модели после вашего ответа / уточнения.источник
"Unfolding through time" is simply an application of the chain rule,
Выход RNN на шаге по времениT , ЧАСT является функцией параметров θ вход ИксT и предыдущее состояние, ЧАСт - 1 (обратите внимание, что вместо ЧАСT может быть преобразован снова на шаге времени T чтобы получить вывод, что здесь не важно). Помните цель градиентного спуска: дана некоторая функция ошибокL , давайте посмотрим на нашу ошибку для текущего примера (или примеров), а затем давайте настроим θ таким образом, если мы снова приведем тот же пример, наша ошибка будет уменьшена.
Как именноθ внести свой вклад в нашу текущую ошибку? Мы взяли взвешенную сумму с нашим текущим вкладом,ИксT так что нам нужно будет вернуться через вход, чтобы найти ∇θа ( хT, θ ) , чтобы решить, как настроить θ , Но наша ошибка была также результатом некоторого вкладаЧАСт - 1 который также был функциейθ , right? So we need to find out ∇θHt−1 , which was a function of xt−1 , θ and Ht−2 . But Ht−2 was also a function a function of θ . And so on.
источник