다음을 통해 공유


함수 복제

모델 네트워크의 일부를 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)