Регуляризации для ЛСТМ в 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)