Bidirectional RNN cells - shared or not?
Should I use the same weights to compute forward and backward passes in a bidirectional RNN, or should those weights be learned independently? 

They should be learned independently as they learn different patterns, unless you have palindromes. In fact that is the default in the Bidirectional wrapper in Keras:

self.forward_layer = copy.copy(layer)
config = layer.get_config()
config['go_backwards'] = not config['go_backwards']
self.backward_layer = layer.__class__.from_config(config)


In the above source code the opposite direction is a copy with independent weights from the original direction.
