У меня вопрос, как применить оптимизатор ADAM в рекуррентных нейронных сетях.
Обычно оптимизатор ADAM выполняется как (k
представляет внешние итерации),
V_dw = beta_1 * V_dw + (1-beta_1) * dw
S_dw = beta_2 * S_dw + (1-beta_2) * dw^2
Vcorr_dw = V_dw/(1-beta_1^k)
Scorr_dw = S_dw/(1-beta_2^k)
w := w - alpha* Vcorr_dw / sqrt(Scorr_dw + epsilon)
Это делает изменения в обычных нейронных сетях, потому что у нас нет общих весов в разных слоях.Но в RNN весами являются общие параметры на каждом уровне (или временные шаги).
Вопрос в следующем: V_dw
рассчитывается только на каждой внешней итерации (для чего требуется суммирование всех обновлений dw
для всех слоев)?или V_dw
рассчитывается при каждом обновлении для каждого слоя отдельно?
Это два разных пути.С моей точки зрения, V_dw
рассчитывается только после завершения одной итерации, потому что Vcorr_dw
относится к шагу итерации.Но я не уверен, прав я или нет.
Если я ошибся, какой способ лучше для веса обновления w
?рассчитать V_dw
на каждом слое?или вычисление V_dw
только на каждой внешней итерации?