如何在 LSTMCell 中应用层归一化

How to apply Layer Normalisation in LSTMCell

我想在使用 tf.compat.v1.nn.rnn_cell.LSTMCell 的同时将 Layer Normalisation 应用于递归神经网络。

有一个 LayerNormalization class 但我应该如何在 LSTMCell 中应用它。 我正在使用 tf.compat.v1.nn.rnn_cell.LSTMCell 因为我想使用投影层。在这种情况下我应该如何实现规范化。

class LM(tf.keras.Model):
  def __init__(self, hidden_size=2048, num_layers=2):
    super(LM, self).__init__()
    self.hidden_size = hidden_size
    self.num_layers = num_layers
    self.lstm_layers = []
    self.proj_dim = 640
    for i in range(self.num_layers):
        name1 = 'lm_lstm'+str(i)
        self.cell = tf.compat.v1.nn.rnn_cell.LSTMCell(2048, num_proj=640)
        self.lstm_layers.append(tf.keras.layers.RNN(self.cell, return_sequences=True, name=name1))

  def call(self, x):
    for i in range(self.num_layers):
      output = self.lstm_layers[i](x)
      x = output
    state_h = ""
    return x, state_h

这取决于您是想在单元格级别还是在图层级别应用归一化 - 我不确定哪一个是正确的方法 - 论文没有具体说明。 Here 是一个较旧的实现,您可以从中获取灵感。

要在单元格级别进行标准化,您可能需要创建一个 custom RNNCell 并在那里实施标准化。

P.S。您也可以将 LayerNormalization 应用于 RNN 的输出,例如如下所示,但您需要仔细考虑它是否具有所需的效果,尤其是考虑到序列模型固有的可变形状。

self.lstm_layers.append(tf.keras.layers.RNN(self.cell, return_sequences=True, name=name1))
self.lstm_layers.append(tf.keras.layers.LayerNormalization())