I'm trying to understand how Bidirectional RNNs work.
Specifically, I want to know whether a single cell is used with different states, or two different cells are used, each having independent parameters.
In pythonic pseudocode,
Implementation 1:
cell = rev_cell = RNNCell()
cell_state = cell.get_initial_state()
rev_cell_state = rev_cell.get_initial_state()
for i in range(len(series)):
output, cell_state = cell(series[i], cell_state)
rev_output, rev_cell_state = rev_cell(series[-i-1], rev_cell_state)
final_output = concatenate([output, rev_output])
Implementation 2:
cell = RNNCell()
rev_cell = RNNCell()
cell_state = cell.get_initial_state()
rev_cell_state = rev_cell.get_initial_state()
for i in range(len(series)):
output, cell_state = cell(series[i], cell_state)
rev_output, rev_cell_state = rev_cell(series[-i-1], rev_cell_state)
final_output = concatenate([output, rev_output])
Which of the above implementations is correct? Or is the working of Bidirectional RNNs completely different altogether?