Я пытаюсь внедрить двунаправленный RNN с нуля, и у меня проблема с этим.
Давайте предположим, что мы внедрили ячейку RNN с заданным количеством скрытых единиц, в этом случае прямой проход для BRNN будет следующим (псевдокод):
def brnn_forward(input):
hiddden_state = RNN.forward(input)
reversed_input = reverse(input)
hiddden_state_reversed = RNN.forward(reversed_input)
output = concatenate(hiddden_state, hiddden_state_reversed)
return output
Но тогда я не знаю, как реализовать обратный проход. Я получаю производную ошибку dA (shape = (hidden_units, batch_size, times)) из следующего слоя с формой вывода прямого прохода (если, конечно, у нас не было конкатенации выходов, которые удвоили количество скрытых единиц после прямого прохода).
Однако стандартная обратная функция ячейки RNN принимает значение dA в форме прямого входа, поэтому я попробовал:
def brnn_backward(dA):
h = number_of_hidden_units
d_hiddden_state = RNN.backward(dA[:h,:,:])
d_hiddden_state_reversed = RNN.backward(dA[h:,:,:])
dA_for_previous_layer = d_hiddden_state+d_hiddden_state_reversed
return dA_for_previous_layer
Но это не сработало и дало мне результаты хуже, чем с однонаправленным RNN.
Также я не уверен, как найти производную ошибку для предыдущего слоя (в случае, если у нас есть слой внедрения, например). Может ли кто-нибудь помочь с обратным пасом?