Delen via


Kloonfunctie

Kopieert een deel van het netwerk van een model naar een BrainScript-functie.

BS.Network.CloneFunction (inputNodes, outputNodes,
                          parameters="learnable" /*|"constant"|"shared"*/)

Parameters

  • inputNodes is een matrix van 1 of meer invoerwaarden. Het bevat de knooppunten van het oorspronkelijke netwerk die de invoer van de functie zijn die moet worden geëxtraheerd. Bij het aanroepen van de resulterende BrainScript-functie worden de parameters van de gekloonde functie vervangen door deze knooppunten.
  • outputNodes is een enkel uitvoerknooppunt of een record van meerdere uitvoerknooppunten. Deze geven aan welke knooppunten in het oorspronkelijke netwerk de uitvoer van de gekloonde functie zijn. De resulterende BrainScript-functie retourneert deze.
  • parameters bepaalt hoe leerbare parameters in de gekloonde sectie moeten worden behandeld. De volgende waarden worden begrepen:
    • "learnable": Elke leerbare parameter in de gekloonde functie krijgt een eigen kopie, die voortaan wordt bijgewerkt door training zoals elke andere parameter. Dit is de standaardwaarde.
    • "constant": Leerbare parameters worden gekopieerd, maar vervolgens geblokkeerd. De gekloonde functie ontvangt tijdens de volgende training geen updates, bijvoorbeeld als u een functie-extractor wilt gebruiken die is getraind op een grote standaardtrainingsset in een volgende training voor een kleinere aangepaste set.
    • "shared": de oorspronkelijke leerbare parameters blijven op gedeelde wijze worden gebruikt. Ze worden bijgewerkt tijdens de volgende training van zowel het oorspronkelijke gebruik als het gekloonde gebruik. Als de BrainScript-functie die door CloneFunction() wordt geretourneerd meerdere keren wordt aangeroepen, delen alle klonen parameters.

Retourwaarde

BrainScript-functie die zoveel invoerargumenten als inputNodesgebruikt en retourneert een scalaire waarde als outputNodes een scalaire waarde is, of een record als outputNodes een record is, met overeenkomende namen.

Beschrijving

CloneFunction() is een functie voor gebruik in het bewerken van en het maken van modellen. Het kopieert een deel van het netwerk van een model naar een BrainScript-functie, zodat dit deel van het netwerk opnieuw kan worden gebruikt. Het resultaat is een BrainScript-functie die kan worden gebruikt alsof deze sectie van het netwerk is gedefinieerd in een reguliere BrainScript-functie.

Het oorspronkelijke netwerk kan een afzonderlijk netwerk zijn. Hiermee kunt u (een deel van) een extern netwerk importeren dat is getraind op verschillende gegevens. CloneFunction() kunt u de modelparameters van de kloon blokkeren. Hierdoor kan een extern netwerk worden gebruikt als een extractor met vaste functies of als regularizer in een aanpassingsinstelling fungeren.

Het oorspronkelijke netwerk kan ook een sectie zijn van het netwerk dat momenteel wordt gedefinieerd en de kloon kan de parameters delen met het origineel. Hierdoor kunnen meerdere identieke paden via het netwerk worden uitgevoerd op verschillende gegevens, bijvoorbeeld voor setups waarmee overeenkomsten van twee invoer symmetrisch worden vergeleken, waarbij de functie-extracterende lagen worden gedeeld (en gezamenlijk worden geleerd) voor beide invoer. Dit werkt momenteel echter niet als de oorspronkelijke netwerksectie een terugkerende lus bevat.

De te kopiëren sectie wordt gedefinieerd door de invoer- en uitvoerknooppunten. Stel u een netwerkplot voor waarin een lijn rond de subsectie wordt getrokken die moet worden gekloond. Deze sectie die door de lijn wordt aangeduid, wordt vervolgens opgegeven door alle verbindingen door te geven die de lijn kruisen om het gemarkeerde gebied in te voeren als de parameter inputNodes, en alles wat als outputNodesgaat. CloneFunction() extraheert deze sectie in een BrainScript-functie met een aantal parameters die gelijk zijn aan het aantal inputNodesen de uitvoer is ofwel één knooppunt of een woordenlijst met knooppunten.

Het is ook mogelijk om leerbare parameters aan te duiden als inputNodes. In dit geval kunt u nieuwe parameters vervangen als argumenten voor de Functie BrainScript die CloneFunction() maakt. Doe dit als u een functie wilt kopiëren, maar de parameters helemaal opnieuw wilt leren. In dit geval is het ook mogelijk om dimensies te wijzigen.

Voorbeeld van use cases:

  • aanpassing (KL): een bevroren alleen-lezen kopie van het startmodel wordt gebruikt als EEN KL-regularizer
  • aanpassing (FDLR): een geïnjecteerde invoertransformatie wordt getraind terwijl het netwerk vast is
  • afbeelding: lagere lagen van ImageNet-netwerken fungeren als onveranderbare functie-extractors voor een andere afbeeldingstaak
  • DSSM: dezelfde netwerksubsectie toepassen op twee invoer

Problemen met knooppuntnamen met .[ en ]

Als u wilt verwijzen naar een knooppunt in een netwerk dat . of [ of ]bevat, vervangt u deze tekens door _. Als network bijvoorbeeld een knooppunt met de naam result.zbevat, mislukt network.result.z; zeg in plaats daarvan network.result_z.

Implementatienotitie

CloneFunction() maakt geen BrainScript-code achter de schermen. In plaats daarvan wordt er een C++-object gemaakt dat zich gedraagt als een BrainScript-functie. CloneFunction() zelf kloont ook niet het oorspronkelijke netwerk. Het bevat alleen een verwijzing. De werkelijke kloon vindt plaats wanneer de functie die CloneFunction() retourneert, wordt aangeroepen.

Voorbeelden

Basisgebruik:

# 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.

Voorbeeld met meerdere invoer- en uitvoerknooppunten:

# 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)

Een specifiek voorbeeld: Een netwerk aanpassen, terwijl u het oorspronkelijke netwerk gebruikt 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)