Função de clonagem
Copia uma parte da rede de um modelo para 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. Estes indicam quais nós na rede de origem são a saída da função clonada. A função BrainScript resultante irá retorná-los. -
parameters
determina como os parâmetros aprendíveis dentro da seção clonada devem ser tratados. Entendem-se os seguintes valores:-
"learnable"
: Cada parâmetro aprendível na função clonada receberá sua própria cópia, que doravante é atualizada por treinamento como qualquer outro parâmetro. Este é o padrão. -
"constant"
: Os parâmetros aprendíveis são copiados, mas depois 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 aprendíveis originais continuarão a ser usados de forma compartilhada. Eles serão atualizados durante o treinamento subsequente a partir de seu uso original e do uso clonado. Se a função BrainScript retornada peloCloneFunction()
for invocada várias vezes, todos os clones compartilharão parâmetros.
-
Valor de retorno
Função BrainScript que usa tantos argumentos de entrada quanto inputNodes
e 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 edição e criação de modelos. Ele copia uma parte da rede de um modelo em uma função BrainScript, para que essa parte da rede possa ser reutilizada. 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 que foi treinada em dados diferentes.
CloneFunction()
permite congelar os parâmetros do modelo do clone. Isso permite que uma rede externa seja usada como um extrator de recursos fixos, 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 que vários caminhos idênticos através da rede operem em dados diferentes, por exemplo, para configurações que comparam simetricamente a semelhança de duas entradas, onde as camadas de extração de recursos são compartilhadas (e aprendidas conjuntamente) para ambas as entradas. No entanto, isso atualmente não funciona 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 em que uma linha é traçada em torno da subseção a ser clonada. Esta seção indicada pela linha seria então especificada passando todas as conexões que cruzam a linha para entrar na área marcada como o parâmetro inputNodes
e todas as que saem como outputNodes
.
CloneFunction()
extrairá esta seção em uma função BrainScript com um número de parâmetros igual ao número de inputNodes
, e a saída sendo um único nó ou um dicionário de nós.
Também é possível denotar parâmetros aprendíveis como inputNodes
. Nesse caso, você pode substituir novos parâmetros como argumentos para a função BrainScript que CloneFunction()
cria. Faça isso se quiser copiar uma função, mas aprenda os parâmetros do zero. Neste caso, também é possível alterar dimensões.
Exemplos de casos de uso:
- adaptação (KL): uma cópia congelada somente leitura do modelo inicial é usada como regularizador KL
- adaptação (FDLR): uma transformada de entrada injetada é treinada enquanto a rede é fixa
- 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
.
Nota de execução
CloneFunction()
realmente 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()
si também não clona a rede de origem. Contém apenas uma referência. A clonagem real acontece quando a função que CloneFunction()
retorna é chamada.
Exemplos
Utilização básica:
# 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 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)