Neural network BRNN实施问题

Neural network BRNN实施问题,neural-network,nlp,deep-learning,recurrent-neural-network,bidirectional,Neural Network,Nlp,Deep Learning,Recurrent Neural Network,Bidirectional,我试图从头开始实现双向RNN,但遇到了问题。 假设我们已经使用给定数量的隐藏单元实现了RNN单元,在这种情况下,BRNN的前向传递将是下一个(伪代码): 但是我不知道如何实现向后传球。我从下一层得到了带有前向传递输出形状的导数误差dA(shape=(隐藏单位,批大小,时间))(当然,假设我们没有输出的串联,前向传递后隐藏单位的数量增加了一倍)。 但是,标准RNN cell backward函数采用dA,其形状为正向输入,因此我尝试了: def brnn_backward(dA): h =

我试图从头开始实现双向RNN,但遇到了问题。 假设我们已经使用给定数量的隐藏单元实现了RNN单元,在这种情况下,BRNN的前向传递将是下一个(伪代码):

但是我不知道如何实现向后传球。我从下一层得到了带有前向传递输出形状的导数误差dA(shape=(隐藏单位,批大小,时间))(当然,假设我们没有输出的串联,前向传递后隐藏单位的数量增加了一倍)。 但是,标准RNN cell backward函数采用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更糟糕的结果。
此外,我不知道如何找到前一层的衍生错误(例如,在我们之前有嵌入层的情况下)。有人能帮我向后传球吗?

在我看来,
BiRNN
中的向后传球和向前传球是同一个过程,它们的区别在于输入的顺序

您不需要为前向或后向单元格实现特定功能,只需创建一个正常的
RNN单元格
,给出输入状态并获取输出状态。在正向链中,您可以将正常的输入序列传递给它,并在反向链中传递反向的输入序列

如果您有时间,您可以阅读TensorFlow如何基于正常的
RNN
实现
BiRNN

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