Регуляризации для ЛСТМ в tensorflow

Tensorflow предлагает хорошую оболочку LSTM.

rnn_cell.BasicLSTM(num_units, forget_bias=1.0, input_size=None,
           state_is_tuple=False, activation=tanh)

Я хотел бы использовать регуляризацию, скажем, регуляризацию L2. Однако у меня нет прямого доступа к различным весовым матрицам, используемым в ячейке LSTM, поэтому я не могу явно сделать что-то вроде

loss = something + beta * tf.reduce_sum(tf.nn.l2_loss(weights))

есть ли способ получить доступ к матрицам или использовать регуляризацию каким-то образом с LSTM?

3 ответов


tf.trainable_variables дает вам список Variable объекты, которые можно использовать для добавления термина регуляризации L2. Обратите внимание, что это добавляет регуляризацию для всех переменных в вашей модели. Если вы хотите ограничить термин L2 только подмножеством весов, вы можете использовать name_scope чтобы назвать переменные с определенными префиксами, а затем использовать это для фильтрации переменных из списка, возвращаемого tf.trainable_variables.


мне нравится делать следующее, Но единственное, что я знаю, это то, что некоторые параметры предпочитают не регулироваться с L2, такие как параметры пакетной нормы и предубеждения. LSTMs содержит один тензор смещения (несмотря на то, что концептуально он имеет много смещений, они, похоже, объединены или что-то еще, для производительности), и для пакетной нормализации я добавляю "noreg" в имя переменных, чтобы игнорировать его тоже.

loss = your regular output loss
l2 = lambda_l2_reg * sum(
    tf.nn.l2_loss(tf_var)
        for tf_var in tf.trainable_variables()
        if not ("noreg" in tf_var.name or "Bias" in tf_var.name)
)
loss += l2

здесь lambda_l2_reg малый множитель, например: float(0.005)

делаешь этот выбор (который является полным if в цикле отбрасывания некоторых переменных в регуляризации) однажды заставил меня прыгать от 0.879 F1 оценка до 0.890 в одном кадре тестирования кода без перенастройки значения конфигурации lambda, ну, это включало как изменения для нормализации пакета, так и предубеждения, и у меня были другие предубеждения в нейронной сети.

по данным этой статье, регуляризация рекуррентных Весов может помочь с взрывающиеся градиенты.

также, по данным этот и другие бумаги, отсев будет лучше использоваться между штабелированными ячейками, а не внутри ячеек, если вы используете некоторые.

о проблеме взрывающегося градиента, если вы используете отсечение градиента с потерей, к которой уже добавлена регуляризация L2, эта регуляризация также будет учитываться в процессе отсечения.


P. S. Вот нейронной сети я работал на: https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs


Tensorflow имеет некоторые встроенные и вспомогательные функции, которые позволяют применять нормы L2 к вашей модели, такие как tf.clip_by_global_norm:

    # ^^^ define your LSTM above here ^^^

    params = tf.trainable_variables()

    gradients = tf.gradients(self.losses, params)

    clipped_gradients, norm = tf.clip_by_global_norm(gradients,max_gradient_norm)
    self.gradient_norms = norm

    opt = tf.train.GradientDescentOptimizer(self.learning_rate)
    self.updates = opt.apply_gradients(
                    zip(clipped_gradients, params), global_step=self.global_step)

в вашем тренировочном шаге run:

    outputs = session.run([self.updates, self.gradient_norms, self.losses], input_feed)