Clone 関数
モデルのネットワークの一部を BrainScript 関数にコピーします。
BS.Network.CloneFunction (inputNodes, outputNodes,
parameters="learnable" /*|"constant"|"shared"*/)
パラメーター
-
inputNodes
は、1 つ以上の入力の配列です。 抽出する関数の入力である送信元ネットワークのノードが一覧表示されます。 結果として得られる BrainScript 関数を呼び出すと、複製された関数のパラメーターがこれらのノードに置き換えます。 -
outputNodes
は、単一の出力ノードまたは複数の出力ノードのレコードです。 これらは、複製された関数の出力である送信元ネットワーク内のノードを示します。 結果として得られる BrainScript 関数は、これらを返します。 -
parameters
は、複製されたセクション内の学習可能なパラメーターを処理する方法を決定します。 次の値が認識されます。-
"learnable"
: 複製された関数内のすべての学習可能なパラメーターは、それ自体のコピーを取得します。そのため、他のパラメーターと同様にトレーニングによって更新されます。 これが既定値です。 -
"constant"
: 学習可能なパラメーターがコピーされますが、固定されます。 複製された関数は、後続のトレーニング中に更新プログラムを取得しません。たとえば、小規模なカスタム セットの後続のトレーニングで大規模な標準トレーニング セットでトレーニングされた特徴抽出器を使用する場合などです。 -
"shared"
: 元の学習可能なパラメーターは引き続き共有形式で使用されます。 これらは、元の使用と複製された使用の両方から、後続のトレーニング中に更新されます。CloneFunction()
によって返される BrainScript 関数が複数回呼び出されると、すべてのクローンがパラメーターを共有します。
-
戻り値
BrainScript 関数は、inputNodes
と同数の入力引数を受け取り、outputNodes
がスカラーの場合はスカラーを返し、outputNodes
がレコードの場合は名前が一致するレコードを返します。
形容
送信元ネットワークは別のネットワークにすることができます。 これにより、さまざまなデータでトレーニングされた外部ネットワークを (その一部として) インポートできます。
CloneFunction()
では、クローンのモデル パラメーターを固定できます。 これにより、外部ネットワークを固定機能抽出器として使用したり、適応設定で正則化として機能したりできます。
送信元のネットワークは、現在定義されているネットワークのセクションにすることもでき、複製はそのパラメーターを元のネットワークと共有できます。 これにより、2 つの入力の類似性を対称的に比較する設定など、ネットワークを介して複数の同一パスが異なるデータで動作できます。この設定では、フィーチャ抽出レイヤーが両方の入力で共有 (および共同学習) されます。 ただし、現在のところ、元のネットワーク セクションに再帰ループが含まれている場合は機能しません。
コピーするセクションは、その入力ノードと出力ノードによって定義されます。 複製するサブセクションの周囲に線が描画されるネットワーク プロットを想像してみてください。 その後、線で示されるこのセクションは、線を越えるすべての接続を渡して、マークされた領域を inputNodes
パラメーターとして入力し、すべての接続を outputNodes
として渡すことによって指定されます。
CloneFunction()
は、このセクションを、inputNodes
の数と同じ数のパラメーターを持つ BrainScript 関数に抽出し、出力は 1 つのノードまたはノードのディクショナリのいずれかになります。
学習可能なパラメータを inputNodes
として表すこともできます。 この場合、新しいパラメーターを、CloneFunction()
作成する BrainScript 関数の引数として置き換えることができます。 関数をコピーするが、パラメーターをゼロから学習する場合は、これを行います。 この場合、寸法を変更することも可能である。
ユース ケースの例:
- 適応 (KL): 開始モデルの固定読み取り専用コピーが KL 正則化器として使用されます。
- 適応 (FDLR): 挿入された入力変換は、ネットワークが固定されている間にトレーニングされます
- image: ImageNet ネットワークの下位レイヤーは、別のイメージ タスクの不変機能エクストラクターとして機能します
- DSSM: 同じネットワーク サブセクションを 2 つの入力に適用する
.
[
と ]
でのノード名に関する問題
.
または [
または ]
を含むネットワーク内のノードを参照するには、それらの文字を _
で置き換えます。
たとえば、network
に result.z
というノードが含まれている場合、network.result.z
は失敗します。代わりに network.result_z
を言う.
実装に関するメモ
CloneFunction()
では、実際には内部に BrainScript コードは作成されません。 代わりに、BrainScript 関数のように動作する C++ オブジェクトを作成します。
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)