모델 네트워크의 일부를 BrainScript 함수에 복사합니다.
BS.Network.CloneFunction (inputNodes, outputNodes,
parameters="learnable" /*|"constant"|"shared"*/)
매개 변수
inputNodes은 1개 이상의 입력 배열입니다. 추출할 함수의 입력인 원래 네트워크의 노드를 나열합니다. 결과 BrainScript 함수를 호출할 때 복제된 함수의 매개 변수가 이러한 노드로 대체됩니다.outputNodes는 단일 출력 노드 또는 여러 출력 노드의 레코드입니다. 이는 원래 네트워크의 노드가 복제된 함수의 출력인 것을 나타냅니다. 결과 BrainScript 함수는 이러한 함수를 반환합니다.parameters는 복제된 섹션 내에서 학습 가능한 매개 변수를 처리하는 방법을 결정합니다. 다음 값을 이해합니다."learnable": 복제된 함수의 학습 가능한 모든 매개 변수는 자체 복사본을 가져옵니다. 이 복사본은 다른 매개 변수와 마찬가지로 학습에 의해 업데이트됩니다. 이것이 기본값입니다."constant": 학습 가능한 매개 변수가 복사되지만 고정됩니다. 복제된 함수는 후속 학습 중에 업데이트를 받지 않습니다. 예를 들어 더 작은 사용자 지정 집합에 대한 후속 학습에서 대규모 표준 학습 집합에서 학습된 기능 추출기를 사용하려는 경우입니다."shared": 원래 학습 가능한 매개 변수는 공유 방식으로 계속 사용됩니다. 원래 사용 및 복제된 사용에서 후속 학습 중에 업데이트됩니다. 반환CloneFunction()된 BrainScript 함수가 여러 번 호출되면 모든 클론이 매개 변수를 공유합니다.
반환 값
입력 인수 inputNodes를 최대한 많이 사용하고 스칼라인 경우 outputNodes 스칼라를 반환하거나 일치하는 이름을 가진 레코드인 경우 outputNodes 레코드를 반환하는 BrainScript 함수입니다.
Description
CloneFunction() 는 모델을 편집 하고 만드는 데 사용할 수 있는 함수입니다. 모델의 네트워크 일부를 BrainScript 함수에 복사하여 네트워크의 이 부분을 다시 사용할 수 있도록 합니다. 그 결과 네트워크의 이 섹션이 일반 BrainScript 함수 내에 정의된 것처럼 사용할 수 있는 BrainScript 함수가 생성됩니다.
원래 네트워크는 별도의 네트워크일 수 있습니다. 이렇게 하면 다른 데이터에 대해 학습된 외부 네트워크를 가져올 수 있습니다(일부). CloneFunction() 는 복제본의 모델 매개 변수를 고정할 수 있습니다. 이렇게 하면 외부 네트워크를 고정 기능 추출기로 사용하거나 적응 설정에서 정규화기 역할을 할 수 있습니다.
원래 네트워크는 현재 정의되는 섹션일 수도 있으며 복제본은 해당 매개 변수를 원본과 공유할 수 있습니다. 이렇게 하면 서로 다른 데이터에서 작동하는 네트워크를 통해 여러 동일한 경로가 허용됩니다. 예를 들어 두 입력의 유사성을 대칭적으로 비교하는 설정의 경우 기능 추출 계층이 두 입력에 대해 공유되고 공동으로 학습됩니다. 그러나 원래 네트워크 섹션에 되풀이 루프가 포함된 경우에는 현재 작동하지 않습니다.
복사할 섹션은 입력 및 출력 노드에 의해 정의됩니다. 복제할 하위 섹션 주위에 선이 그려지는 네트워크 플롯을 Imagine. 그런 다음, 줄로 표시된 이 섹션은 선을 가로지르는 모든 연결을 전달하여 표시된 영역을 매개 변수로 inputNodes 입력하고 모든 연결이 .로 outputNodes나가면 지정됩니다. CloneFunction() 에서는 이 섹션을 BrainScript 함수에 추출하고, 매개 변수 수는 개수 inputNodes와 같고 출력은 단일 노드 또는 노드 사전입니다.
학습 가능한 매개 변수를 .로 inputNodes나타낼 수도 있습니다. 이 경우 새 매개 변수를 만드는 BrainScript 함수 CloneFunction() 의 인수로 대체할 수 있습니다. 함수를 복사하지만 매개 변수를 처음부터 알아보려면 이 작업을 수행합니다. 이 경우 차원을 변경할 수도 있습니다.
예제 사용 사례:
- 적응(KL): 시작 모델의 고정된 읽기 전용 복사본이 KL-regularizer로 사용됩니다.
- 적응(FDLR): 네트워크가 고정된 동안 삽입된 입력 변환이 학습됩니다.
- 이미지: ImageNet 네트워크의 하위 계층은 다른 이미지 작업에 대한 변경할 수 없는 기능 추출기 역할을 합니다.
- DSSM: 두 입력에 동일한 네트워크 하위 섹션 적용
및 노드 이름 .[ 에 대한 문제 ]
해당 문자를 _포함 . 하거나 []대체한 네트워크의 노드를 참조하려면 .
예를 들어 호출 result.znetwork.result.z 된 노드가 포함된 경우 network 실패합니다. 대신 다음과 같이 말합니다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)