Поделиться через


Клонирование функции

Копирует часть сети модели в функцию BrainScript.

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

Параметры

  • inputNodes — это массив из 1 или более входных данных. В нем перечислены узлы исходной сети, которые являются входными данными извлекаемой функции. При вызове результирующей функции BrainScript параметры клонированных функций заменяются этими узлами.
  • outputNodes является одним выходным узлом или записью нескольких выходных узлов. Они указывают, какие узлы в исходной сети являются выходными данными клонированных функций. Результирующая функция BrainScript вернет их.
  • parameters определяет, как следует обрабатывать обучаемые параметры в клонируемом разделе. Понятны следующие значения:
    • "learnable": каждый обучаемый параметр в клонируемой функции получит собственную копию, которая в дальнейшем обновляется обучением, как и любой другой параметр. Это значение по умолчанию.
    • "constant": копируются обучаемые параметры, но затем заморожены. Клонированная функция не будет получать никаких обновлений во время последующего обучения, например, если вы хотите использовать средство извлечения компонентов, обученное на большом стандартном наборе обучения в последующем обучении для меньшего настраиваемого набора.
    • "shared": исходные обучаемые параметры будут по-прежнему использоваться в общем режиме. Они будут обновлены во время последующего обучения из исходного использования и клонированного использования. Если функция BrainScript, возвращаемая методом CloneFunction() , вызывается несколько раз, все клоны будут совместно использовать параметры.

Возвращаемое значение

Функция BrainScript, которая принимает столько входных аргументов, сколько inputNodes, и возвращает скаляр, если outputNodes скаляр или запись, если outputNodes это запись, с соответствующими именами.

Описание

CloneFunction() — это функция для использования в редактировании и создании моделей. Она копирует часть сети модели в функцию BrainScript, чтобы эту часть сети можно было использовать повторно. Результатом является функция BrainScript, которую можно использовать так, как если бы этот раздел сети был определен внутри обычной функции BrainScript.

Исходная сеть может быть отдельной сетью. Это позволяет импортировать (часть) внешней сети, которая была обучена по разным данным. CloneFunction() позволяет заморозить параметры модели клона. Это позволяет использовать внешнюю сеть в качестве средства извлечения предопределенных компонентов или выступать в качестве регуляризатора в параметре адаптации.

Исходная сеть также может быть разделом определяемого в данный момент, и клон может совместно использовать свои параметры с исходным. Это позволяет использовать несколько одинаковых путей через сеть, работающую с разными данными, например для установки, которые симметрично сравнивают сходство двух входных данных, где уровни извлечения признаков совместно используются (и обучаются совместно) для обоих входных данных. Однако это не работает, если исходный сетевой раздел содержит повторяющийся цикл.

Копируемый раздел определяется его входными и выходными узлами. Imagine сетевой график, в котором линия рисуется вокруг подраздела, клонированного. Этот раздел, обозначаемый строкой, будет указан путем передачи всех соединений, пересекающих линию, чтобы ввести помеченную область в качестве inputNodes параметра, и все, что выходит как outputNodes. CloneFunction() извлекает этот раздел в функцию BrainScript с несколькими параметрами, равными количеству inputNodes, а выходные данные — одним узлом или словарем узлов.

Также можно обозначить обучаемые параметры как inputNodes. В этом случае можно заменить новые параметры аргументами функции BrainScript, которая CloneFunction() создает. Сделайте это, если вы хотите скопировать функцию, но изучите параметры с нуля. В этом случае также можно изменить размеры.

Примеры вариантов использования:

  • адаптация (KL): замороженная копия начальной модели только для чтения используется в качестве регуляризатора KL-регуляризатора
  • адаптация (FDLR): внедренное преобразование входных данных обучено, пока сеть устранена
  • image: более низкие слои сетей ImageNet служат неизменяемыми средствами извлечения компонентов для другой задачи образа
  • DSSM: применение одного и того же подраздела сети к двум входным данным

Проблемы с именами узлов и .[]

Ссылка на узел в сети, содержащей . или []заменяющая эти символы _. Например, если network узел содержит вызываемого result.zузла, произойдет сбой, network.result.z а вместо этого — network.result_z.

Примечание о реализации

CloneFunction() на самом деле не создает код BrainScript под капотом. Вместо этого он создает объект C++, который ведет себя как функция BrainScript. CloneFunction() Само по себе также не клонирует исходную сеть. Он содержит только ссылку. Фактическое клонирование происходит при вызове функции, возвращаемой CloneFunction() .

Примеры

Базовое использование:

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

Пример с несколькими узлами ввода и вывода:

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

Конкретный пример: адаптация сети при использовании исходной сети в качестве регуляризатора (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)