Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Kopiert einen Teil des Netzwerks eines Modells in eine BrainScript-Funktion.
BS.Network.CloneFunction (inputNodes, outputNodes,
parameters="learnable" /*|"constant"|"shared"*/)
Parameter
-
inputNodesist ein Array von 1 oder mehr Eingaben. Es listet die Knoten des ursprünglichen Netzwerks auf, die die Eingaben der zu extrahierenden Funktion sind. Beim Aufrufen der resultierenden BrainScript-Funktion werden die Parameter der geklonten Funktion durch diese Knoten ersetzt. -
outputNodesist entweder ein einzelner Ausgabeknoten oder ein Datensatz mehrerer Ausgabeknoten. Diese geben an, welche Knoten im ursprünglichen Netzwerk die Ausgabe der geklonten Funktion sind. Die resultierende BrainScript-Funktion gibt diese zurück. -
parametersbestimmt, wie lernbare Parameter im geklonten Abschnitt behandelt werden sollen. Die folgenden Werte werden verstanden:-
"learnable": Jeder lernbare Parameter in der geklonten Funktion erhält eine eigene Kopie, die von schulungen wie jedem anderen Parameter aktualisiert wird. Dies ist die Standardeinstellung. -
"constant": Lernbare Parameter werden kopiert, aber dann fixiert. Die geklonte Funktion erhält während der nachfolgenden Schulung keine Aktualisierungen, z. B. wenn Sie einen Featureextraktionsmodul verwenden möchten, der in einem großen Standardschulungssatz in einer nachfolgenden Schulung auf einem kleineren benutzerdefinierten Satz trainiert wurde. -
"shared": Die ursprünglich lernenden Parameter werden weiterhin gemeinsam genutzt. Sie werden während der nachfolgenden Schulung sowohl von ihrer ursprünglichen Verwendung als auch von der geklonten Verwendung aktualisiert. Wenn die vonCloneFunction()zurückgegebene BrainScript-Funktion mehrmals aufgerufen wird, werden alle Klonen Parameter freigeben.
-
Rückgabewert
BrainScript-Funktion, die so viele Eingabeargumente wie inputNodesakzeptiert und entweder einen Skalar zurückgibt, wenn outputNodes ein Skalar ist, oder ein Datensatz, wenn outputNodes ein Datensatz ist, mit übereinstimmenden Namen.
Beschreibung
Das ursprüngliche Netzwerk kann ein separates Netzwerk sein. Dies ermöglicht das Importieren (Teil) eines externen Netzwerks, das für unterschiedliche Daten trainiert wurde.
CloneFunction() ermöglicht das Fixieren der Modellparameter des Klons. Auf diese Weise kann ein externes Netzwerk als fixer Featureextraktionsmodul verwendet oder als Regularizer in einer Anpassungseinstellung verwendet werden.
Das ursprüngliche Netzwerk kann auch ein Abschnitt des derzeit definierten sein, und der Klon kann seine Parameter für das Original freigeben. Dies ermöglicht mehrere identische Pfade über das Netzwerk, das auf unterschiedlichen Daten ausgeführt wird, z. B. für Setups, die symmetrisch die Ähnlichkeit zweier Eingaben vergleichen, wobei die Featureextraktionsebenen für beide Eingaben freigegeben (und gemeinsam gelernt) werden. Dies funktioniert derzeit jedoch nicht, wenn der ursprüngliche Netzwerkabschnitt eine wiederkehrende Schleife enthält.
Der zu kopierende Abschnitt wird durch seine Eingabe- und Ausgabeknoten definiert. Stellen Sie sich ein Netzplot vor, in dem eine Linie um den unterabschnitt gezogen wird, der geklont werden soll. Dieser durch die Zeile gekennzeichnete Abschnitt wird dann angegeben, indem alle Verbindungen übergeben werden, die die Linie überschreiten, um den markierten Bereich als inputNodes Parameter einzugeben, und alle, die als outputNodesauslaufen.
CloneFunction() extrahiert diesen Abschnitt in eine BrainScript-Funktion mit einer Reihe von Parametern, die der Anzahl der inputNodesentsprechen, und die Ausgabe ist entweder ein einzelner Knoten oder ein Wörterbuch von Knoten.
Es ist auch möglich, lernende Parameter als inputNodeszu kennzeichnen. In diesem Fall können Sie neue Parameter als Argumente für die BrainScript-Funktion ersetzen, die CloneFunction() erstellt. Gehen Sie dazu vor, wenn Sie eine Funktion kopieren möchten, aber die Parameter von Grund auf neu erlernen möchten. In diesem Fall ist es auch möglich, Dimensionen zu ändern.
Beispielanwendungsfälle:
- Adaption (KL): Eine eingefrorene schreibgeschützte Kopie des Startmodells wird als KL-Regularizer verwendet.
- Anpassung (FDLR): Eine eingefügte Eingabetransformation wird trainiert, während das Netzwerk behoben ist.
- Bild: Niedrigere Ebenen von ImageNet-Netzwerken dienen als unveränderliche Featureextraktionsmodule für eine andere Bildaufgabe.
- DSSM: Anwenden desselben Netzwerkunterabschnitts auf zwei Eingaben
Probleme mit Knotennamen mit .[ und ]
Um auf einen Knoten in einem Netzwerk zu verweisen, der . oder [ oder ]enthält, ersetzen Sie diese Zeichen durch _.
Wenn z. B. network einen Knoten mit dem Namen result.zenthält, schlägt network.result.z fehl; sagen Sie stattdessen network.result_z.
Implementierungshinweis
CloneFunction() erstellt nicht tatsächlich BrainScript-Code unter der Haube. Stattdessen wird ein C++-Objekt erstellt, das sich wie eine BrainScript-Funktion verhält.
CloneFunction() selbst klont auch nicht das ursprüngliche Netzwerk. Er enthält nur einen Verweis. Das tatsächliche Klonen erfolgt, wenn die zurückgegebene Funktion aufgerufen wird, die CloneFunction() zurückgibt.
Beispiele
Grundlegende Verwendung:
# create a BS function by copying a piece of an existing network loaded from disk
network = BS.Network.Load ("some.dnn")
net = BS.Network.CloneFunction (network.features, network.logP)
# apply the copy to a new input
out = net (myFeatures)
# This will create a copy of the subsection from network.features to network.logP
# where all links to network.features get replaced by links to myFeatures.
Beispiel mit mehreren Eingabe- und Ausgabeknoten:
# This specific example passes two input nodes --> the resulting BS function will have 2 inputs;
# and it passes a record of output nodes --> the BS function will return a record with the same member names
network = BS.Network.Load ("some.dnn")
net = BS.Network.CloneFunction ((network.features:network.labels), [ ce = network.ce ; errs = network.errs ])
# 'net' is now a BrainScript function with this signature:
# CloneFunction (input1, input2) --> [ ce = ... ; errs = ... ]
# now create a network from the BS function
myFeatures = Input (13)
myLabels = Input (42)
out = net (myFeatures, myLabels) # e.g. myFeatures substitutes the original 'features' node
criterionNodes = (out.ce) # and the return value is a record with members 'ce' and 'errs'
evaluationNodes = (out.errs)
Ein bestimmtes Beispiel: Anpassen eines Netzwerks bei Verwendung des ursprünglichen Netzwerks als Regularizer (KLD):
# load network
network = BS.Network.Load ("some.dnn")
# create a trainable clone and a read-only reference clone
adaptNet = BS.Network.CloneFunction (network.features, [ z = network.z ], parameters="learnable")
refNet = BS.Network.CloneFunction (network.features, [ z = network.z ], parameters="constant")
# create the main network
features = Input (42)
labels = Input (9000)
z = adaptNet (features).z
zRef = refNet (features).z
# training criterion
# In KL adaptation, labels are a linear interpolation of the one-hot targets
# and the posteriors produced by the reference network.
refWeight = 0.9
kldLabels = labels * (1-refWeight) + Softmax (zRef) * refWeight # interpolate with ref output
ce = CrossEntropyWithSoftmax (kldLabels, z) # the CE criterion is taken against these interpolated soft labels
errs = ErrorPrediction (labels, z) # errors are of course still counted against the actual labels
criterionNodes = (ce)
evaluationNodes = (errs)