Неоднозначность в повторном обучении нейронной сети в Julia Flux
Я использую библиотеку Julia Flux, чтобы узнать о нейронных сетях. Согласно документации для (где принимает аргументы
(loss, params, data, opt)
):
Для каждой точки данных d в данных вычислите градиент потерь относительно параметров через обратное распространение и вызовите оптимизатор opt.
(см. источник: https://github.com/FluxML/Flux.jl/blob/master/src/optimise/train.jl)
Для обычной NN, основанной, скажем, с одномерным вводом и выводом, то есть с одной функцией, это легко понять. Каждый элемент в
data
представляет собой пару отдельных чисел, независимую выборку одномерных значений ввода / вывода. выполняет прямое и обратное распространение для каждой пары одномерных выборок по одному. При этом функция оценивается на каждой выборке. (Имею ли я это право?)
Мой вопрос: как это распространяется на повторяющуюся NN? Возьмем случай RNN с 1-мерным (то есть с одной функцией) входом и выходом. Кажется, есть некоторая двусмысленность в том, как структурировать входные и выходные данные, и результаты меняются в зависимости от структуры. В качестве одного примера:
x = [[1], [2], [3]]
y = [4, 5, 6]
data = zip(x, y)
m = RNN(1, 1)
opt = Descent()
loss(x, y) = sum((Flux.stack(m.(x), 1) .- y) .^ 2)
train!(loss, params(m), data, opt)
(функция взята из: https://github.com/FluxML/Flux.jl/blob/master/docs/src/models/recurrence.md)
В этом примере при просмотре каждого образца (
for d in data
), каждое значение представляет собой пару отдельных значений из и, например
([1], 4)
. оценивается на основе этих отдельных значений. Это то же самое, что и в
Dense
дело.
С другой стороны, рассмотрите:
x = [[[1], [2], [3]]]
y = [[4, 5, 6]]
m = RNN(1, 1)
opt = Descent()
loss(x, y) = sum((Flux.stack(m.(x), 1) .- y) .^ 2)
train!(loss, params(m), zip(x, y), opt)
Обратите внимание, что единственная разница здесь в том, что
x
и
y
заключены в дополнительную пару квадратных скобок. В результате получается всего одна, и это пара последовательностей:
([[1], [2], [3]], [4, 5, 6])
. можно оценить на этой версии
d
, и он возвращает одномерное значение, необходимое для обучения. Но значение, возвращаемое функцией, отличается от любого из трех результатов из предыдущего случая, поэтому процесс обучения оказывается другим.
Дело в том, что обе структуры действительны в том смысле, что
loss
и
train!
обрабатывать их без ошибок. Концептуально я могу аргументировать правильность обеих структур. Но результаты разные, и я предполагаю, что верен только один способ. Другими словами, для обучения RNN каждый должен
d in data
быть целой последовательностью или отдельным элементом последовательности?