Compartir a través de


Clone (función)

Copia una parte de la red de un modelo en una función BrainScript.

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

Parámetros

  • inputNodes es una matriz de 1 o más entradas. Enumera los nodos de la red de origen que son las entradas de la función que se van a extraer. Al llamar a la función BrainScript resultante, los parámetros de la función clonada se sustituyen por estos nodos.
  • outputNodes es un único nodo de salida o un registro de varios nodos de salida. Estos indican qué nodos de la red de origen son la salida de la función clonada. La función BrainScript resultante devolverá estas.
  • parameters determina cómo se deben tratar los parámetros que se pueden aprender dentro de la sección clonada. Se comprenden los valores siguientes:
    • "learnable": todos los parámetros aprendibles de la función clonada obtendrán su propia copia, que se actualizará por lo tanto mediante el entrenamiento como cualquier otro parámetro. Este es el valor predeterminado.
    • "constant": los parámetros que se pueden aprender se copian, pero después se inmovilizan. La función clonada no recibirá ninguna actualización durante el entrenamiento posterior, por ejemplo, si desea usar un extractor de características entrenado en un conjunto de entrenamiento estándar grande en un entrenamiento posterior en un conjunto personalizado más pequeño.
    • "shared": los parámetros aprendibles originales seguirán utilizándose de forma compartida. Se actualizarán durante el entrenamiento posterior a partir de su uso original y del uso clonado. Si la función BrainScript devuelta por CloneFunction() se invoca varias veces, todos los clones compartirán parámetros.

Valor devuelto

La función BrainScript que toma tantos argumentos de entrada como inputNodesy devuelve un escalar si outputNodes es un escalar o un registro si outputNodes es un registro, con nombres coincidentes.

Descripción

CloneFunction() es una función para su uso en la edición y creación de modelos. Copia una parte de la red de un modelo en una función BrainScript, de modo que esta parte de la red se pueda reutilizar. El resultado es una función BrainScript que se puede usar como si esta sección de la red se hubiera definido dentro de una función brainScript normal.

La red de origen puede ser una red independiente. Esto permite importar (parte de) una red externa entrenada en datos diferentes. CloneFunction() permite inmovilizar los parámetros del modelo del clon. Esto permite usar una red externa como extractor de características fija o actuar como regularizador en una configuración de adaptación.

La red de origen también puede ser una sección de la que se define actualmente y el clon puede compartir sus parámetros con el original. Esto permite varias rutas de acceso idénticas a través de la red que funciona en datos diferentes, por ejemplo, para las configuraciones que comparan simétricamente la similitud de dos entradas, donde las capas de extracción de características se comparten (y aprenden conjuntamente) para ambas entradas. Sin embargo, esto no funciona actualmente si la sección de red de origen contiene un bucle recurrente.

La sección que se va a copiar se define mediante sus nodos de entrada y salida. Imagine un trazado de red en el que se dibuja una línea alrededor de la subsección que se va a clonar. Esta sección indicada por la línea se especificaría pasando todas las conexiones que cruzan la línea para escribir el área marcada como parámetro inputNodes y todo lo que sale como outputNodes. CloneFunction() extraerá esta sección en una función BrainScript con un número de parámetros iguales al número de inputNodesy la salida es un solo nodo o un diccionario de nodos.

También es posible indicar parámetros aprendibles como inputNodes. En este caso, puede sustituir nuevos parámetros como argumentos a la función BrainScript que CloneFunction() crea. Haga esto si desea copiar una función, pero aprenda los parámetros desde cero. En este caso, también es posible cambiar las dimensiones.

Casos de uso de ejemplo:

  • adaptación (KL): se usa una copia de solo lectura inmovilizada del modelo inicial como un KL-regularizer.
  • adaptación (FDLR): se entrena una transformación de entrada insertada mientras la red es fija
  • image: las capas inferiores de las redes ImageNet sirven como extractores de características inmutables para otra tarea de imagen.
  • DSSM: aplicar la misma subsección de red a dos entradas

Problemas con nombres de nodo con .[ y ]

Para hacer referencia a un nodo de una red que contiene . o [], reemplace esos caracteres por _. Por ejemplo, si network contiene un nodo denominado result.z, network.result.z se producirá un error; en su lugar, diga network.result_z.

Nota de implementación

CloneFunction() realmente no crea código BrainScript en segundo plano. En su lugar, crea un objeto de C++ que se comporta como una función BrainScript. CloneFunction() también no clona la red de origen. Solo contiene una referencia. La clonación real se produce cuando se llama a la función que CloneFunction() devuelve.

Ejemplos

Uso básico:

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

Ejemplo con varios nodos de entrada y salida:

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

Un ejemplo específico: Adaptación de una red, mientras se usa la red original como regularizador (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)