【发布时间】: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