2016-06-14 5 views
6

Wie kann ich Max-Norm-Einschränkungen für die Gewichte in einem MLP in Tensorflow implementieren? Die Art, die Hinton und Dean in ihrer Arbeit über dunkles Wissen beschreiben. Das heißt, tf.nn.dropout die Gewichtsbeschränkungen standardmäßig zu implementieren, oder müssen wir es explizit tun, wie inWie kann ich maximale Normbedingungen in einem MLP im Tensorflow implementieren?

https://arxiv.org/pdf/1207.0580.pdf

„Wenn diese Netze die gleichen Gewichte für die verborgenen Einheiten teilen, sind Wir verwenden das standardmäßige, stochastische Gradientenabstiegsverfahren zum Trainieren der neuralen Ausfallnetzwerke in Minibehältern von Trainingsfällen, aber wir modifizieren den Strafterm, der normalerweise verwendet, um zu verhindern, dass die Gewichte zu groß werden die quadrierte Länge (L2-Norm) des gesamten Gewichtsvektors, legen wir eine Obergrenze für die L2-Norm des eingehenden Gewichtes fest Vektor für jede einzelne versteckte Einheit. Wenn ein Gewicht-Update diese Einschränkung verletzt, wir die Gewichte der verborgenen Einheit durch Teilung renormieren „

Keras zu haben scheint es

http://keras.io/constraints/

Antwort

3

tf.nn.dropout does nicht erzwingen jede Norm Einschränkung. Ich glaube, was Sie suchen, ist "process the gradients before applying them" mit tf.clip_by_norm.

Zum Beispiel, anstatt einfach:

# Create an optimizer + implicitly call compute_gradients() and apply_gradients() 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) 

Sie könnten:

# Create an optimizer. 
optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
# Compute the gradients for a list of variables. 
grads_and_vars = optimizer.compute_gradients(loss, [weights1, weights2, ...]) 
# grads_and_vars is a list of tuples (gradient, variable). 
# Do whatever you need to the 'gradient' part, for example cap them, etc. 
capped_grads_and_vars = [(tf.clip_by_norm(gv[0], clip_norm=123.0, axes=0), gv[1]) 
         for gv in grads_and_vars] 
# Ask the optimizer to apply the capped gradients 
optimizer = optimizer.apply_gradients(capped_grads_and_vars) 

Ich hoffe, das hilft. Abschließende Hinweise zu tf.clip_by_norm ‚s axes Parameter:

  1. Wenn Sie die Berechnung tf.nn.xw_plus_b(x, weights, biases) oder äquivalent matmul(x, weights) + biases, wenn die Abmessungen von x und weights sind (batch, in_units) und (in_units, out_units) jeweils dann haben Sie wahrscheinlich wollen axes == [0] einstellen (weil in diesem Verwendung jeder Spalte Details alle eingehenden Gewichte zu einer bestimmten Einheit).
  2. Achten Sie auf die Form/Abmessungen Ihrer Variablen oben und ob/wie genau Sie jeweils clip_by_norm wollen! Z.B. Wenn einige von [weights1, weights2, ...] Matrizen sind und einige nicht, und Sie rufen clip_by_norm() auf dem grads_and_vars mit dem gleichen axes Wert wie in der List Comprehension oben, bedeutet dies nicht das Gleiche für alle Variablen! In der Tat, wenn Sie Glück haben, wird dies zu einem seltsamen Fehler wie ValueError: Invalid reduction dimension 1 for input with 1 dimensions führen, aber ansonsten ist es ein sehr hinterhältiger Fehler.
Verwandte Themen