【问题标题】:BRNN implementation issueBRNN 实施问题
【发布时间】:2018-04-29 11:32:42
【问题描述】:

我正在尝试从头开始实现双向 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 更差。 另外我不确定如何找到前一层的导数误差(例如,如果我们之前有嵌入层)。有人可以帮助向后传球吗?

【问题讨论】:

    标签: neural-network nlp deep-learning recurrent-neural-network bidirectional


    【解决方案1】:

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

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

    如果你有时间,你可以阅读 TensorFlow 如何在普通 RNN 的基础上实现 BiRNN 的代码。 https://github.com/tensorflow/tensorflow/blob/r1.9/tensorflow/python/ops/rnn.py#L315

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2013-09-16
      • 1970-01-01
      • 2016-11-28
      • 2015-05-11
      • 1970-01-01
      相关资源
      最近更新 更多