0

Ich studiere gerade Deep Learning auf Udacity.Wie tune L2 Regularisierung

Ich erfolgreich gebaut und trainieren ein neuronales Netzwerk mit einer versteckten Schicht und ich habe eine 93% ige Genauigkeit mit Testdaten. Als ich jedoch die L2-Regularisierung in mein Modell einführte. Die Genauigkeit sinkt auf 89%. Ist das etwas falsch mit meiner Regularisierung?

beta = 0.01 

n_hidden_layer = 1024 
n_input = 784   # 28* 28 
n_classes = 10 

# Variables 
weights = { 
    'h1': tf.Variable(tf.truncated_normal([n_input, n_hidden_layer], stddev=0.1)), 
    'out': tf.Variable(tf.truncated_normal([n_hidden_layer, n_classes], stddev=0.1)) 
} 
biases = { 
    'b1': tf.Variable(tf.constant(0.1, shape=[n_hidden_layer])), 
    'out': tf.Variable(tf.constant(0.1, shape=[n_classes])) 
} 

def multilayer_perceptron(x, weights, biases): 
    # Hidden layer with RELU activation 
    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) 
    layer_1 = tf.nn.relu(layer_1) 
    # Output layer with linear activation 
    out_layer = tf.matmul(layer_1, weights['out']) + biases['out'] 
    return out_layer 

# Construct model 
pred = multilayer_perceptron(x, weights, biases) 
valid_pred = multilayer_perceptron(tf_valid_dataset, weights, biases) 
test_pred = multilayer_perceptron(tf_test_dataset, weights, biases) 

# Define loss and optimizer 
# L' = L + Beta * (0.5 * ||w||^2) 
l2 = beta * tf.nn.l2_loss(weights['h1']) + beta * tf.nn.l2_loss(weights['out']) 
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=pred) + l2) 
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

Das richtige Maß an Regulierung sollte die Validierung/Testgenauigkeit verbessern.

Aber wenn ich die beta zu 0,001 ändere, bekam ich eine Genauigkeit von 93,7%. Also, sollte ich beta als tf.Variable definieren, um sich selbst abzustimmen?

Antwort

1

Um zu verstehen, warum die Variable von Beta Sie verstehen müssen, was L2 Regularisierung tut: Es bestrafte große Gewichte! Wie viel es diese Gewichte bestrafen sollte, hängt von der Anwendung ab. Einige Anwendungen benötigen größere Gewichte als andere.

Die Beta-Variable ist ein Parameter, den Sie "manuell" einstellen müssen. Es ist nicht etwas, das Sie als tf.Variable hinzufügen sollten. Was Sie jedoch tun können, ist eine schnelle Hyperparametersuche zu erstellen, bei der Sie über mehrere Beta-Werte iterieren, um den besten auszuwählen! Versuchen Sie, den Verlust für mehrere Werte aufzuzeichnen, um festzustellen, welcher Wert am besten ist!

Lassen Sie mich wissen, wenn Sie weitere Fragen haben!

Verwandte Themen