Compartilhar via


Função Clone

Copia uma parte da rede de um modelo em uma função BrainScript.

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

Parâmetros

  • inputNodes é uma matriz de 1 ou mais entradas. Ele lista os nós da rede de origem que são as entradas da função a ser extraída. Ao chamar a função BrainScript resultante, os parâmetros da função clonada são substituídos por esses nós.
  • outputNodes é um único nó de saída ou um registro de vários nós de saída. Elas denotam quais nós na rede de origem são a saída da função clonada. A função BrainScript resultante retornará elas.
  • parameters determina como os parâmetros aprendizes dentro da seção clonada devem ser tratados. Os seguintes valores são compreendidos:
    • "learnable": cada parâmetro de aprendizado na função clonada obterá sua própria cópia, que é atualizada de agora em diante por treinamento como qualquer outro parâmetro. Esse é o padrão.
    • "constant": parâmetros learnable são copiados, mas congelados. A função clonada não receberá atualizações durante o treinamento subsequente, por exemplo, se você quiser usar um extrator de recursos treinado em um grande conjunto de treinamento padrão em um treinamento subsequente em um conjunto personalizado menor.
    • "shared": os parâmetros de aprendizado originais continuarão a ser usados de forma compartilhada. Eles serão atualizados durante o treinamento subsequente do uso original e do uso clonado. Se a função BrainScript retornada por CloneFunction() for invocada várias vezes, todos os clones compartilharão parâmetros.

Valor retornado

Função BrainScript que usa tantos argumentos de entrada quanto inputNodese retorna um escalar se outputNodes for um escalar ou um registro se outputNodes for um registro, com nomes correspondentes.

Descrição

CloneFunction() é uma função para uso em editar e criar modelos. Ele copia uma parte da rede de um modelo em uma função BrainScript para que essa parte da rede possa ser reutilizado. O resultado é uma função BrainScript que pode ser usada como se esta seção da rede tivesse sido definida dentro de uma função BrainScript regular.

A rede de origem pode ser uma rede separada. Isso permite importar (parte de) uma rede externa treinada em dados diferentes. CloneFunction() permite congelar os parâmetros de modelo do clone. Isso permite que uma rede externa seja usada como um extrator de recursos fixo ou atue como um regularizador em uma configuração de adaptação.

A rede de origem também pode ser uma seção da que está sendo definida atualmente e o clone pode compartilhar seus parâmetros com o original. Isso permite vários caminhos idênticos por meio da rede que opera em dados diferentes, por exemplo, para configurações que comparam simétricamente a similaridade de duas entradas, em que as camadas de extração de recursos são compartilhadas (e aprendidas em conjunto) para ambas as entradas. No entanto, isso não funcionará no momento se a seção de rede de origem contiver um loop recorrente.

A seção a ser copiada é definida por seus nós de entrada e saída. Imagine um gráfico de rede no qual uma linha é desenhada em torno da subseção a ser clonada. Esta seção indicada pela linha seria especificada passando todas as conexões que cruzam a linha para entrar na área marcada como o parâmetro inputNodes e tudo isso sairá como outputNodes. CloneFunction() extrairá esta seção em uma função BrainScript com vários parâmetros iguais ao número de inputNodese a saída sendo um único nó ou um dicionário de nós.

Também é possível denotar parâmetros que podem ser aprendidos como inputNodes. Nesse caso, você pode substituir novos parâmetros como argumentos para a função BrainScript que CloneFunction() cria. Faça isso se você quiser copiar uma função, mas aprender os parâmetros do zero. Nesse caso, também é possível alterar dimensões.

Casos de uso de exemplo:

  • adaptação (KL): uma cópia somente leitura congelada do modelo inicial é usada como um KL-regularizer
  • adaptação (FDLR): uma transformação de entrada injetada é treinada enquanto a rede é corrigida
  • imagem: camadas inferiores de redes ImageNet servem como extratores de recursos imutáveis para outra tarefa de imagem
  • DSSM: aplicando a mesma subseção de rede a duas entradas

Problemas com nomes de nó com .[ e ]

Para fazer referência a um nó em uma rede que contém . ou [ ou ], substitua esses caracteres por _. Por exemplo, se network contiver um nó chamado result.z, network.result.z falhará; em vez disso, diga network.result_z.

Observação de implementação

CloneFunction() não cria código BrainScript sob o capô. Em vez disso, ele cria um objeto C++ que se comporta como uma função BrainScript. CloneFunction() em si também não clona a rede de origem. Ele contém apenas uma referência. A clonagem real ocorre quando a função que CloneFunction() retorna é chamada.

Exemplos

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.

Exemplo com vários nós de entrada e saída:

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

Um exemplo específico: adaptar uma rede, ao usar a rede original como um KLD (regularizador):

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