Udostępnij przez


Clone, funkcja

Kopiuje część sieci modelu do funkcji BrainScript.

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

Parametry

  • inputNodes jest tablicą 1 lub więcej danych wejściowych. Zawiera listę węzłów sieci źródłowej, które są danymi wejściowymi funkcji do wyodrębnienia. Podczas wywoływania wynikowej funkcji BrainScript parametry sklonowanej funkcji są zastępowane dla tych węzłów.
  • outputNodes jest pojedynczym węzłem wyjściowym lub rekordem wielu węzłów wyjściowych. Określają one, które węzły w sieci źródłowej są danymi wyjściowymi sklonowanej funkcji. Wynikowa funkcja BrainScript zwróci te dane.
  • parameters Określa, jak powinny być traktowane parametry do nauki wewnątrz sklonowanej sekcji. Rozumie się następujące wartości:
    • "learnable": Każdy parametr możliwy do nauki w sklonowanej funkcji otrzyma własną kopię, która jest stąd aktualizowana przez trenowanie tak jak każdy inny parametr. Jest to opcja domyślna.
    • "constant": Parametry do nauki są kopiowane, ale następnie zamrożone. Sklonowana funkcja nie będzie otrzymywać żadnych aktualizacji podczas kolejnych szkoleń, np. jeśli chcesz użyć ekstraktora funkcji wyszkolonego na dużym standardowym zestawie treningowym w kolejnym trenowaniu w mniejszym zestawie niestandardowym.
    • "shared": oryginalne parametry do nauki będą nadal używane w sposób udostępniony. Zostaną one zaktualizowane podczas kolejnych szkoleń zarówno z ich oryginalnego użycia, jak i sklonowanego użycia. Jeśli funkcja BrainScript zwrócona przez CloneFunction() funkcję jest wywoływana wiele razy, wszystkie klony będą współdzielić parametry.

Wartość zwracana

Funkcja BrainScript, która przyjmuje tyle argumentów wejściowych, jak inputNodes, i zwraca wartość skalarną, jeśli outputNodes jest skalarną, lub rekordem, jeśli outputNodes jest rekordem, z pasującymi nazwami.

Opis

CloneFunction() jest funkcją służącą do edytowania i tworzenia modeli. Kopiuje część sieci modelu do funkcji BrainScript, aby można było ponownie użyć tej części sieci. Wynikiem jest funkcja BrainScript, która może być używana tak, jakby ta sekcja sieci została zdefiniowana wewnątrz regularnej funkcji BrainScript.

Sieć źródłowa może być oddzielną siecią. Umożliwia to importowanie (część) sieci zewnętrznej, która została wytrenowana na różnych danych. CloneFunction() umożliwia zablokowanie parametrów modelu klonu. Dzięki temu sieć zewnętrzna może być używana jako stały ekstraktor funkcji lub działać jako regularyzator w ustawieniu adaptacji.

Sieć źródłowa może być również sekcją aktualnie zdefiniowanej, a klon może udostępniać jego parametry oryginalnemu. Pozwala to na wiele identycznych ścieżek przez sieć działającą na różnych danych, na przykład w przypadku konfiguracji, które symetrycznie porównują podobieństwo dwóch danych wejściowych, gdzie warstwy wyodrębniania funkcji są współużytkowane (i poznane wspólnie) dla obu danych wejściowych. Obecnie nie działa to jednak, jeśli sekcja sieci źródłowej zawiera pętlę rekursji.

Sekcja do skopiowania jest definiowana przez węzły wejściowe i wyjściowe. Imagine wykres sieciowy, w którym linia jest rysowana wokół podsekcji do sklonowania. Ta sekcja oznaczona przez wiersz zostanie określona przez przekazanie wszystkich połączeń przekraczających linię w celu wprowadzenia oznaczonego obszaru jako parametru inputNodes , a wszystko to wychodzi jako outputNodes. CloneFunction() Wyodrębni tę sekcję do funkcji BrainScript z wieloma parametrami równymi liczbie parametrów inputNodes, a dane wyjściowe są pojedynczym węzłem lub słownikiem węzłów.

Istnieje również możliwość określenia parametrów, które można nauczyć jako inputNodes. W takim przypadku można zastąpić nowe parametry argumentami funkcji BrainScript, która CloneFunction() tworzy. Zrób to, jeśli chcesz skopiować funkcję, ale poznasz parametry od podstaw. W takim przypadku można również zmienić wymiary.

Przykładowe przypadki użycia:

  • adaptacja (KL): zamrożona kopia tylko do odczytu modelu początkowego jest używana jako regularyzator KL
  • adaptacja (FDLR): wstrzyknięta transformacja wejściowa jest trenowana, gdy sieć jest stała
  • obraz: niższe warstwy sieci ImageNet służą jako niezmienialne ekstraktory funkcji dla innego zadania obrazu
  • DSSM: stosowanie tej samej podsekcji sieciowej do dwóch danych wejściowych

Problemy z nazwami węzłów i .[]

Aby odwołać się do węzła w sieci zawierającej . lub [], zastąp te znaki ._ Na przykład jeśli network zawiera węzeł o nazwie result.z, network.result.z zakończy się niepowodzeniem; zamiast tego powiedzmy network.result_z.

Uwaga dotycząca implementacji

CloneFunction() w rzeczywistości nie tworzy kodu BrainScript pod maską. Zamiast tego tworzy obiekt języka C++, który zachowuje się jak funkcja BrainScript. CloneFunction() sama w sobie nie klonuje również sieci źródłowej. Zawiera tylko odwołanie. Rzeczywiste klonowanie ma miejsce, gdy jest wywoływana funkcja, która CloneFunction() zwraca.

Przykłady

Podstawowe użycie:

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

Przykład z wieloma węzłami wejściowymi i wyjściowymi:

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

Konkretny przykład: Dostosowanie sieci podczas korzystania z oryginalnej sieci jako regularyzatora (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)