Custom-Verlust-Funktion im PyTorch
Ich habe drei einfache Fragen.
- Was passieren wird, ob meine custom-Verlust-Funktion ist nicht differenzierbar? Wird pytorch durch Fehler oder etwas anderes tun?
- Wenn ich erkläre einem Verlust variable in meine benutzerdefinierte Funktion, die repräsentieren den endgültigen Verlust des Modells, soll ich
requires_grad = True
für diese variable? oder ist es egal? Wenn es egal ist, warum dann? - Ich habe gesehen, dass Leute manchmal schreiben einer separaten Ebene und berechnen Sie den Verlust in der
forward
Funktion. Welcher Ansatz vorzuziehen ist, schreiben Sie eine Funktion oder eine Ebene? Warum?
Ich brauche eine klare und schöne Erklärung auf diese Fragen zu lösen, meine Verwirrungen. Bitte helfen Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lass mich gehen.
Dies hängt davon ab, was du damit meinst "nicht-differenzierbar". Die erste definition, die Sinn macht ist hier, dass PyTorch nicht wissen, wie die Berechnung von Gradienten. Wenn Sie versuchen, um zu berechnen, Verläufe dennoch wird ein Fehler ausgelöst. Zwei mögliche Szenarien sind:
a) Sie verwenden eine benutzerdefinierte PyTorch operation, für die Verläufe wurden nicht umgesetzt, z.B.
torch.svd()
. In diesem Fall erhalten Sie eineTypeError
:b), die Sie eingerichtet haben Ihren eigenen Betrieb, aber nicht definieren
backward()
. In diesem Fall erhalten Sie eineNotImplementedError
:Die zweite definition, die Sinn macht, ist "mathematisch nicht differenzierbar". Klar, eine operation, die mathematisch nicht differenzierbar, sollte entweder keine
backward()
Methode implementiert oder sinnvolle sub-Gradienten. Betrachten Sie zum Beispieltorch.abs()
derenbackward()
Methode gibt die subgradient 0 0:Für diese Fälle, Sie sollten sich auf die PyTorch Dokumentation direkt und Graben, die
backward()
Methode von dem jeweiligen Betrieb direkt.Ist es egal. Die Verwendung von
requires_grad
ist zu vermeiden, um unnötige Berechnungen von Gradienten für Teilgraphen. Wenn es eine einzige Eingabe in einen Vorgang, der erfordert, Farbverlauf, wird seine Produktion auch erfordern Farbverlauf. Umgekehrt, nur wenn alle Eingänge benötigen keine Steigung, die Ausgabe auch nicht verlangen, es. Rückwärts Berechnung wird nie ausgeführt, in der Teilgraphen, in denen alle Variablen, die nicht verlangen, Verläufe.Da gibt es wahrscheinlich einige
Variables
(z.B. Parameter einer Unterklasse vonnn.Module()
), Ihreloss
Variable erfordert auch Farbverläufe automatisch. Allerdings sollten Sie beachten, dass genau wierequires_grad
funktioniert (siehe oben erneut), können Sie nur ändernrequires_grad
für den Blatt-Variablen Ihres Diagramms sowieso.Alle benutzerdefinierten PyTorch-Verlust-Funktionen, sind Unterklassen von
_Loss
welche eine Unterklasse vonnn.Module
. Siehe hier. Wenn Sie möchten, um an diese Konvention sollten Sie Unterklasse_Loss
bei der Definition Ihrer benutzerdefinierten Verlust-Funktion. Abgesehen von der Konsistenz, ein Vorteil ist, dass die Unterklasse wird zu erhöhen eineAssertionError
, wenn Sie noch nicht markiert Ihr Ziel-Variablen alsvolatile
oderrequires_grad = False
. Ein weiterer Vorteil ist, dass Sie Schachteln können Sie Ihre Verlust-Funktion imnn.Sequential()
, weil Ihr einenn.Module
ich würde empfehlen, diesen Ansatz für diese Gründe.