Регуляризация для LSTM в тензорном потоке

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?

 sdr200216 окт. 2017 г., 02:10
Я поставил целый процесс как ответ на ваш вопрос. Chk Outstackoverflow.com/questions/37869744/...

Ответы на вопрос(3)

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)

на вашем тренировочном шаге запустите:

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

Мне нравится делать следующее, но единственное, что я знаю, это то, что некоторые параметры предпочитают не регулироваться с помощью L2, такие как параметры пакетной нормы и смещения. LSTM содержат один тензор смещения (несмотря на то, что концептуально он имеет много смещений, они, кажется, объединены или что-то еще, для производительности), и для нормализации партии я добавляю «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Ну, это включало как изменения для нормализации партии, так и смещения, и у меня были другие смещения в нейронной сети.

В соответствии сЭта бумагаРегуляризация повторяющихся весов может помочь при взрыве градиентов.

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

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

Постскриптум Вот нейронная сеть, над которой я работал:https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs

Решение Вопроса

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

Ваш ответ на вопрос