Einzelne Schicht
Verwenden Sie eine Funktion von, um die Gewichte einer einzelnen Ebene zu initialisieren torch.nn.init
. Zum Beispiel:
conv1 = torch.nn.Conv2d(...)
torch.nn.init.xavier_uniform(conv1.weight)
Alternativ können Sie die Parameter ändern, indem Sie in conv1.weight.data
(a torch.Tensor
) schreiben . Beispiel:
conv1.weight.data.fill_(0.01)
Gleiches gilt für Vorurteile:
conv1.bias.data.fill_(0.01)
nn.Sequential
oder benutzerdefiniert nn.Module
Übergeben Sie eine Initialisierungsfunktion an torch.nn.Module.apply
. Es wird die Gewichte im gesamten nn.Module
rekursiv initialisieren .
apply ( fn ): Gilt fn
rekursiv für jedes Submodul (wie von zurückgegeben .children()
) sowie für self. Typische Verwendung ist das Initialisieren der Parameter eines Modells (siehe auch torch-nn-init).
Beispiel:
def init_weights(m):
if type(m) == nn.Linear:
torch.nn.init.xavier_uniform(m.weight)
m.bias.data.fill_(0.01)
net = nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2))
net.apply(init_weights)
reset_parameters
im Quellcode vieler Module eine Methode gefunden . Sollte ich die Methode zur Gewichtsinitialisierung überschreiben?Wir vergleichen verschiedene Arten der Gewichtsinitialisierung unter Verwendung derselben NN-Architektur (Neural Network).
Alle Nullen oder Einsen
Wenn Sie dem Prinzip von Occams Rasiermesser folgen , denken Sie vielleicht, dass es die beste Lösung wäre, alle Gewichte auf 0 oder 1 zu setzen. Das ist nicht der Fall.
Bei gleichem Gewicht produzieren alle Neuronen in jeder Schicht die gleiche Leistung. Dies macht es schwierig zu entscheiden, welche Gewichte eingestellt werden sollen.
Einheitliche Initialisierung
Eine gleichmäßige Verteilung hat die gleiche Wahrscheinlichkeit, eine beliebige Zahl aus einer Reihe von Zahlen auszuwählen.
Mal sehen, wie gut das neuronale Netzwerk mit einer einheitlichen Gewichtsinitialisierung trainiert, wo
low=0.0
undhigh=1.0
.Im Folgenden sehen wir eine andere Möglichkeit (außer im Net-Klassencode), die Gewichte eines Netzwerks zu initialisieren. Um Gewichte außerhalb der Modelldefinition zu definieren, können wir:
Allgemeine Regel zum Einstellen von Gewichten
Die allgemeine Regel zum Einstellen der Gewichte in einem neuronalen Netzwerk besteht darin, sie nahe Null zu setzen, ohne zu klein zu sein.
Im Folgenden vergleichen wir die Leistung von NN, Gewichten, die mit einer gleichmäßigen Verteilung initialisiert wurden [-0,5,0,5], mit denen, deren Gewicht nach einer allgemeinen Regel initialisiert wurde
Normalverteilung zum Initialisieren der Gewichte
Im Folgenden zeigen wir die Leistung von zwei NN, von denen einer mit Gleichverteilung und der andere mit Normalverteilung initialisiert wurde
quelle
Um Ebenen zu initialisieren, müssen Sie normalerweise nichts tun.
PyTorch erledigt das für Sie. Wenn Sie darüber nachdenken, hat dies viel Sinn. Warum sollten wir Ebenen initialisieren, wenn PyTorch dies nach den neuesten Trends tun kann?
Überprüfen Sie zum Beispiel die lineare Ebene .
In der
__init__
Methode wird die Kaiming He init-Funktion aufgerufen .Ähnliches gilt für andere Ebenentypen. Zum
conv2d
Beispiel hier überprüfen .Zu beachten: Der Vorteil einer ordnungsgemäßen Initialisierung ist die schnellere Trainingsgeschwindigkeit. Wenn Ihr Problem eine spezielle Initialisierung verdient, können Sie dies nachträglich tun.
quelle
xavier_uniform
meine Validierungsgenauigkeit nach 30 nur durch Umschalten auf die Initialisierung für die Gewichte (mit auf 0 initialisierten Verzerrungen) anstatt auf die Standardinitialisierung erfolgt Die Epochen von RMSprop stiegen von 82% auf 86%. Ich habe auch eine Validierungsgenauigkeit von 86% erhalten, wenn ich das in Pytorch integrierte VGG16-Modell verwendet habe (nicht vorab trainiert), daher denke ich, dass ich es korrekt implementiert habe. (Ich habe eine Lernrate von 0,00001 verwendet.)quelle
Tut mir leid, dass ich so spät komme, ich hoffe, meine Antwort wird helfen.
So initialisieren Sie Gewichte mit a
normal distribution
Verwendung:Oder um a
constant distribution
Schreiben zu verwenden:Oder um eine zu verwenden
uniform distribution
:Sie können andere Methoden überprüfen , um Tensoren zu initialisieren hier
quelle
Parameter durchlaufen
Wenn Sie beispielsweise nicht verwenden können,
apply
wenn das Modell nicht implementiert istSequential
direkt wird:Für alle gleich
Je nach Form
Sie können versuchen,
torch.nn.init.constant_(x, len(x.shape))
zu überprüfen, ob sie ordnungsgemäß initialisiert wurden:quelle
Wenn Sie zusätzliche Flexibilität wünschen, können Sie die Gewichte auch manuell einstellen .
Angenommen, Sie haben alle Eingaben:
Und Sie möchten eine dichte Ebene ohne Verzerrung erstellen (damit wir sie visualisieren können):
Stellen Sie alle Gewichte auf 0,5 (oder etwas anderes) ein:
Die Gewichte:
Alle Ihre Gewichte sind jetzt 0,5. Geben Sie die Daten weiter:
Denken Sie daran, dass jedes Neuron 8 Eingaben empfängt, die alle ein Gewicht von 0,5 und einen Wert von 1 (und keine Verzerrung) haben, sodass sich für jedes Neuron eine Summe von 4 ergibt.
quelle
Wenn Sie eine Abwertungswarnung sehen (@ Fábio Perez) ...
quelle
Da ich bisher nicht genug Ruf hatte, kann ich unter keinen Kommentar hinzufügen
Aber ich möchte darauf hinweisen, dass wir tatsächlich einige Annahmen in dem Artikel von Kaiming He kennen , der sich eingehend mit Gleichrichtern befasst: Übertreffen der Leistung auf menschlicher Ebene bei der ImageNet-Klassifizierung , sind nicht angemessen, obwohl es so aussieht, als ob die absichtlich entworfene Initialisierungsmethode in der Praxis einen Erfolg hat .
ZB innerhalb des Unterabschnitts von Backward Propagation Case an, dass $ w_l $ und $ \ delta y_l $ unabhängig voneinander sind. Aber wie wir alle wissen, nehmen wir die Score-Map $ \ delta y ^ L_i $ als Instanz, es ist oft $ y_i-softmax (y ^ L_i) = y_i-softmax (w ^ L_ix ^ L_i) $, wenn wir eine typische verwenden Ziel der Kreuzentropieverlustfunktion.
Daher denke ich, dass der wahre Grund, warum die Initialisierung von He gut funktioniert, noch nicht geklärt ist. Denn jeder hat seine Kraft gesehen, das Deep-Learning-Training zu fördern.
quelle