2016-06-01 18 views
6

Tensorflow oferuje ładne opakowanie LSTM.Regulacja dla LSTM w tensorflow

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

Chciałbym użyć regulacji, np. Regularyzacji L2. Ja jednak nie mają bezpośredniego dostępu do różnych matryc wagi używane w komórce LSTM, więc nie mogę jednoznacznie zrobić coś takiego

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

Czy istnieje sposób, aby uzyskać dostęp do matryc lub użyć regularyzacji jakoś z LSTM?

+0

Przekazałem cały proces jako odpowiedź na twoje pytanie. Chk out https://stackoverflow.com/questions/37869744/tensorflow-lstm-regularization/46761296#46761296 – sdr2002

Odpowiedz

9

tf.trainable_variables zawiera listę obiektów Variable, które można wykorzystać do dodania terminu regulowania L2. Zwróć uwagę, że to dodaje regularyzację dla wszystkich zmiennych w twoim modelu. Jeśli chcesz ograniczyć termin L2 tylko do podzbioru wag, możesz użyć nazwy name_scope, aby nazwać zmienne konkretnymi przedrostkami, a później użyć ich do filtrowania zmiennych z listy zwróconej przez tf.trainable_variables.

0

Tensorflow ma kilka wbudowanych funkcji i pomocniczych, które pozwalają na zastosowanie normy L2 do modelu, takich jak 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) 

w etapie biegu szkolenia:

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

lubię robić następujące, ale jedyne co wiem to to, że niektóre parametry wolą nie być regulowane za pomocą L2, takie jak parametry norm wsadowych i błędy. LSTMs zawiera jeden tensor Bias (mimo, że koncepcyjnie ma on wiele błędów, wydaje się być połączony lub coś, dla wydajności), a dla normalizacji wsadowej dodaję "noreg" w nazwie zmiennej, aby ją zignorować.

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 

Gdzie lambda_l2_reg jest mały mnożnik, np: float(0.005)

Spowoduje to zaznaczenie (który jest pełen if w pętli odrzucając pewne zmienne w regularyzacji) raz uczynił mnie skakać od 0,879 punktów F1 0.890 w jednym ujęciu testowania kodu bez zmiany wartości konfiguracji lambda, to było uwzględnianie zarówno zmian dla normalizacji serii i Biases i miałem inne błędy w sieci neuronowej.

Według regulowanie nawracających wag może pomóc w wybuchaniu gradientów.

Ponadto, zgodnie z this other paper, dropout byłby lepiej używany między komórkami stosu, a nie wewnątrz komórki, jeśli używasz niektórych.

Jeśli chodzi o problem z eksplozją gradientu, jeśli korzystasz z przycinania gradientowego z utratą, która ma już dodaną regulację L2, to regularyzacja będzie również brana pod uwagę podczas procesu obcinania.


P.S. Oto sieć neuronowa, nad którą pracowałem: https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs

Powiązane problemy