Avoiding Overfitting with a large LSTM net on a small amount of data
You may want to check a couple of hyperparameters that it appears you are not testing for in your code above:

Gradient clipping: large updates to weights during training can cause a numerical overflow or underflow often referred to as “exploding gradients.”

# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)


Reccurent dropout: Dropout that is applied to the recurrent input signal of the units of the LSTM layer.

keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)


Stateful: Is it clear from the paper if the model retains its state with each training iteration. You can experiment with this as well.

keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)